4.5 平均数编码(Mean Encoding)
1)定义
平均数编码(mean encoding),针对高基数类别特征的有监督编码。当一个类别特征列包括了极多不同类别时(如家庭地址,动辄上万)时,可以采用。
平均数编码(mean encoding)的编码方法,在贝叶斯的架构下,利用所要预测的应变量(target variable),有监督地确定最适合这个定性特征的编码方式。在Kaggle的数据竞赛中,这也是一种常见的提高分数的手段。
算法原理详情可参考:平均数编码:针对高基数定性特征(类别特征)的数据预处理/特征工程。
2)为什么要用平均数编码?
如果某一个特征是定性的(categorical),而这个特征的可能值非常多(高基数),那么平均数编码(mean encoding)是一种高效的编码方式。在实际应用中,这类特征工程能极大提升模型的性能。
因为定性特征表示某个数据属于一个特定的类别,所以在数值上,定性特征值通常是从0到n的离散整数。例子:花瓣的颜色(红、黄、蓝)、性别(男、女)、地址、某一列特征是否存在缺失值(这种NA 指示列常常会提供有效的额外信息)。
一般情况下,针对定性特征,我们只需要使用sklearn的OneHotEncoder或LabelEncoder进行编码,这类简单的预处理能够满足大多数数据挖掘算法的需求。定性特征的基数(cardinality)指的是这个定性特征所有可能的不同值的数量。在高基数(high cardinality)的定性特征面前,这些数据预处理的方法往往得不到令人满意的结果。
3)优点
和独热编码相比,节省内存、减少算法计算时间、有效增强模型表现。
4)实现代码
MeanEnocodeFeature = ['item_city_id','item_brand_id']
ME = MeanEncoder(MeanEnocodeFeature)
trans_train = ME.fit_transform(X,y)
test_trans = ME.transform(X_test)
MeanEncoder实现源码详情可参考:平均数编码:针对高基数定性特征(类别特征)的数据预处理/特征工程。
- 特征预处理是数据预处理过程的重要步骤,是对数据的一个的标准的处理,几乎所有的数据处理过程都会涉及该步骤。
- 我们对特征进行分箱后,需要对分箱后的每组(箱)进行
woe编码和IV值的计算,通过IV值进行变量筛选后,然后才能放进模型训练。
- 分箱后需要进行特征编码,如:
LabelEncode、OneHotEncode或LabelBinarizer等。
- 由于树模型(
Random Forest、GBDT、xgboost等)对特征数值幅度不敏感,可以不进行无量纲化和统计变换处理;同时,由于树模型依赖于样本距离来进行学习,所以也可以不进行类别特征编码(但字符型特征不能直接作为输入,所以需要至少要进行标签编码)。
- 依赖样本距离来学习的模型(如线性回归、SVM、深度学习等),对于数值型特征需要进行无量纲化处理;
- 对于一些长尾分布的数据特征,可以做统计变换,使得模型能更好优化;
- 对于线性模型,特征分箱可以提升模型表达能力;对数值型特征进行特征分箱可以让模型对异常数据有很强的鲁棒性,模型也会更稳定。另外,分箱后需要进行特征编码。
[1] sklearn中的数据预处理. http://d0evi1.com/sklearn/preprocessing/
[2] 归一化与标准化. https://ssjcoding.github.io/2019/03/27/normalization-and-standardization/
[3] Preprocessing Data : 類別型特徵_OneHotEncoder & LabelEncoder 介紹與實作. https://medium.com/ai%E5%8F%8D%E6%96%97%E5%9F%8E/preprocessing-data-onehotencoder-labelencoder-%E5%AF%A6%E4%BD%9C-968936124d59
[4] 平均数编码:针对高基数定性特征(类别特征)的数据预处理/特征工程. https://zhuanlan.zhihu.com/p/26308272
[5] 特征工程之分箱. https://blog.csdn.net/Pylady/article/details/78882220
[6] https://www.leiphone.com/news/201801/T9JlyTOAMxFZvWly.html