「人口総数」を予測したいとして、「元号」をエンコードしたいとします。
import pandas as pd
X = pd.read_csv("../data/sample.csv")
TARGET_NAME = "人口総数"
FEATURE_NAME = "元号"
X.head()
元号 | 和暦 | 西暦 | 人口総数 | 町名 | |
---|---|---|---|---|---|
0 | 大正 | 9.0 | 1920.0 | 394748 | A町 |
1 | 大正 | 9.0 | 1920.0 | 31421 | B町 |
2 | 大正 | 9.0 | 1920.0 | 226993 | C町 |
3 | 大正 | 9.0 | 1920.0 | 253689 | D町 |
4 | 大正 | 9.0 | 1920.0 | 288602 | E町 |
from category_encoders.target_encoder import TargetEncoder
c_te = TargetEncoder()
y = X[TARGET_NAME]
X[f"{FEATURE_NAME}_te"] = c_te.fit_transform(X[FEATURE_NAME], y)
カテゴリ変数の列が TargetEncoder
でエンコードされていることを確認します。
この方法は、目的変数の平均値をそのままエンコードに使用します。つまり、あるデータをエンコードするためにそのデータの目的変数の情報を使用しています(leakage[1]と呼びます)。そのため、データ数が少ない場合は特に、実際に将来のデータに対して予測した場合とCVで評価した場合を比較すると、CV時に誤差が少なく見積もられる可能性がある点に注意して下さい。
[1] Kaufman, Shachar, et al. “Leakage in data mining: Formulation, detection, and avoidance.” ACM Transactions on Knowledge Discovery from Data (TKDD) 6.4 (2012): 1-21.
X[[FEATURE_NAME, f"{FEATURE_NAME}_te"]]
元号 | 元号_te | |
---|---|---|
0 | 大正 | 144791.552083 |
1 | 大正 | 144791.552083 |
2 | 大正 | 144791.552083 |
3 | 大正 | 144791.552083 |
4 | 大正 | 144791.552083 |
... | ... | ... |
975 | 平成 | 100294.140000 |
976 | 平成 | 100294.140000 |
977 | 平成 | 100294.140000 |
978 | 平成 | 100294.140000 |
979 | 平成 | 100294.140000 |
980 rows × 2 columns
元号ごとのターゲットの平均値を用いてエンコードされていることを確認します
X.groupby(FEATURE_NAME).agg("mean")[TARGET_NAME]
元号
大正 144791.552083
平成 100294.140000
昭和 108003.279110
Name: 人口総数, dtype: float64