Shikata Ga Nai

Private? There is no such things.

13. データの前処理③ 〜カテゴリ変数のエンコーディング手法〜

Hello there, ('ω')ノ

📌 1. カテゴリ変数とは?

カテゴリ変数とは、いくつかのグループに分類されるデータ です。
例えば、以下のようなデータがカテゴリ変数に該当します。

ID 性別(Sex) 乗船地(Embarked) 乗客クラス(Pclass)
1 male S 3
2 female C 1
3 female Q 2

機械学習モデルは数値データしか扱えない ため、これらのカテゴリ変数を適切に数値変換(エンコーディング) する必要があります!


📌 2. エンコーディングの種類と使い分け

カテゴリ変数のエンコーディング方法は、以下のように分類できます。

手法 特徴 使いどころ
Label Encoding 各カテゴリを整数に変換 カテゴリに順序がある場合
One-Hot Encoding ダミー変数を作成(0/1) カテゴリ数が少ない場合
Target Encoding 目的変数の平均値を使用 カテゴリ数が多い場合

適切な手法を選ぶことで、モデルの精度を向上させることができます!


📌 3. Label Encoding(ラベルエンコーディング)

カテゴリを整数に変換 する最もシンプルな方法です。

✅ 実装(性別を数値化)

import pandas as pd
from sklearn.preprocessing import LabelEncoder

# データ準備
df = pd.DataFrame({"Sex": ["male", "female", "female", "male", "male"]})

# Label Encodingの適用
le = LabelEncoder()
df["Sex_encoded"] = le.fit_transform(df["Sex"])

print(df)

🔍 出力結果

      Sex  Sex_encoded
0    male           1
1  female           0
2  female           0
3    male           1
4    male           1

メリット: シンプルで簡単
デメリット: 「male=1」「female=0」のように、数値に意味を持たせてしまうリスク あり
カテゴリに「順序」がない場合は、One-Hot Encodingの方が適切!


📌 4. One-Hot Encoding(ワンホットエンコーディング)

カテゴリ変数を複数の列に分割し、0/1で表現する 方法です。

✅ 実装(乗船地をOne-Hot Encoding)

# データ準備
df = pd.DataFrame({"Embarked": ["S", "C", "Q", "S", "C"]})

# One-Hot Encodingの適用
df = pd.get_dummies(df, columns=["Embarked"], drop_first=True)

print(df)

🔍 出力結果

   Embarked_Q  Embarked_S
0           0           1
1           0           0
2           1           0
3           0           1
4           0           0

メリット: モデルがカテゴリの違いを正しく学習できる
デメリット: カテゴリ数が多すぎると、列が増えすぎてしまう(「次元の呪い」
カテゴリが多い場合は、Target Encodingを検討!


📌 5. Target Encoding(ターゲットエンコーディング)

カテゴリごとに「目的変数の平均値」を使う手法 です。
例えば、Titanicデータセットでは、乗船地(Embarked)ごとの生存率を計算し、その値で置き換えます。

✅ 実装(Embarkedをターゲットエンコーディング)

# データ準備
df = pd.DataFrame({
    "Embarked": ["S", "C", "Q", "S", "C"],
    "Survived": [0, 1, 1, 0, 1]  # 目的変数
})

# 各カテゴリの平均生存率を計算
target_mean = df.groupby("Embarked")["Survived"].mean()

# 変換
df["Embarked_encoded"] = df["Embarked"].map(target_mean)

print(df)

🔍 出力結果

  Embarked  Survived  Embarked_encoded
0        S         0              0.0
1        C         1              1.0
2        Q         1              1.0
3        S         0              0.0
4        C         1              1.0

メリット: カテゴリ数が多くても次元が増えない
デメリット: 「データリーク」 のリスクがある(訓練データだけで計算し、テストデータに適用する工夫が必要)

カテゴリが多い場合や、One-Hot Encodingが使えない場合に有効!


📌 6. エンコーディング手法の選び方

どの方法を使うべきか?カテゴリの種類に応じて適切な手法を選びましょう!

手法 使うべきケース
Label Encoding カテゴリに「順序」がある場合(例: 小・中・大)
One-Hot Encoding カテゴリ数が少なく、順序がない場合(例: 男・女)
Target Encoding カテゴリ数が多い場合(例: 国名、商品カテゴリ)

順序があるなら「Label Encoding」
カテゴリが少なければ「One-Hot Encoding」
カテゴリが多ければ「Target Encoding」

データの特性に応じて、適切な方法を選ぼう!


🎯 まとめ

カテゴリ変数をそのまま機械学習モデルに使うことはできない!
エンコーディング手法には「Label Encoding」「One-Hot Encoding」「Target Encoding」などがある!
データの特性に応じて、最適なエンコーディングを選ぶことが重要!

Best regards, (^^ゞ