Kaggle Tutorial

カテゴリ変数エンコーディング

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 内(out-of-fold) で計算し、平滑化(スムージング)も併用しましょう。

# 概念: 各 fold の検証行には、訓練側だけで計算した平均を当てる(OOF)
# 実装は category_encoders.TargetEncoder などを CV と組み合わせて使う

得られた OOF のターゲットエンコード値を特徴として使うと、リークを抑えられます。

木系か線形かで選ぶ#

  • GBDT(木系):ラベル/Frequency/Target が好相性(One-Hot は列が増えて非効率になりがち)
  • 線形モデル:One-Hot が基本

理解度チェック#

Quizターゲットエンコーディングでリークを避ける正しい方法は?

次のステップ#

次は、数値特徴の変換(スケーリング・ビニング・対数/Box-Cox・交互作用)を学びます。