目标编码(target encoding)

1.介绍

目标编码,是用于分类特征的。它是一种将类别编码为数字的方法,就像独热编码或标签编码一样,区别在于它还使用目标来创建编码。这就是我们所说的有监督的特征工程技术。

2.target encoding

目标编码是用从目标派生的数字替换特征类别的一种编码。

一个简单而有效的方式是用组聚合,如平均值。使用Automobiles数据集,计算每种车型的平均价格:

... ...

这种目标编码有时称为平均编码(mean encoding)。应用于二进制目标,也称为二进制计数(bin counting)(您可能遇到的其他名称包括:似然编码、影响编码和遗漏编码【likelihood encoding, impact encoding, and leave-one-out encoding】)。

3.平滑(Smoothing)

然而,这样的编码会带来一些问题。首先是未知类别。目标编码会产生过拟合的特殊风险,这意味着它们需要接受独立的“编码”分割训练。当你将编码加入到将来的拆分中时,Pandas将为编码拆分中不存在的任何类别填充缺少的值。这些缺失的值你将不得不以某种方式进行插补。

其次是稀有类。当一个类别在数据集中只出现几次时,对其组计算的任何统计数据都不太可能非常准确。在汽车数据集中,商品制造只发生一次。我们计算的“平均”价格只是那一辆车的价格,这可能不太能代表我们将来可能看到的任何一辆。目标编码罕见的类别可以使过拟合的可能性更大。

解决这些问题的方法是增加平滑度。这样做的目的是将类别内平均数与总体平均数相结合。稀有类别在其类别平均值中的权重较小,而缺失类别只得到总体平均值。

在伪代码中:

encoding = weight * in_category + (1 - weight) * overall

其中,权重是从类别频率计算得出的介于0和1之间的值。

确定权重值的一种简单方法是计算m估计(m-estimate):

weight = n / (n + m)

其中n是该类别在数据中出现的总次数。参数m确定“平滑因子”。m值越大,对总体估计的权重就越大。

...

当选择M的值时,需要考虑你选择的类别。每个品牌的汽车价格有很大差异吗?你需要大量的数据才能得到好的估计吗?如果是这样,最好选择一个更大的m值;如果每种产品的平均价格相对稳定,价格越小越好。

注意:

目标编码非常适合:

高基数特性(High-cardinality features):具有大量类别的特性可能很难编码:独热编码会生成太多特性,而替代方案(如标签编码)可能不适合该特性。目标编码使用特征最重要的属性(与目标的关系)为类别派生数字。 领域驱动的特性(Domain-motivated features):根据以前的经验,您可能会怀疑分类特性应该是重要的,即使它在特性度量方面得分很低。目标编码有助于揭示特征的真正信息性。

4.例子

MovieLens1M数据集包含了MovieLens网站用户对100万部电影的评价,其中的功能描述了每个用户和电影。有超过3000个类别,Zipcode特性是一个很好的目标编码候选,而且这个数据集的大小(超过一百万行)意味着我们可以腾出一些数据来创建编码。

我们将首先创建一个25%的分割来训练目标编码器。

...

scikit-learn-contrib中的category_encoders包实现了一个m-estimate编码器,我们将使用它来编码Zipcode特性。


...

让我们将编码值与目标值进行比较,看看编码的信息量有多大。

...

编码的Zipcode特性的分布大致遵循实际收视率的分布,这意味着电影观看者在Zipcode收视率与和我们的目标编码能够捕获有用的信息的Zipcode收视率之间的差异很大。