专栏首页Python数据科学机器学习“特征编码”的经验分享:鱼还是熊掌?

机器学习“特征编码”的经验分享:鱼还是熊掌?

-----这是 Python数据科学 的第 42 篇原创文章-----

【作者】:xiaoyu

【介绍】:一个半路转行的数据挖掘工程师

【知乎专栏】:https://zhuanlan.zhihu.com/pypcfx

本篇主要介绍one-hot encoding与label encoding的区别,以及各自的应用场景。

全文1971字 | 阅读需要8分钟

1为什么要进行特征编码?

我们拿到的数据通常比较脏乱,可能会带有各种非数字特殊符号,比如中文。下面这个表中显示了我们最原始的数据集。而实际上机器学习模型需要的数据是数字型的,因为只有数字类型才能进行计算。因此,对于各种特殊的特征值,我们都需要对其进行相应的编码,也是量化的过程。

2特征编码类型

本篇,我们主要说一下分类型特征的编码方式。对于分类型数据的编码,我们通常会使用两种方式来实现,分别是:one-hot encoding label-encoding。下面我们先介绍一下这两种编码。

One-hot encoding

one-hot encoding也就是我们常常听到的独热编码(哑变量)。那么到底什么是独热编码呢?我们来看一个例子,是二手房房价分析中所使用的数据:

可以看到,图中的Elevator和Renovation都是定类型数据。除去缺失值,Elevator分类有电梯和无电梯两种。Renovation分为有精装,简装,毛坯和其它四种。下面,我们要对Elevator这个变量进行编码,在pandas中有现成的独热编码方法get_dummy,代码如下:

pd.get_dummies(lianjia_df['Elevator'])

原来的Elevator变量被拆分为两个单独的变量,这两个变量就是原来的分类特征值:有电梯和无电梯。并且新变量的特征值用数字0和1来替代,代表是否或者有无的概念。比如无电梯变量的1代表是(没有电梯),相反,0就代表否(有电梯)。因此概括一下,独热编码就是将原始特征变量转换成以原始特征值分类的多维度的变量,并用是否(0,1)这种方式的新特征值替代和量化。

Label encoding

label-encoding就是用标签进行编码的意思,即我们给特征变量自定义数字标签,量化特征。来看一个例子:

Class=['大一','大二','大三','大四']
df = pd.DataFrame({'Class':Class})
df

Class特征是定序数据类型,也是分类类型,但比定类更高级,因为有排序。Label encoding就是对特征值进行自定义式的标签编码。比如将大一变为1,大二变为2,大三为3,大四为4。那么经过编码后,特征值将变为以下的样子:

classMap = {'大一':1,'大二':2,'大三':3,'大四':4}
df['Class'] = df['Class'].map(classMap)
df

上面就将Class特征进行相应的编码。其实,Label encoding并没有任何限制,你也可以将Class定义为10,20,30,40,只不过1,2,3,4看起来比较方便。因此总结概括,Label encoding就是将原始特征值编码为自定义的数字标签完成量化编码过程。

3两种编码方式的优缺点

One-hot encoding

  • 优点:解决了分类器不好处理分类数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
  • 缺点:当类别的数量很多时,特征空间会变得非常大,容易造成维度灾难

Label encoding

  • 优点:解决了分类编码的问题,可以自由定义量化数字。但其实也是缺点,因为数值本身没有任何含义,只是排序。如大中小编码为123,也可以编码为321,即数值没有意义。
  • 缺点:可解释性比较差。比如有[dog,cat,dog,mouse,cat],我们把其转换为[1,2,1,3,2],这里就产生了一个奇怪的现象:dog和mouse的平均值是cat。因此,Label encoding编码其实并没有很宽的应用场景。

4两种编码该如何区分和使用?

明白这两种编码方式并不难,难的是如何区分和使用。好多朋友面对数据,会产生困惑,不知该使用哪种编码方式最为合适。对于这个问题,有以下几点需要考量:

  • 特征的数据类型
  • 所要使用的模型

事先声明:编码方式没有固定的方式,具体问题还需具体分析。对模型结果有利的编码才是最正确的。所以,实际中如果分不清哪种更好的时候,可能需要将两种都尝试进行对比。

下面,博主分享一下自己浅显的经验(一般情况下的使用):

特征数据类型

  • 对于定类类型的数据,建议使用one-hot encoding。定类类型就是纯分类,不排序,没有逻辑关系。比如性别分男和女,男女不存在任何逻辑关系,我们不能说男就比女好,或者相反。再者,中国各省市分类也可以用独热编码,同样各省不存在逻辑关系,这时候使用one-hot encoding会合适些。但注意,一般会舍去一个变量,比如男的对立面肯定是女,那么女就是重复信息,所以保留其中一个变量即可。
  • 对于定序类型的数据,建议使用label encoding。定序类型也是分类,但有排序逻辑关系,等级上高于定类。比如,学历分小学,初中,高中,本科,研究生,各个类别之间存在一定的逻辑,显然研究生学历是最高的,小学最低。这时候使用Label encoding会显得更合适,因为自定义的数字顺序可以不破坏原有逻辑,并与这个逻辑相对应。

所使用的模型

  • 对数值大小敏感的模型必须使用one-hot encoding。典型的例子就是LRSVM。二者的损失函数对数值大小是敏感的,并且变量间的数值大小是有比较意义的。而Label encoding的数字编码没有数值大小的含义,只是一种排序,因此对于这些模型都使用one-hot encoding。
  • 对数值大小不敏感的模型(如树模型)不建议使用one-hot encoding。一般这类模型为树模型。如果分类类别特别多,那么one-hot encoding会分裂出很多特征变量。这时候,如果我们限制了树模型的深度而不能向下分裂的话,一些特征变量可能就因为模型无法继续分裂而被舍弃损失掉了。因此,此种情况下可以考虑使用Label encoding。

以上两点考量需要综合考虑,而非单独判断。也就是说需要结合数据类型和模型的情况来具体选择编码方式。

5总结

以上是博主对于两种编码方式的一些理解,如果有什么不对或者需要补充的地方,请大家指正。而对于连续型的变量,如果需要编码首先需要进行离散化(分箱),然后再使用上述编码方式编码。数据离散化的内容我们后续进行介绍。

本文分享自微信公众号 - Python数据科学(Python_Spiderman)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-08-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 99%的人都不知道的pandas骚操作(一)

    pandas有一种功能非常强大的方法,它就是accessor,可以将它理解为一种属性接口,通过它可以获得额外的方法。其实这样说还是很笼统,下面我们通过代码和实例...

    用户2769421
  • 数据挖掘思维如何炼成!

    在数据分析中模型是非常有用和有效的工具和数据分析应用的场景,在建立模型的过程中,数据挖掘很多时候能够起到非常显著的作用。伴随着计算机科学的发展,模型也越来越向智...

    用户2769421
  • 200行代码实现解锁滑动验证码(文末附源码)

    做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动、点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大致说明下这些验证码的...

    用户2769421
  • 用四行代码来实现复杂动画 | 中文教学视频

    Android 开发者
  • 【时间序列】时间序列的智能异常检测方案

    时间序列异常检测是学术界和工业界一直研究的热点和难点问题。比如腾讯内部开源的Metis项目,其实现思路是基于统计判决、无监督和有监督学习对时序数据进行联合检测。...

    roganhuang
  • (cljs/run-at (JSVM. :browser) "命名空间就这么简单")

    前言  一个cljs文件定义一个命名空间,通过命名空间可以有效组织代码,这是构建大型系统必备的基础设施。本篇我们就深入理解cljs中的命名空间吧! 好习惯从"头...

    ^_^肥仔John
  • 非规则浮点数和规则浮点数

    为了更好理解本文内容,可先行阅读《量化、数据类型、上溢和下溢》中内容。这里依旧将浮点数看作是一种量化方式,将连续的不可数的集合映射到有限的集合上去。本文...

    sea-wind
  • ClickHouse和他的朋友们(4)Pipeline处理器和调度器

    原文出处:https://bohutang.me/2020/06/11/clickhouse-and-friends-processor/

    老叶茶馆
  • Mysql 监控性能状态 QPS/TPS

    QPS(Query per second) 每秒查询量 TPS(Transaction per second)每秒事务量 这是Mysql的两个重要性能指标,...

    dys
  • 什么是JTAG?

    JTAG是1980年代开发的用于解决电子板制造问题的IEEE标准(1149.1)。如今,它可以用作编程,调试和探测端口。但是首先,让我们看看JTAG的最初用途,...

    FPGA开源工作室

扫码关注云+社区

领取腾讯云代金券