🙂

特徴量の前処理:ワンホットエンコーディングとカテゴリエンコーディング

2024/01/07に公開

商品カテゴリやタイプなどは、機械学習にかける前に、エンコーディングが必要となってきます。これにより、文字列を数値に置き換えて処理しやすくします。
エンコーディングによくつかわれる2つのタイプについて、説明します。

ワンホットエンコーディング:

各カテゴリを独立した列として表現し、該当するカテゴリに1、それ以外に0を割り当てます。

  • 適用例: カテゴリ間に順序関係がない場合、特に機械学習モデルでカテゴリの重要度を個別に評価する必要がある場合に適しています。
  • コード: pd.get_dummies(data)
train_df = pd.get_dummies(train_df, columns=['family'])

【処理後例 familyが複数カラムに分かれる】

カテゴリエンコーディング (例: OrdinalEncoder):

カテゴリを整数値に変換します。

  • 適用例: カテゴリ数が多く、ワンホットエンコーディングによる次元の増加を避けたい場合や、順序関係がある場合に適しています。
  • コード: OrdinalEncoder().fit_transform(data)
import category_encoders as ce
list_cols = ['family']
encoder = ce.OrdinalEncoder(cols=list_cols, handle_unknown='impute')
# エンコーディングを適用
train_df = encoder.fit_transform(train_df)

【処理後例 familyカラムのまま、数値化】

なお、上記はcategory_encodersライブラリを使ったコード例となります。ほかにも、下記の方法があります。

  • Pandasのfactorize関数: これはカテゴリカル変数を整数値に変換する簡単な方法です。
  • Scikit-learnのLabelEncoder: これはカテゴリカル変数を整数値に変換するためによく使用されますが、ターゲット変数(予測する変数)のエンコーディングに適しています。出力は1次元配列です。
  • Scikit-learnのOrdinalEncoder: 複数のカテゴリカル特徴を同時に整数値に変換するために使用されます。複数のカラムを同時に変換でき、各カテゴリに固有の整数を割り当てます。出力は2次元配列(データフレーム)です。

Discussion