カテゴリ変数エンコーディング
Label / One-Hot / Ordinal / Frequency / Target エンコーディングの特徴と、リークを避けた使い方を学びます。
なぜエンコードが必要か#
多くのモデルは数値しか扱えないため、カテゴリ変数を数値へ変換(エンコード)します。 手法ごとに向き・不向きがあります。
主なエンコーディング#
| 手法 | 概要 | 向いている場面 |
|---|---|---|
| ラベルエンコーディング | 各水準に整数を割当 | 木系モデル(GBDT) |
| ワンホットエンコーディング | 水準ごとに 0/1 列 | 線形モデル・水準が少ない |
| Ordinal(順序) | 順序のある水準に大小付き整数 | 「低/中/高」など順序がある |
| Frequency(出現頻度) | 各水準の出現回数/割合 | 高カーディナリティ |
| ターゲットエンコーディング | 目的変数の平均などで数値化 | 高カーディナリティで強力 |
# ラベル / ワンホット
from sklearn.preprocessing import LabelEncoder
df["Sex_le"] = LabelEncoder().fit_transform(df["Sex"])
ohe = pd.get_dummies(df["Embarked"], prefix="Emb")
# Frequency エンコーディング
freq = df["Ticket"].value_counts(normalize=True)
df["Ticket_freq"] = df["Ticket"].map(freq)ターゲットエンコーディングはリークに注意#
ターゲットエンコーディングは強力ですが、目的変数を使うため最もリークしやすい手法です。
注意
# 概念: 各 fold の検証行には、訓練側だけで計算した平均を当てる(OOF)
# 実装は category_encoders.TargetEncoder などを CV と組み合わせて使う得られた OOF のターゲットエンコード値を特徴として使うと、リークを抑えられます。
木系か線形かで選ぶ#
- GBDT(木系):ラベル/Frequency/Target が好相性(One-Hot は列が増えて非効率になりがち)
- 線形モデル:One-Hot が基本
理解度チェック#
次のステップ#
次は、数値特徴の変換(スケーリング・ビニング・対数/Box-Cox・交互作用)を学びます。