离散型特征编码

简介

综合转载于:

Category Encoders

关于离散型编码的Python库,里面封装了十几种(包括文中的所有方法)对于离散型特征的编码方法,接口接近于Sklearn通用接口,非常实用,这个库的链接

Label Encoder/Ordered Encoder

这个编码方式非常容易理解,就是把所有的相同类别的特征编码成同一个值,例如女=0,男=1,狗狗=2,所以最后编码的特征值是在[0, n-1]之间的整数。

这个编码的缺点在于它随机的给特征排序了,会给这个特征增加不存在的顺序关系,也就是增加了噪声。假设预测的目标是购买力,那么真实Label的排序显然是 女 > 狗狗 > 男,与我们编码后特征的顺序不存在相关性。

OneHot Encoder/Dummy Encoder/OHE

大家熟知的OneHot方法就避免了对特征排序的缺点。对于一列有N种取值的特征,Onehot方法会创建出对应的N列特征,其中每列代表该样本是否为该特征的某一种取值。因为生成的每一列有值的都是1,所以这个方法起名为Onehot特征。Dummy特征也是一样,只是少了一列,因为第N列可以看做是前N-1列的线性组合。但是在离散特征的特征值过多的时候不宜使用,因为会导致生成特征的数量太多且过于稀疏。

Sum Encoder/Deviation Encoder/Effect Encoder

求和编码通过比较某一特征取值下对应标签(或其他相关变量)的均值与标签的均值之间的差别来对特征进行编码。但是据我所知 ,如果做不好细节,这个方法非常容易出现过拟合,所以需要配合留一法或者五折交叉验证进行特征的编码。还有根据方差加入惩罚项防止过拟合的方法。

Helmet Encoder

Helmet编码是仅次于OHE和SumEncoder使用最广泛的编码方法,与SumEncoder不同的是,它比较的是某一特征取值下对应标签(或其他相关变量)的均值与他之前特征的均值之间的差异,而不是和所有特征的均值比较。这个特征同样容易出现过拟合的情况。不知道Helmet这个词是指的什么方面……使用标签时容易出现过拟合。

Frequency Encoder/Count Encoder

这个方法统计训练集中每个特征出现的频率,在某些场景下非常有用(例如推荐系统中商品被购买的次数,直接反映了商品的流行程度),也不容易出现过拟合,但是缺点是在每个特征的取值数分布比较均匀时会遗漏大量的信息。

Target Encoder

以下是计算公式:

其中 $n$ 代表的是该某个特征取值的个数,$n^+$代表某个特征取值下正Label的个数,$\text{mdl}$为一个最小阈值,样本数量小于此值的特征类别将被忽略,$\text{prior}$是Label的均值。注意,如果是处理回归问题的话,n+/n可以处理成相应该特征下label取值的average / max。对于k分类问题,会生成对应的k-1个特征。

此方法同样容易引起过拟合,以下方法用于防止过拟合

  • 增加正则项 $a$ 的大小
  • 在训练集该列中添加噪声
  • 使用交叉验证

M-Estimate Encoder

相当于 一个简化版的Target Encoder

其中 $y^+$ 代表所有正Label的个数,$m$ 是一个调参的参数,$m$ 越大过拟合的程度就会越小,同样的在处理连续值时$n^+$ 可以换成label的求和,$y^+$ 换成所有正label的求和。

James-Stein Encoder

James-Stein Encoder 同样是基于target的一种算法。算法的思想很简单,对于特征的每个取值 $k$ 可以根据下面的公式获得:

其中 $B$ 由以下公式估计:

但是它有一个要求是target必须符合正态分布,这对于分类问题是不可能的,因此可以把 $y$ 先转化成概率的形式。或者在实际操作中,使用grid search的方法选择一个比较好的B值。

Weight of Evidence Encoder

Weight Of Evidence 同样是基于target的方法。

基于以下公式计算

一分一毛,也是心意。