TargetEncodingのスムーシング
はじめてのFeature Engineering で紹介したTargetEncoding, LikelihoodEncodingはカテゴリ変数の前処理としては非常に強力な手法だが、あるカテゴリに所属するデータの数が少ないと過学習の原因になってしまう可能性がある。データ数が少ないカテゴリを持つデータセットに対して効果的にTragetEncodingを使うために、この論文ではTargetEncodingのスムージングという手法を提案している。
まず通常のTargetEncoding、LikelihoodEncodingは以下のような式で表現できる。
ここで はクラスタi に所属しているデータの数、 はクラスタiに所属していて目的変数が1の数を表している。、の数が十分に大きければ過学習を気にする必要は無いかもしれないが、これらの値が小さいと間接的に目的変数の値を予想できるようになってしまうので過学習の要因になってしまう。この問題を解決するために以下のように改良された式が提案されている。
上で説明した式に加えて、、 という変数が追加されている。、 はデータの総数、はデータセット全体の中で目的変数が1の数を表している。また は 対して単調増加で、0〜1の範囲を取る関数を表している。
この式は の数が十分に大きければ第一項の影響が大きくなり普通のTargetEncodingと同じような値を示す。一方で の数が小さいと第二項の影響が大きくなりデータセット全体の目的変数が1の割合に近づく。このようにデータ数が少ないクラスタに対してはデータセット全体の値を用いることで、機械学習モデルが過学習することを防いでいる。
上の式で出てきたには次のような関数を用いることが多いようだ。
この関数はシグモイド関数的な特徴(k = 0、f = 1とすれば標準シグモイド関数)を示し、k、fの値を調整することでチューニングすることができる。
参考
- A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems https://kaggle2.blob.core.windows.net/forum-message-attachments/225952/7441/high%20cardinality%20categoricals.pdf
- Python target encoding for categorical features https://www.kaggle.com/ogrellier/python-target-encoding-for-categorical-features