get_dummiesで生成された結果がすべてブール値になる問題の解決

データ処理を行っている際に、pandasのget_dummies()メソッドを使って離散的な文字列型の特徴量にone-hotエンコーディングを適用したところ、0や1ではなくTrueとFalseのブール値で出力されてしまう問題に遭遇しました。解決方法を調査し、問題を解消したため記録します。

one-hotエンコーディングは、カテゴリ型の特徴量を数値化するための一般的な手法です。この方法では、N種類のカテゴリを持つ特徴に対してN個のバイナリ特徴を生成します。各カテゴリは、対応するビットのみが1でそれ以外が0となる形で表現されます。

たとえば、「性別」という特徴で["男", "女"]がある場合、通常は次のように変換されます:

男 → [1, 0]
女 → [0, 1]

このようにして、文字列型の特徴を機械学習モデルが扱える数値型の特徴に変換します。

pandasでは、get_dummies()関数を使ってone-hotエンコーディングを実行できます。その基本的な構文は以下の通りです:

pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False, dtype=None)

サンプルコード:

import pandas as pd

df = pd.DataFrame([
    ['zhang', 'A'],
    ['wang', 'B']
])

df.columns = ['name', 'gender']
pd.get_dummies(df)

特定の列だけにエンコーディングを適用する場合は以下のようにします:

pd.get_dummies(df, columns=['name', 'gender'])

このようにcolumnsパラメータで列名を指定すれば、特定の列に対してone-hotエンコーディングを実行できます。ただし、出力結果には指定した列のみが含まれるため、元のデータフレームから該当列を削除して結合する必要があります。

pandasのバージョン1.6.0以降では、get_dummies()の戻り値がnumpy.bool_型になる仕様変更が行われました。これは、符号なし整数型を使うことで予期しないエラーが発生する可能性があるという議論に基づくものです。

この変更により、機械学習モデルへの入力として適切でなくなる可能性があるため、必要に応じてdtype引数でint型を指定して変換します:

pd.get_dummies(df, columns=['name', 'gender'], dtype=int)

これにより、True/Falseではなく0/1の整数値で結果を得ることができます。

補足:カテゴリ値の種類が多すぎる場合、one-hotエンコーディングによって特徴量の次元が膨大になる問題があります。その対処法については、次回の記事で解説します。

タグ: Pandas one-hot-encoding data-preprocessing machine-learning Python

6月1日 00:30 投稿