機械学習のデータ前処理:One-Hot EncodingとLabel Encodingを解説

機械学習のデータ前処理:One-Hot EncodingとLabel Encodingを解説

機械学習において、データの前処理はモデルの精度を大きく左右します。その中でも、カテゴリデータを数値データに変換する方法として、「One-Hot Encoding」と「Label Encoding」が頻繁に使用されます。本記事では、これらの手法を具体例とともに解説します。Pythonコードを交えながら、初心者にも理解しやすい内容を目指します。

One-Hot Encodingとは?

One-Hot Encodingは、カテゴリデータを「0」と「1」で表現する方法です。それぞれのカテゴリを専用のビット(列)として扱い、その列に1を割り当てることで表現します。

具体例:フルーツのカテゴリ

例えば、「Apple」「Banana」「Cherry」という3種類のフルーツのデータがあるとします。

フルーツ
Apple
Banana
Cherry
Apple

これをOne-Hot Encodingで変換すると、以下のようになります。

AppleBananaCherry
100
010
001
100

Pythonコード例

以下のコードは、pandasを用いてOne-Hot Encodingを実行する方法を示しています。

import pandas as pd

# データの準備
data = {'Fruit': ['Apple', 'Banana', 'Cherry', 'Apple']}
df = pd.DataFrame(data)

# One-Hot Encoding
df_encoded = pd.get_dummies(df, columns=['Fruit'])

print(df_encoded)

出力結果:

   Fruit_Apple  Fruit_Banana  Fruit_Cherry
0            1             0             0
1            0             1             0
2            0             0             1
3            1             0             0

Label Encodingとは?

Label Encodingは、カテゴリデータを整数値に変換する手法です。各カテゴリに一意の整数を割り当てます。

具体例:動物のカテゴリ

例えば、「Cat」「Dog」「Rabbit」というカテゴリがある場合:

動物
Cat
Dog
Rabbit
Cat

これをLabel Encodingで変換すると、以下のようになります:

動物エンコード値
Cat0
Dog1
Rabbit2
Cat0

Pythonコード例

以下は、sklearnLabelEncoderを使用した例です。

from sklearn.preprocessing import LabelEncoder

# データの準備
data = ['Cat', 'Dog', 'Rabbit', 'Cat']

# Label Encoding
label_encoder = LabelEncoder()
encoded_data = label_encoder.fit_transform(data)

print(encoded_data)

出力結果:

[0 1 2 0]

One-Hot EncodingとLabel Encodingの使い分け

これら2つの手法は、それぞれ異なる用途に適しています。

One-Hot Encodingが適している場合

  • カテゴリに順序がない場合(例:「色」や「フルーツの種類」)。
  • 機械学習モデルがカテゴリ間の相対的な距離を考慮しない場合。

Label Encodingが適している場合

  • カテゴリに順序がある場合(例:「低・中・高」や「サイズ(S, M, L)」)。
  • メモリ使用量を抑えたい場合。

他のカテゴリエンコーディング手法

以下は、One-Hot EncodingとLabel Encoding以外のエンコーディング手法です。

1. Target Encoding

各カテゴリに対応する目的変数の平均値を割り当てる手法です。

Pythonコード例

import pandas as pd

# データの準備
data = {'Category': ['A', 'B', 'A', 'C', 'B', 'C'],
        'Target': [10, 20, 15, 25, 30, 35]}
df = pd.DataFrame(data)

# Target Encoding
target_mean = df.groupby('Category')['Target'].mean()
df['Category_Encoded'] = df['Category'].map(target_mean)

print(df)

出力結果:

  Category  Target  Category_Encoded
0        A      10              12.5
1        B      20              25.0
2        A      15              12.5
3        C      25              30.0
4        B      30              25.0
5        C      35              30.0

2. Frequency Encoding

カテゴリの出現頻度を数値として割り当てます。

Pythonコード例

# Frequency Encoding
freq = df['Category'].value_counts(normalize=True)
df['Category_Encoded'] = df['Category'].map(freq)

print(df)

出力結果:

  Category  Target  Category_Encoded
0        A      10              0.333333
1        B      20              0.333333
2        A      15              0.333333
3        C      25              0.333333
4        B      30              0.333333
5        C      35              0.333333

エンコーディング手法選択の注意点

エンコーディング手法を選択する際は、以下の点に注意してください:

  1. モデルの種類に応じた選択
    • 決定木ベースのモデル(例:Random ForestやXGBoost)では、Label Encodingでも問題ありません。
    • 線形モデルやニューラルネットワークでは、One-Hot Encodingが適しています。
  2. カテゴリ数
    • One-Hot Encodingはカテゴリ数が多いとデータが膨大になりやすい。
  3. 目的変数との関係
    • Target Encodingはリークのリスクがあるため、クロスバリデーションを考慮して適用する必要があります。

結論

本記事では、One-Hot EncodingとLabel Encodingの基本から、それらの使い分け、さらに他のエンコーディング手法までを解説しました。それぞれの手法の特性を理解し、適切に選択することで、モデルの精度向上を目指しましょう。