Target Encoding
Target Encoding又名mean encoding。正如其名,实际上是把符合条件的y的均值作为这个条件的所有样本的新特征。
在kaggle的S5E2和这个月正在进行的S5E4等比赛都获得了耀眼的表现。
最简单的形式是
1 |
|
为了避免数据泄露,Target Encoding往往采用的是$(1-\alpha)y_{类内}+\alpha y_{all}$。我们当然可以手动指定$\alpha$,但更好的选择是我们通过一系列数学方法来确定,这也就引出了各种的target encoder。
python上有多个库提供了“target encoder”,但它们实际上并不是完全同一个东西。
sklearn中的相当于category_encoders中的JamesSteinEncoder,cuml中的相当于category_encoders中的M-estimate Encoder。JamesSteinEncoder事实是可以当做一种特殊的M-estimate Encoder,所以我们先从JamesSteinEncoder介绍起。
JamesSteinEncoder
$$
\alpha=\frac{Var(y_i)}{Var(y_i)+Var(y)}=\frac{\sigma^2/n_i}{\sigma^2/n_i+\tau^2}
$$
Chris Said认为,如果你熟悉James-Stein 估计量的话,可以得到(注意我们要减去一个自由度):
$$
\begin{align}
\alpha&=\frac{(k-3)\hat\sigma^2}{\sum(xi-\bar X)^2}
\\
&\approx \frac{(k-1)\hat\sigma^2}{\sum(xi-\bar X)^2}
\\
&= \frac{\hat\sigma^2}{\sum(xi-\bar X)^2/(k-1)}
\\
&=\frac{Var(y_i)}{Var(y_i)+Var(y)}
\end{align}
$$
(唉,怎么k-3=k-1了)我们实际上是天文学家,它们都是同一数量级的。
它也可以从贝叶斯中得出:
比如假定高斯分布$N(\mu,\tau^2)$,似然y来自$N(xi,\sigma_i^2/n_i)$,则后验分布$N(\mu_b,)$满足:
$$
\mu_b=\frac{\frac{x_in_i}{\sigma_i^2}+\frac{\mu}{\tau^2}}{\frac{1}{\tau^2}+\frac{n_i}{\sigma_i^2}}
$$
我们化简即可得到。
我们也可以假定先验为$N(0,\tau^2)$,则后验分布为$N(\frac{\tau^2}{\sigma^2/n+\tau^2},)$
故贝叶斯估计量为$\frac{\tau^2}{\sigma^2/n+\tau^2} \bar X$,则有$\frac{1}{||\mathbf{X}||_2^2} \sim \frac{1}{\tau^2 + \sigma^2} \cdot \text{inverse-}\chi^2_p$。
$$
\begin{align} \mathbb{E}[\hat{\alpha}^{(JS)}] &= \mathbb{E}\left[\left( 1 - \frac{(p - 2) \sigma^2}{||\mathbf{X}||_2^2} \right)\right] \\ &= 1 - \mathbb{E}\left[\left(\frac{(p - 2) \sigma^2}{||\mathbf{X}||_2^2} \right)\right] \\ &= 1 - (p - 2) \sigma^2 \mathbb{E}\left[\frac{1}{||\mathbf{X}||_2^2} \right] \\ &= 1 - (p - 2) \sigma^2 \frac{1}{(\tau^2 + \sigma^2) (p - 2)} \\ &= 1 - \frac{\sigma^2}{\tau^2 + \sigma^2} \\ &= \frac{\tau^2}{\tau^2 + \sigma^2} \ \end{align}
$$
然而对于$\alpha$,一个一个计算类内方差可能会有较大的复杂度,我们可以假定全部方差都相同,比如kaggle-ASHRAE - Great Energy Predictor III比赛第一名所用的那样。我们也假设各类符合相同分布,这也被称为pooled。
M-estimate Encoder
我们知道JamesSteinEncoder中$\alpha=\frac{\sigma^2/n_i}{\sigma^2/n_i+\tau^2}=\frac{\sigma^2/\tau^2}{\sigma^2/\tau^2+n_i}$,那么我们干脆令$\sigma^2/\tau^2$为自定义参数m,这也就是M-estimate Encoder。
避免过拟合
显然地,target encoding直接利用了目标列的信息,这难免会过拟合,有以下几种方法可以避免过拟合,交叉验证、加噪声。
参考资料:
https://www.econometrics.blog/post/not-quite-the-james-stein-estimator/
https://chris-said.io/2017/05/03/empirical-bayes-for-multiple-sample-sizes/