Target Encoder

サンプルデータ

「人口総数」を予測したいとして、「元号」をエンコードしたいとします。

import pandas as pd

X = pd.read_csv("../data/sample.csv")
TARGET_NAME = "人口総数"
FEATURE_NAME = "元号"
X.head()
元号和暦西暦人口総数町名
0大正9.01920.0394748A町
1大正9.01920.031421B町
2大正9.01920.0226993C町
3大正9.01920.0253689D町
4大正9.01920.0288602E町

TargetEncoder

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