用語比較
get_dummiesとOneHotEncoderの違い|pandasとscikit-learnのワンホット変換
get_dummies は pandas の関数で、カテゴリの列を、値の種類の数だけの 0/1 の列に変換します。OneHotEncoder は scikit-learn の変換器で、同じワンホット変換を fit と transform の形で行います。
違いが出るのは、新しいデータに訓練時にはなかったカテゴリが現れたときです。変換器は fit で覚えたカテゴリを使い、その扱いを handle_unknown で選べます。
この記事の目次
この記事の根拠と出典
各セクションの見出しの下に、公式資料で確認した内容か編集部の整理かをラベルで示しています。 試験日・料金・申込条件・試験方式は変わることがあるため、申込前に公式サイトで確認してください。
get_dummiesとOneHotEncoderの要点
get_dummies
公式の説明は「カテゴリ変数をダミー変数(指標変数)に変換する」。渡したデータの値から列を作り、DataFrame では元の列名を先頭に付ける。
OneHotEncoder
カテゴリ特徴量をワンホットの数値配列に符号化する変換器。fit でカテゴリを求め、categories_ に保存する。
違いを表で確認
| 比較軸 | get_dummies | OneHotEncoder |
|---|---|---|
| 所属 | pandas の関数。Series や DataFrame を渡して DataFrame を受け取る | scikit-learn の変換器。fit と transform で使い、パイプラインに入れられる |
| 列にするカテゴリの決め方 | 渡したデータの値から決める。NA は既定ではすべて 0 で、dummy_na=True なら NaN 用の列を追加する | categories で決める。既定の 'auto' は訓練データの一意な値から決め、リストで手動指定もできる |
| 未知のカテゴリ | 渡したデータにある値から列を作る。fit の仕組みはない | handle_unknown の既定は 'error' で、transform 時の未知のカテゴリは例外。'ignore' なら、その特徴量の列はすべて 0 |
| 出力の型 | 既定では bool の列を持つ DataFrame。sparse と dtype で変えられる | 既定では SciPy の疎行列(CSR)。sparse_output=False で密な配列、dtype の既定は float64 |
Python3エンジニア認定データ分析試験の学習に使う書籍(Amazon)
PRどこで迷っているかを切り分ける
DataFrame の文字列の列を、手早く 0/1 の列にしたい人
get_dummies に DataFrame を渡します。columns を指定しなければ、object・string・category の列がすべて変換され、ほかの列はそのまま残ります。
モデルに入れる前の変換を、パイプラインに組み込みたい人
OneHotEncoder を使います。変換器なので fit と transform で使え、公式は線形モデルや標準カーネルの SVM に、カテゴリのデータを渡すために必要な変換だと説明しています。
本番のデータに、学習時にはなかった値が来て落ちた人
OneHotEncoder の handle_unknown の既定は 'error' です。'ignore' を指定すると、未知のカテゴリは、その特徴量の列がすべて 0 になります。
具体例で使い分ける
例 1
get_dummies: Series を 0/1 の列にする
公式の例のとおり、s = pd.Series(list('abca')) に pd.get_dummies(s) を行います。
- 列 a、b、c ができます。0 行目は a だけが True、1 行目は b だけが True です。
- drop_first=True を指定すると、最初の水準を除いた k-1 列になります。Series(list('abcaa')) では列 b と c だけが残ります。
結論: get_dummies は、値の種類の数だけの列を作る。drop_first で1列減らせる。
例 2
get_dummies: 欠損値の扱い
公式の例のとおり、s1 = ['a', 'b', np.nan] に get_dummies を行います。
- 既定では、列 a、b ができ、
NaNの行は両方 False になります。 - dummy_na=True を指定すると、列
NaNが追加され、その行だけ True になります。
結論: 欠損を区別したいときは dummy_na=True を使う。
例 3
OneHotEncoder: 未知のカテゴリの扱い
公式の handle_unknown の説明のとおり、fit のあとの transform に、訓練データになかったカテゴリが含まれる場合を考えます。
- 既定の 'error' では、例外が発生します。
- 'ignore' では、その特徴量のワンホットの列がすべて 0 になります。
結論: OneHotEncoder は、未知のカテゴリへの対処を引数で選べる。
問題文から答えを選ぶ手順
- 1
変換の場面を確認する
データを見て手早く 0/1 の列にするなら get_dummies。モデルの前処理として、訓練とテストで同じ変換をするなら OneHotEncoder。
- 2
新しいデータの扱いを確認する
未知のカテゴリが現れる可能性があるなら、OneHotEncoder の handle_unknown を決めます。
- 3
出力の型を確認する
列名の付いた DataFrame が欲しければ get_dummies。OneHotEncoder は疎行列が既定なので、密な配列にするなら sparse_output=False を指定します。
試験での見分け方
- 1get_dummies は、カテゴリ変数をダミー変数に変換する pandas の関数。
- 2get_dummies は、既定では NA をすべて 0 にし、dummy_na=True で
NaN用の列を足す。 - 3OneHotEncoder は fit でカテゴリを求め、categories_ に保存する。
- 4OneHotEncoder の handle_unknown の既定は 'error'。'ignore' なら未知のカテゴリは全部 0 になる。
- 5どちらも drop_first(drop)で、水準を1つ除ける。
誤答しやすい選択肢
get_dummies も、未知のカテゴリを自動で 0 にしてくれると考える
修正: get_dummies は渡したデータの値から列を作るため、訓練とテストを別々に変換すると列がずれることがあります。そろえたいときは OneHotEncoder で fit したカテゴリを使います。
OneHotEncoder は既定で DataFrame を返すと考える
修正: 公式では sparse_output の既定が True で、SciPy の疎行列(CSR)を返します。
NA は get_dummies で自動的に1つの列になると考える
修正: 既定の dummy_na=False では NA はすべて 0 になります。列にするには dummy_na=True を指定します。
確認問題
Q1pd.get_dummies で NaN 用の列を追加する引数は?
答え: dummy_na=True
公式は、True なら NaN がなくても NaN の列を追加し、False なら NA はすべて 0 になると説明しています。
Q2OneHotEncoder の handle_unknown の既定値は?
答え: 'error'
transform 時に未知のカテゴリがあると例外になります。'ignore' ならその特徴量の列がすべて 0 になります。
Q3pd.get_dummies(pd.Series(list('abcaa')), drop_first=True) に残る列は?
答え: b と c
公式の例の結果です。最初の水準 a が除かれ、k-1 列になります。
Q4OneHotEncoder の既定の出力の型は?
答え: SciPy の疎行列(CSR 形式)
sparse_output の既定が True です。密な配列にするには False を指定します。
到達チェック
- get_dummies の dummy_na と drop_first を言える
- OneHotEncoder の handle_unknown の選択肢を言える
- 訓練とテストで列がずれる場面を説明できる
- それぞれの既定の出力の型を言える
関連ページで確認する
同じ資格で次に知りたいこと
- GridSearchCVとRandomizedSearchCVの違い|全探索とランダム探索(Python3データ分析)
scikit-learnのGridSearchCVとRandomizedSearchCVの違いを、探索の方法、試す回数、パラメータの渡し方、再現性で整理します。公式の説明で照合した確認問題つき。
- astypeとto_numericの違い|変換できない値の扱いとerrors(pandas・Python3データ分析)
pandasのastypeとto_numericの違いを、変換できる型、変換できない文字列の扱い(errors='coerce')、downcastで整理します。pandas公式で照合した例と確認問題つき。
- predictとpredict_probaの違い|クラスのラベルと確率(Python3データ分析)
scikit-learnの分類器のpredictとpredict_probaの違いを、返す値、配列の形、列の並び順、decision_functionとの関係で整理します。LogisticRegressionの公式の例で照合した確認問題つき。
よくある質問
Qget_dummies と OneHotEncoder の違いは?
get_dummies は pandas の関数で、渡したデータを 0/1 の列にします。OneHotEncoder は scikit-learn の変換器で、fit でカテゴリを求め、transform で同じ変換を新しいデータに行います。
Q未知のカテゴリが来たらどうなりますか?
OneHotEncoder は既定で例外になり、handle_unknown='ignore' ならその特徴量の列がすべて 0 になります。
Q1列減らして共線性を避けるには?
get_dummies は drop_first=True、OneHotEncoder は drop を指定します。公式は、完全な共線性が問題になる場面で有用だと説明しています。
Qデータ分析試験の範囲?
本サイトの第6章scikit-learnの「変換器とパイプライン」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。
次に見る比較
- G検定・DS検定・統計検定2級で重なる用語10語の比較
同じ名前の用語の定義と収録章を、資格ごとに並べます。
- ベイズの定理と条件付き確率の違い(統計検定2級の式と計算例)
求める確率の向きの違いと、陽性になる確率の計算例を確かめます。
- 紛らわしい用語ペア早見表
混同しやすい用語の違いと判定の手掛かりを、資格別の一覧で確かめます。
執筆: AI資格ドリル編集部(運営者情報を見る)
