2018-6-14

TargetEncodingのスムーシング

はじめてのFeature Engineeringで紹介したTargetEncoding, LikelihoodEncodingはカテゴリ変数の前処理としては非常に強力な手法だが、あるカテゴリに所属するデータの数が少ないと過学習の原因になってしまう可能性がある。 データ数が少ないカテゴリを持つデー[タセットではTargetEncodingのスムージングという手法を提案している。

まず通常のTargetEncoding、LikelihoodEncodingは以下のような式で表現できる。

{
\displaystyle
S_i = \frac{n_{iy}}{n_i}
}

ここで! \displaystyle n_i](https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20n_i) はクラスタi に所属しているデータの数、 n_{iy} はクラスタiに所属していて目的変数が1の数を表している。 \displaystyle n_i  \displaystyle n_{iy} の数が十分に大きければ[過学習を気にする必要は無いかもしれないが、これらの値が小さいと間接的に目的変数の値を予想できるようになってしまうので過学習の要因になってしまう。この問題を解決するために以下のように改良された式が提案されている。

{ \displaystyle
S_i = \lambda (n_i) \frac{n_{iy}}{n_i} + (1 - \lambda (n_i) ) \frac{n_y}{n_{tr}}
}

上で説明した式に加えて! \displaystyle \lambda (n_i)](https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20%5Clambda%20%28n_i%29)、![ \displaystyle n_i](https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20n_i)、![ \displaystyle {n_{tr}}](https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20%7Bn_%7Btr%7D%7D) という変数が追加されている。、 \displaystyle {n_{tr}} はデータの総数、 \displaystyle n_y はデータセット 対して単調増加で、0〜1の範囲を取る関数を表している。

**この式は! \displaystyle n_i](https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20n_i) の数が十分に大きければ第一項の影響が大きくなり普通のTargetEncodingと同じような値を示す。一方で ! \displaystyle n_i](https://chart.apis.google.com/chart?cht=tx&chl=%20%5Cdisplaystyle%20n_i)の数が小さいと第二項の影響が大きくなりデータセット全体の目的変数が1の割合に近づく。**このようにデータ数が少ないクラスタに対してはデータセット全体の値を用いることで、機械学習モデルが過学習することを防いでいる。

上の式で出てきた \displaystyle \lambda (n_i)には次のような関数を用いることが多いようだ。

{
\displaystyle
\lambda (n_i) = \frac {1}{1 + e^{- \frac{n_i - k} {f}}}
}

この関数はシグモイド関数的な特徴(k = 0、f = 1とすれば標準シグモイド関数)を示し、k、fの値を調整することでチューニングすることができる。

参考