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

做者:xiaoyupython

微信公众号:Python数据科学bash

知乎:python数据分析师微信


1. 为何要进行特征编码?

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

2. 特征编码类型

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

One-hot encoding学习

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

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

pd.get_dummies(lianjia_df['Elevator'])
复制代码

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

Label encodingcode

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-hotencoding。典型的例子就是LR和SVM。两者的损失函数对数值大小是敏感的,而且变量间的数值大小是有比较意义的。而Label encoding的数字编码没有数值大小的含义,只是一种排序,所以对于这些模型都使用one-hot encoding。

  • 对数值大小不敏感的模型(如树模型)不建议使用one-hotencoding。通常这类模型为树模型。若是分类类别特别多,那么one-hot encoding会分裂出不少特征变量。这时候,若是咱们限制了树模型的深度而不能向下分裂的话,一些特征变量可能就由于模型没法继续分裂而被舍弃损失掉了。所以,此种状况下能够考虑使用Label encoding。

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

5. 总结

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

关注微信公众号:Python数据科学,发现更多精彩内容。

相关文章
相关标签/搜索