ターゲットエンコーディングと高度なカテゴリ処理
ターゲットエンコーディング、頻度エンコーディング、バイナリエンコーディング、高カーディナリティ列の埋め込みを扱います。
「ターゲットエンコーディングと高度なカテゴリ処理」はCoddyKit上の無料Learn AI with Pythonレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn AI with Python学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn AI with Pythonコースには全4レッスンが含まれています。
カテゴリカルエンコーディングの問題
モデルには数値が必要ですが、カテゴリはテキストです。カテゴリが少ない場合はワンホットエンコーディングが適していますが、高カーディナリティの特徴量(数千の都市や商品など)では列が増えすぎます。
ワンホットエンコーディングとラベルエンコーディングの限界
ワンホットエンコーディングは次元数を爆発させます。単純なラベルエンコーディングは、存在しない順序関係を作ってしまいます(都市5が都市2より大きいわけではありません)。高カーディナリティのデータには、より賢いエンコーディングが必要です。
ターゲットエンコーディングとは
ターゲットエンコーディングは、各カテゴリを、そのカテゴリにおけるターゲットの平均値に置き換えます。たとえば都市を、その都市の顧客の平均解約率という、情報量のある1つの数値に変換します。
import pandas as pd
means = df.groupby("city")["target"].mean()
df["city_encoded"] = df["city"].map(means)過学習の危険性
データ数が少ない希少カテゴリでは、極端な平均値が得られ、ターゲットのリークや過学習につながります。1回しか登場しないカテゴリは、その1件のラベルをそのままコピーしてしまいます。これを平滑化によって防ぎます。
推定値の平滑化
平滑化では、カテゴリのサンプル数に応じて、カテゴリ平均と全体平均を組み合わせます。サンプル数の少ないカテゴリほど全体平均に近づけることで、分散を抑えます。
import pandas as pd
global_mean = df["target"].mean()
agg = df.groupby("city")["target"].agg(["mean", "count"])
smoothing = 10
agg["enc"] = (agg["count"] * agg["mean"] + smoothing * global_mean) / (agg["count"] + smoothing)
df["city_enc"] = df["city"].map(agg["enc"])category_encodersライブラリ
category_encodersパッケージは、scikit-learn APIでこれらのエンコーダーを実装しています。そのため、パイプラインに組み込み、訓練データとテストデータに一貫して適用できます。
import category_encoders as ce
encoder = ce.TargetEncoder(cols=["city", "product"], smoothing=10)
X_enc = encoder.fit_transform(X_train, y_train)
X_test_enc = encoder.transform(X_test)実践でデータリークを防ぐ
必ず訓練データだけでエンコーダーを学習し、その後で検証データやテストデータを変換してください。さらに、クロスバリデーションまたはアウトオブフォールドエンコーディングを使えば、各行がその行自身を除いたデータによってエンコードされるため、より安全です。
import category_encoders as ce
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression
pipe = make_pipeline(
ce.TargetEncoder(cols=["city"]),
LogisticRegression(),
)
# fit inside CV to encode without leakageバイナリエンコーディング
BinaryEncoderはカテゴリを2進数の桁に変換し、N列ではなくlog2(N)列だけを使用します。ワンホットエンコーディングとターゲットエンコーディングの中間にあたる、コンパクトな方法です。
import category_encoders as ce
encoder = ce.BinaryEncoder(cols=["product_id"])
X_enc = encoder.fit_transform(X_train)
# 256 categories -> 8 binary columnsその他の便利なエンコーダー
category_encodersには、CountEncoder(各カテゴリの出現頻度)、LeaveOneOutEncoder(現在の行を除いたターゲット平均)、CatBoostEncoder(順序付けしたターゲット統計量)も用意されています。
import category_encoders as ce
count_enc = ce.CountEncoder(cols=["city"])
loo_enc = ce.LeaveOneOutEncoder(cols=["city"])高カーディナリティへの対処
カーディナリティが非常に高い場合は、ターゲットエンコーディングやカウントエンコーディングなら1列に圧縮でき、バイナリエンコーディングならコンパクトなまま扱えます。また、出現頻度の低いカテゴリを「other」バケットにまとめるとノイズを減らせます。カーディナリティとデータリークのリスクに応じて選択してください。
import pandas as pd
freq = df["product"].value_counts()
rare = freq[freq < 20].index
df["product"] = df["product"].replace(rare, "other")エンコーダーの選び方
カテゴリが少ない場合はワンホットエンコーディングを使います。カテゴリが多い木モデルでは、ターゲットエンコーディングまたはCatBoostエンコーディングが適しています。コンパクトさが必要ならバイナリエンコーディングを選びます。必ず訓練データだけで学習し、平滑化またはアウトオブフォールド方式を使ってデータリークを防いでください。
理解度チェック
カテゴリカルデータのエンコーディングに関する知識を確認しましょう。
まとめ
まとめ: ターゲットエンコーディングは、カテゴリをターゲット平均に置き換え、平滑化によって出現頻度の低いカテゴリの影響を抑えます。category_encoders(TargetEncoder、BinaryEncoder、CatBoost/LeaveOneOut)を使い、データリークを防ぐために訓練データだけで学習するか、アウトオブフォールド方式を使ってください。コンパクトなエンコーダーを使えば、ワンホットエンコーディングでは扱いにくい高カーディナリティの特徴量にも対応できます。
よくある質問
「ターゲットエンコーディングと高度なカテゴリ処理」レッスンは無料ですか?
はい。「ターゲットエンコーディングと高度なカテゴリ処理」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn AI with Pythonコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn AI with Pythonコースには全4レッスンが含まれています。
「ターゲットエンコーディングと高度なカテゴリ処理」で何を学びますか?
ターゲットエンコーディング、頻度エンコーディング、バイナリエンコーディング、高カーディナリティ列の埋め込みを扱います。 ブラウザで直接実行するハンズオンコードでLearn AI with Pythonを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Learn AI with Pythonを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLearn AI with Pythonは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ターゲットエンコーディングと高度なカテゴリ処理」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLearn AI with Pythonレッスンでコードを書いて実行できますか?
はい。すべてのLearn AI with Pythonレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 特徴量選択の手法
- 交互作用特徴量と多項式特徴量の作成
- ターゲットエンコーディングと高度なカテゴリ処理
- Featuretoolsによる自動特徴量エンジニアリング