機械学習において、データの前処理はモデルの精度を大きく左右します。その中でも、カテゴリデータを数値データに変換する方法として、「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で変換すると、以下のようになります。
Apple | Banana | Cherry |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 1 |
1 | 0 | 0 |
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で変換すると、以下のようになります:
動物 | エンコード値 |
Cat | 0 |
Dog | 1 |
Rabbit | 2 |
Cat | 0 |
Pythonコード例
以下は、sklearn
のLabelEncoder
を使用した例です。
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
エンコーディング手法選択の注意点
エンコーディング手法を選択する際は、以下の点に注意してください:
- モデルの種類に応じた選択
- 決定木ベースのモデル(例:Random ForestやXGBoost)では、Label Encodingでも問題ありません。
- 線形モデルやニューラルネットワークでは、One-Hot Encodingが適しています。
- カテゴリ数
- One-Hot Encodingはカテゴリ数が多いとデータが膨大になりやすい。
- 目的変数との関係
- Target Encodingはリークのリスクがあるため、クロスバリデーションを考慮して適用する必要があります。
結論
本記事では、One-Hot EncodingとLabel Encodingの基本から、それらの使い分け、さらに他のエンコーディング手法までを解説しました。それぞれの手法の特性を理解し、適切に選択することで、モデルの精度向上を目指しましょう。