Count / Frequency Encoding

Prep

Count / Frequency Encoding

概要 #

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" にして平均頻度を代入する等

典型的なユースケース #

  1. 大量カテゴリだが、ターゲットとの相関は弱そうなとき
    例: 「町名」「商品ID」など。Count Encoding でベースラインを作り、重要度が高い列だけ Target Encoding へ切り替える。

  2. 数値特徴量との交互作用を作りたいとき
    Count Encoding した列と、売上やアクセス数などを掛け合わせることで「カテゴリ別トラフィック重み付き特徴量」を作成。

  3. データリークを避けたいとき
    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 するなど)。