目标编码简介
引言
目标编码(target encoding),亦称均值编码(mean encoding)、似然编码(likelihood encoding)、效应编码(impact encoding),是一种能够对高基数(high cardinality)自变量进行编码的方法 (Micci-Barreca 2001) 。目标编码属于有监督的编码方式,如果运用得当则能够有效地提高预测模型的准确性 (Pargent, Bischl, 和 Thomas 2019) ;而这其中的关键,就是在编码的过程中引入正则化,避免过拟合问题。本文将从目标编码的基本方法出发、进而介绍相关的正则化方法,希望能够借此加深对目标编码的理解。此外,本文的最后还会列出实现了目标编码的R语言扩展包。
需要特别注意的是,由于目标编码属于有监督的编码方式,因此估计有关参数时不应有测试集的参与;下文对有关方法的介绍均将作此假定。
目标编码基本的基本实现方法
假设某样本量为\(n\)的训练集\(\{(X_1, Y_1), .., (X_i, Y_i), ..., (X_n, Y_n)\}\)含有一个二分类因变量\(Y \in \{0, 1\}\),和一个有\(k\)个类别的高基数分类变量\(X \in \{C_1, ..., C_j, ..., C_k\}\)。对于\(X\)的每个取值\(C_j\),目标编码会将其映射成一个标量\(P_j\):
\[ C_j \rightarrow P_j \quad (1) \]
记\(X=C_j\)的样本量为\(n|_{X=C_j}\),\(X = C_j\)且\(Y = 1\)的样本量为\(n|_{X=C_j \& Y=1}\),当前者足够大时,可以用\(P(Y = 1|X = C_j)\)作为\(P_j\)的取值:
\[ P(Y = 1|X = C_j) = \frac{n|_{X=C_j \& Y=1}}{n|_{X=C_j}} \quad (2) \]
以上就是对二分类问题中高基数自变量进行目标编码的基本方法。实际上,目标编码(以及下面要介绍的各种正则化方法)同样适用于因变量是连续变量或多分类变量的情形 (Micci-Barreca 2001) 。对于连续型的因变量,只需把以上两式中的目标统计量换成期望值即可,即:
\[ C_j \rightarrow E_j \quad (3) \]
而\(E_j\)等于\(X=C_j\)时\(Y\)的期望值
\[ E(Y|X=C_j) = \frac{\sum Y|_{X=C_j}}{n|_{X=C_j}} \quad (4) \]
而对于含\(C'\)个(\(C'>2\))分类的因变量,则要先将其转变成\(C'-1\)个二分类哑变量,然后再分别对这些哑变量使用式(1)和式(2)计算\(X\)的目标编码。与另外两种情形不同的是,当因变量是多分类变量时,对一个自变量进行目标编码后将得到\(C'-1\)个衍生变量。
为简化描述,下文将继续以因变量为二分类变量的情形为例,对各种正则化方法进行讲解。
基于经验贝叶斯的正则化
前面提到,当\(n|_{X=C_j}\)足够大时,可以使用式(2)计算\(P_j\)的大小。但在实际情形中,高基数变量的取值分布往往是不均衡的,有些取值的出现次数会很低,这将造成上式给出的结果非常不稳定。解决这个问题的一种方法是使用下式获得调整后的\(P_j\)作为新的编码(Micci-Barreca 2001):
\[ P_j = \lambda(n|_{X=C_j}) \times P(Y=1|X=C_j) + (1 - \lambda(n|_{X=C_j})) \times P(Y=1) \quad (5) \]
其中
\[ P(Y=1) = \frac{n|_{Y=1}}{n} \quad (6) \]
而\(\lambda\)是一个关于\(n|_{X=C_j}\)的单调增函数,其大小在0-1之间
\[ \lambda(n|_{X=C_j}) = \frac{n|_{X=C_j}}{n|_{X=C_j} + \alpha} \quad (7) \]
\(\alpha\)是一个可以通过交叉验证方法调节的超参数(一般而言\(5 \leq \alpha \leq 10\) (Viacheslav Prokopev 2018) );其取值越大,正则化效果越强,越能对抗数据集中的噪声,但也更可能造成欠拟合。
式(5)提示,当某分类取值含有的样本量足够大时,可以直接使用式(2)所得的后验概率作为新编码的估计值;但当样本量接近0的时候,应该使用接近先验概率的值作为新编码的估计值,也即相当于认为该分类取值对因变量的取值不存在影响。
将式(7)代入式(5),有:
\[ P_j = \frac{P(Y = 1|X = C_j)n|_{X=C_j} + P(Y = 1) \alpha}{n|_{X=C_j} + \alpha} \]
另外,值得一提的是,基于经验贝叶斯的正则化方法实际上也可以以广义线性混合模型的形式实现;本文对此不做进一步介绍,感兴趣的读者可以参阅 (West, Welch, 和 Galecki 2014) 。
基于K折交叉验证的正则化
以下是使用K折正则化方法对训练集数据进行目标编码的简要步骤 (Viacheslav Prokopev 2018; Zumel 和 Mount 2016) :
- 将训练集数据划分成K折;
- 对划分出的每一折数据:
- 使用其余K-1折数据对该折数据进行目标编码的计算;
- 拼接以上各折数据及计算所得的目标编码,形成新的训练集数据。
注意,K折正则化只对训练集数据进行(完成后,原分类变量的每个分类最多可以与K个编码对应);而在对测试集数据进行目标编码时,只要直接使用全部训练集数据进行计算即可(完成后,原分类变量的每个分类只与1个编码对应)。也即是说,K折正则化只影响训练集的目标编码和模型拟合结果,不影响测试集的目标编码结果。另外,有关研究提示\(K\)的取值在3-6之间时,目标编码的效果最好 (Viacheslav Prokopev 2018) 。
K折正则化方法实现起来比较复杂;在数据量比较大时,也可以考虑使用基于校正集的方法 (Zumel 和 Mount 2016) :从数据集中划分出一个额外的子集(称校正集),然后使用该子集计算变量的目标编码,并将结果应用到训练集和测试集中去。
复合正则化方法
K折正则化方法与前面提到的其他计算目标编码的方法并不是互斥的;相反,我们可以通过某些方式对它们进行整合,使得到的目标编码能够进一步提高模型的预测性能。复合正则化方法的具体示例可以参见 (Viacheslav Prokopev 2018; Zumel 和 Mount 2016; Pargent, Bischl, 和 Thomas 2019) 。据有关研究显示 (Pargent, Bischl, 和 Thomas 2019) :在多数情况下,基于广义线性混合模型和5折交叉验证的复合正则化方法具有最优异的效果。
提供目标编码实现的R语言扩展包
以下几个R语言扩展包提供了目标编码的实现:
embed
;mlrCPO
;vtreat
。