AI資格ドリル
資格を選ぶ

用語比較

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_dummiesOneHotEncoder
所属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

ほかの資格を含む参考書・問題集の一覧を見る

どこで迷っているかを切り分ける

01

DataFrame の文字列の列を、手早く 0/1 の列にしたい人

get_dummies に DataFrame を渡します。columns を指定しなければ、object・string・category の列がすべて変換され、ほかの列はそのまま残ります。

02

モデルに入れる前の変換を、パイプラインに組み込みたい人

OneHotEncoder を使います。変換器なので fit と transform で使え、公式は線形モデルや標準カーネルの SVM に、カテゴリのデータを渡すために必要な変換だと説明しています。

03

本番のデータに、学習時にはなかった値が来て落ちた人

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. 1

    変換の場面を確認する

    データを見て手早く 0/1 の列にするなら get_dummies。モデルの前処理として、訓練とテストで同じ変換をするなら OneHotEncoder。

  2. 2

    新しいデータの扱いを確認する

    未知のカテゴリが現れる可能性があるなら、OneHotEncoder の handle_unknown を決めます。

  3. 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 の選択肢を言える
  • 訓練とテストで列がずれる場面を説明できる
  • それぞれの既定の出力の型を言える

同じ資格で次に知りたいこと

よくある質問

Qget_dummies と OneHotEncoder の違いは?

A

get_dummies は pandas の関数で、渡したデータを 0/1 の列にします。OneHotEncoder は scikit-learn の変換器で、fit でカテゴリを求め、transform で同じ変換を新しいデータに行います。

Q未知のカテゴリが来たらどうなりますか?

A

OneHotEncoder は既定で例外になり、handle_unknown='ignore' ならその特徴量の列がすべて 0 になります。

Q1列減らして共線性を避けるには?

A

get_dummies は drop_first=True、OneHotEncoder は drop を指定します。公式は、完全な共線性が問題になる場面で有用だと説明しています。

Qデータ分析試験の範囲?

A

本サイトの第6章scikit-learnの「変換器とパイプライン」で扱います。出題の形式や範囲は、受験前に公式の案内で確認してください。

次に見る比較

執筆: AI資格ドリル編集部(運営者情報を見る)