概要 #
Count Encoding(Frequency Encoding)は、各カテゴリの出現回数や出現確率を数値として付与する手法です。ワンホットより低次元で、カテゴリの人気度を暗に表現できるため、LightGBM や XGBoost などの木モデルでよく使われます。
特徴 #
- 利点: 次元数が 1 列で済み、学習・推論が高速。カテゴリ間の頻度差をヒューリスティックに取り込める。
- 欠点: 頻度=目的変数との関連とは限らないため、情報が足りない場合は Target Encoding などと組み合わせる。
実装レシピ #
import pandas as pd
from category_encoders.count import CountEncoder
df = pd.read_csv("../data/sample.csv")
target_col = "人口総数"
cat_col = "元号"
ce = CountEncoder(normalize=True) # True にすると 0〜1 に正規化
df[f"{cat_col}_freq"] = ce.fit_transform(df[cat_col], df[target_col])
df[[cat_col, f"{cat_col}_freq"]].head()
主要オプション #
| パラメータ | 意味 | 推奨値 |
|---|---|---|
normalize | 出現回数をそのまま使うか、全体で割って確率にするか | 次元スケールを合わせたい場合は True |
min_group_size | 少数カテゴリをまとめる閾値 | データ量が偏る場合に活用 |
handle_unknown | 未知カテゴリをどう扱うか | "value" にして平均頻度を代入する等 |
典型的なユースケース #
大量カテゴリだが、ターゲットとの相関は弱そうなとき
例: 「町名」「商品ID」など。Count Encoding でベースラインを作り、重要度が高い列だけ Target Encoding へ切り替える。数値特徴量との交互作用を作りたいとき
Count Encoding した列と、売上やアクセス数などを掛け合わせることで「カテゴリ別トラフィック重み付き特徴量」を作成。データリークを避けたいとき
Target Encoding と違い、目的変数を直接参照しないためリークリスクが低い。
モデル学習での扱い #
from sklearn.model_selection import KFold, cross_val_score
from lightgbm import LGBMRegressor
X = df[[f"{cat_col}_freq", "西暦"]]
y = df[target_col]
est = LGBMRegressor(random_state=0)
scores = cross_val_score(est, X, y, cv=KFold(n_splits=5, shuffle=True, random_state=0))
print(scores.mean())
Count Encoding 列は 1 本なので、そのままモデルに渡すだけで済みます。パイプラインの一部に category_encoders を入れておくと、本番環境での再現性も担保しやすくなります。
品質チェックリスト #
- カテゴリの分布が極端ではないか?(大半が同一カテゴリなら効果が薄い)
- Count と Frequency のどちらがモデルに合うか、バリデーションで確認したか?
- 未知カテゴリや欠損(NaN)に対する挙動をテストしたか?
- 重要度が高かった場合、追加で Target Encoding や平均ターゲットとの比較を試したか?
参考 #
- category_encoders.count.CountEncoder
- 実プロジェクトでは Count Encoding + Target Encoding のハイブリッドを試す価値が高い(Count をベースに、上位カテゴリだけ Target Encoding するなど)。