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

1. Label Encoder / Ordered Encoder

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

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

2. OneHot Encoder / Dummy Encoder / OHE

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

3. Sum Encoder (Deviation Encoder, Effect Encoder)

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

4. Helmet Encoder

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

5. Frequency Encoder / Count Encoder

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

6. Target Encoder

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

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

7. M-Estimate Encoder

M-Estimate Encoder 相当于 一个简化版的Target Encoder

8. James-Stein Encoder

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

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

9. Weight of Evidence Encoder

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

最后每个特征取值可表示为:

WoE = ln(nomiinator / denominator})

10 . Leave-one-out Encoder (LOO or LOOE)

这个方法类似于SUM的方法,只是在计算训练集每个样本的特征值转换时都要把该样本排除(消除特征某取值下样本太少导致的严重过拟合),在计算测试集每个样本特征值转换时与SUM相同。

11. Catboost Encoder

是Catboost中的encode方法,这个方法据说效果非常好,而且可以避免过拟合,可能有些复杂,在我写Catboost模型的时候会把它也写出来,这里就先不写了。


效果分析与讨论

数据集使用了八个存在离散型变量的数据集,最后的结果加权如下:

不使用交叉验证的情况:

HelmertEncoder           0.9517
SumEncoder          0.9434
FrequencyEncoder    0.9176
CatBoostEncoder         0.5728
TargetEncoder           0.5174
JamesSteinEncoder   0.5162
OrdinalEncoder          0.4964
WOEEncoder          0.4905
MEstimateEncoder    0.4501
BackwardDifferenceEncode0.4128
LeaveOneOutEncoder  0.0697

使用交叉验证的情况:

CatBoostEncoder      0.9726
OrdinalEncoder      0.9694
HelmertEncoder      0.9558
SumEncoder      0.9434
WOEEncoder      0.9326
FrequencyEncoder    0.9315
BackwardDifferenceEncode0.9108
TargetEncoder       0.8915
JamesSteinEncoder   0.8555
MEstimateEncoder    0.8189
LeaveOneOutEncoder  0.0729

下面是Kaggle上大佬们给出的一些建议,具体原因尚未分析,希望有大神在评论区可以给出解释。

  • 对于无序的离散特征,实战中使用 OneHot, Hashing, LeaveOneOut, and Target encoding 方法效果较好,但是使用OneHot时要避免高基类别的特征以及基于决策树的模型,理由如下图所示。

但是在实战中,我发现使用Xgboost处理高维稀疏的问题效果并不会很差。例如在IJCAI-18商铺中用户定位比赛中,一个很好的baseline就是把高维稀疏的wifi信号向量直接当做特征放到Xgboost里面,也可以获得很好的预测结果。不知道是不是因为Xgboost对于稀疏特征的优化导致。

  • 对于有序离散特征,尝试 Ordinal (Integer), Binary, OneHot, LeaveOneOut, and Target. Helmert, Sum, BackwardDifference and Polynomial 基本没啥用,但是当你有确切的原因或者对于业务的理解的话,可以进行尝试。
  • 对于回归问题而言,Target 与 LeaveOneOut 方法可能不会有比较好的效果。
  • LeaveOneOut、 WeightOfEvidence、 James-Stein、M-estimator 适合用来处理高基数特征。Helmert、 Sum、 Backward Difference、 Polynomial 在机器学习问题里的效果往往不是很好(过拟合的原因)

11种离散型变量编码方式及效果对比相关推荐

  1. 离散型变量的编码方式——one-hot与哑变量(dummy variable)

    我们在用模型去解决机器学习问题的时候,要提前进行"特征工程".而特征工程中很重要的就是对特征的预处理. 当你使用的是logistic回归这样的模型的时候,模型要求所有特征都应该是数 ...

  2. java改变变量编码方式_Java 10将如何改变您的编码方式

    java改变变量编码方式 突出显示Java 10中新的Java局部变量类型推断功能 早在2016年,Java社区就掀起了新的JDK增强提案(JEP): JEP 286 . 现在,两年后,局部变量类型推 ...

  3. java改变变量编码方式_Java 8中的5个功能将改变您的编码方式

    java改变变量编码方式 Java 8在JVM和语言级别都包含了一些非常令人兴奋的功能. 尽管最初为该发行版设想的某些功能已扩展到第9版,或已推出第9版,但实际上有数十个新功能. 许多新添加的内容在编 ...

  4. python实现离散型变量分组统计

    实现功能: 按离散型变量进行分组统计,比如一个离散型变量A有1,2,3,4四种取值类型,另一个离散型变量B有0,1两种取值类型,统计A1B0,A1B1,A2B0,A2B1,A3B0,A3B1,A4B0 ...

  5. 『R语言Python』建模前的准备:连续型与离散型变量探索,离散型变量转为虚拟变量

    在建立模型之前,我们常要先对数据的类型作出判断,连续型数据可以不做处理,而离散型数据则可能需要转为虚拟变量.下文使用R语言中的经典数据集 mtcarsmtcarsmtcars 进行演示 Python: ...

  6. 3位格雷码的顺序编码_一种优化格雷码编码方式实现跨时钟域的装置的制作方法...

    本发明属于信号处理技术领域,尤其是涉及一种优化格雷码编码方式实现跨时钟域的装置. 背景技术: 随着时间的推移,集成电路行业发展至今,已有类似如intel这样先进的foundry,提出迈入10nm制程的 ...

  7. 设计模式总结: 5种创建型,7种结构型,11种行为型

    设计模式总结: 5种创建型,7种结构型,11种行为型 (加粗的为常用模式) 5种创建型: 工厂方法模式factory 抽象工厂abstactfactory 单例模式singleton 建造者模式bui ...

  8. Python之pandas:利用describe函数统计【类别型】特征/离散型变量的描述性统计信息(包括个数count、unique、top及其freq、first、last)之详细攻略

    Python之pandas:利用describe函数统计[类别型]特征/离散型变量的描述性统计信息(包括个数count.unique.top及其freq.first.last)之详细攻略 目录 利用d ...

  9. 『R语言Python』针对多分类离散型变量的特征工程

    在训练模型之前,我们常常需要根据不同变量的基本情况进行相应且合理的特征工程,通过阅读文献和自行尝试,我针对多分类变量的特征工程做出了一些总结 数据来源(adult数据集):https://archiv ...

最新文章

  1. mysql 异步api_Hiredis异步API
  2. 计算机 二进制 中国,二进制与计算机
  3. 存储过程中引用的常规表,临时表以及表变量是否会导致存储过程的重编译
  4. poj 2115 C Looooops(扩展欧几里德算法)
  5. 1-javascript基础学习
  6. pythonargmaxaxis1_详解numpy的argmax的具体使用
  7. 从零开始搭建spring-cloud(0) --springboot与springcloud的关系
  8. jQuery Mobile教程:jQuery Mobile基本事件
  9. java根据周数获取日期_java获取日期的周数和所属年份
  10. c语言办公用品管理系统,恒达办公用品管理系统
  11. cmd操作 以及几个常用快捷键
  12. 边沿触发器(T触发器)
  13. Pycharm生成.exe文件
  14. 【黑马程序员】vue学习笔记(未完)
  15. 英文版-恩光照耀-Shine Jesus Shine
  16. 设计求二叉树高度的算法
  17. android 饼图花边框,echarts 饼图给外层加边框
  18. Referenced file contains errors解决
  19. 如何使用逆分布函数模拟MEDIAN()聚合函数
  20. uni-app map 地图

热门文章

  1. java8 strem的collector.toMap根据指定字段分组
  2. web漏洞“小迪安全课堂笔记”文件操作安全,文件上传
  3. 华为云原生之数据仓库服务GaussDB(DWS)的深度使用与应用实践
  4. 如何用css实现边框上的小箭头?
  5. [零散知识]单调性与反单调性约束 Antimonotonicity and monotonicity constraint
  6. 深度学习相关的模式识别知识
  7. 启航吧~水手!kubernetes漫画时间!
  8. HTML5+CSS3的响应式网页设计:自动适应屏幕宽度 转自:欲思博客
  9. 最高年化收益36.5%!TOP Staking已开启“躺赚”模式
  10. poj3279 Fliptile(翻转棋盘)