Ordered Target Statistics

Prokhorenkova, Liudmila, et al. “CatBoost: unbiased boosting with categorical features.” arXiv preprint arXiv:1706.09516 (2017).

サンプルデータ

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

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町

Ordered Target Statistics

from category_encoders.cat_boost import CatBoostEncoder
from sklearn.compose import make_column_transformer

c_ots = CatBoostEncoder()

y = X[TARGET_NAME]
X[f"{FEATURE_NAME}_ots"] = c_ots.fit_transform(X[FEATURE_NAME], y)

結果を確認する

カテゴリ変数の列が CatBoostEncoder でエンコードされていることを確認します。

X[[FEATURE_NAME, f"{FEATURE_NAME}_ots"]]
元号元号_ots
0大正109247.087755
1大正251997.543878
2大正178472.029252
3大正190602.271939
4大正203219.617551
.........
975平成101664.388810
976平成101406.646760
977平成101126.513717
978平成100845.716013
979平成100588.073626

980 rows × 2 columns

エンコード結果の分布を確認する

import matplotlib.pyplot as plt
import japanize_matplotlib

plt.figure(figsize=(8, 4))
for i, ci in enumerate(X[FEATURE_NAME].unique()):
    plt.hist(
        X.query(f"{FEATURE_NAME}=='{ci}'")[f"{FEATURE_NAME}_ots"], label=ci, alpha=0.5
    )

plt.title("エンコードされた結果の分布")
plt.legend(title=FEATURE_NAME)
<matplotlib.legend.Legend at 0x7fcb0c7e5a30>

png