クルトンのプログラミング教室

Pythonの使い方やPythonを使った競技プログラミングの解法などを解説しています。

p値を用いたTarget Encoding

こんにちは、クルトンです!

この記事では二値分類問題でのp値を用いたTarget Encodingについて説明しようと思います。

p値とは

H_0:\theta\in\Theta_0\:\mathrm{vs}\:H_1:\theta\notin\Theta_0なる検定問題において棄却域がR=\{{\displaystyle\boldsymbol{x}}\:|\:W({\displaystyle\boldsymbol{x}})>c\}で与えられるとき、p({\displaystyle\boldsymbol{x}})=\sup_{\theta\in\Theta_0}{P_\theta(W({\displaystyle\boldsymbol{X}})\geq{W({\displaystyle\boldsymbol{x}}))}}をp値と言います。


簡単に説明すると「帰無仮説が正しいとした仮定とき、観測した事象よりも極端なことが起こる確率」のことです。


例えば検定統計量を「コインを投げた時に表が出た回数」とし、表と裏が出る確率が同じ(帰無仮説)とします。

このときに表が9回、裏が1回出たとすると、p値は\frac{10+1}{2^{10}}=\frac{11}{1024}となります。

通常の検定では、p値が有意水準と呼ばれる基準の数値(例えば5%)を下回った場合は、これが偶然ではなく意味があることだ(有意である)と考え帰無仮説を棄却します(表と裏が出る確率が同じだという前提が間違っていたと考える)。

このように、p値を用いることによって、観測した事象がどのくらい起こりにくいかを知ることができます。

通常のTarget Encodingの欠点

通常のTarget Encodingでは、あるカテゴリに所属するデータの数が少ないと過学習の原因になってしまう可能性があります。

この問題の解決策として、TargetEncodingのスムーシングがありますが、これもハイパーパラメーターが存在するという問題点があります(スムーシングについては以下の記事を参照してください)。

mikebird28.hatenablog.jp

en.wikipedia.org

そこで僕は、p値を使えばこの問題を解決できるのではないかと考えました。

p値を用いたTarget Encoding

通常のTargetEncodingは、n_iクラスタiに所属しているデータの数、n_{iy}クラスタiに所属していて目的変数が1の数としたとき

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

と表せます。

しかし、n_in_{iy}の値が小さいと、間接的に目的変数の値を予想できてしまうため過学習を引き起こしてしまいます。

ここでp値を用いる方法について考えてみましょう。

n_{tr}をデータの総数、n_yをデータセット全体の中で目的変数が1の数とします。

すると全体としては十分なデータ数があるとき、クラスタiの目的変数の総和はBin(n_i, \frac{n_y}{n_{tr}})のような二項分布に従うと仮定できます(帰無仮説)。

このときの各々のクラスターでのp値を求めれば、そのクラスターが平均からどのくらい外れているかを計算できるのではないか?というのがp値を用いたTarget Encodingです。

p値の計算と連続修正

上記の変数を用いると、カテゴリiのp値は\sum_{k=n_{iy}}^{n_i}{{}_{n_i} C_k}{(\frac{n_y}{n_{tr}})^k}{(1-\frac{n_y}{n_{tr}})^{n_i-k}}で求める事ができます。

しかしこのようにしてp値を求めると、\frac{n_y}{n_{tr}}=0.5のときに、n_i=2, n_{iy}=1であればp値は0.75になり、n_i=10, n_{iy}=5であればp値は0.62になってしまいます。

これは、二項分布が離散変量に基づく分布にもかかわらず、目的変数の合計値を連続変量として扱っているためです。

このような場合は、連続修正を行うことでより正確なp値を求めることができます。

具体的には上記の式においてk=n_{iy}のときに足す項を1/2倍することで連続修正をすることができます。

上記の例では、この連続修正を行うことでどちらもp値が0.5になります。

f:id:kuruton456:20220224001809p:plain
図は\frac{n_y}{n_{tr}}=0.5のときのp値を表している(青がn_i=2, n_{iy}=1でオレンジがn_i=10, n_{iy}=5の場合。塗りつぶされた部分の面積がそれぞれのp値を表している。)。左の図を見ると、青のk=1の部分とオレンジのk=5の部分の面積が異なるために誤差が生じていることが分かる。右は連続修正後だが、連続修正によってそれらの部分が上手く処理されていることが分かる。

実際に使用した結果

規約により具体的なコンペの内容は説明できませんが、atmaCup13ではAdditive Smoothing Target Encodingよりもp値を用いたTarget Encodingの方がスコアが改善しました。

皆さんもぜひp値を用いたTarget Encodingを使ってみてください!