0Pricing
Learn AI with Python · レッスン

ターゲットエンコーディングと高度なカテゴリ処理

ターゲットエンコーディング、頻度エンコーディング、バイナリエンコーディング、高カーディナリティ列の埋め込みを扱います。

「ターゲットエンコーディングと高度なカテゴリ処理」は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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 特徴量選択の手法
  2. 交互作用特徴量と多項式特徴量の作成
  3. ターゲットエンコーディングと高度なカテゴリ処理
  4. Featuretoolsによる自動特徴量エンジニアリング
← Learn AI with Pythonに戻る