scikit_learn学习笔记十——机器学习之LabelEncoder与OneHotEncode(独热码)

机器学习中的特征类别有连续型特征和离散型特征

获取到原始特征,根据情况需要需对特征分别进行归一化,比如,特征A的取值范围是[-1000,1000],特征B的取值范围是[-1,1]。如果使用logistic回归,w1x1+w2x2,因为x1的取值太大了,导致x2基本起不了作用。所以,必须进行特征的归一化,每个特征都单独进行归一化。

连续性特征的标准化(归一化)处理:【上一篇文章内容】
  • 线性缩放,归一化
  • 标准化处理,z-score
离散性特征

对于离散的特征基本就是按照离散值数值化处理(label encode或one hot encode),即将离散特征映射成多个相对应的数值表示。

LabelEncoder 标准化标签

LabelEncoder 是对不连续的数字或者文本进行编号

  • sklearn.preprocessing.LabelEncoder():标准化标签,将标签值统一转换成range(标签值个数-1)范围内
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
le.transform([1,1,100,67,5])
# 输出: array([0,0,3,2,1])

独热码 OneHotEncode

独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。

【举个粟子】
假如有三种颜色特征:红、黄、蓝。 在利用机器学习的算法时一般需要进行向量化或者数字化。那么你可能想令 红=1,黄=2,蓝=3. 那么这样其实实现了标签编码,即给不同类别以标签。然而这意味着机器可能会学习到“红<黄<蓝”,但这并不是我们的让机器学习的本意,只是想让机器区分它们,并无大小比较之意。所以这时标签编码是不够的,需要进一步转换。因为有三种颜色状态,所以就有3个比特。即红色:1 0 0 ,黄色: 0 1 0,蓝色:0 0 1 。如此一来每两个向量之间的距离都是根号2,在向量空间距离都相等,所以这样不会出现偏序性,基本不会影响基于向量空间度量算法的效果。

编码过程

假如只有一个特征是离散值:{sex:{male, female,other}}

该特征总共有3个不同的分类值,此时需要3个bit位表示该特征是什么值,对应bit位为1的位置对应原来的特征的值(一般情况下可以将原始的特征的取值进行排序,以便于后期使用),此时得到独热码为{100}男性 ,{010}女性,{001}其他

假如多个特征需要独热码编码,那么久按照上面的方法依次将每个特征的独热码拼接起来:
    {sex:{male, female,other}}
    {grade:{一年级, 二年级,三年级, 四年级}}
此时对于输入为{sex:male; grade: 四年级}进行独热编码,可以首先将sex按照上面的进行编码得到{100},然后按照grade进行编码为{0001},那么两者连接起来得到最后的独热码{1000001};

from sklearn import preprocessing

one_hot = preprocessing.OneHotEncoder()
one_hot.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
one_hot.transform([[0, 1, 3]]).toarray()
# array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])

独热编码意义何在

独热编码(哑变量 dummy variable)是因为大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1。

特征向量映射到欧式空间

将离散特征通过one-hot编码映射到欧式空间,是因为,在回归,分类,聚类等机器学习算法中,特征之间距离的计算或相似度的计算是非常重要的,而我们常用的距离或相似度的计算都是在欧式空间的相似度计算,计算余弦相似性,基于的就是欧式空间。

独热编码优缺点

  • 优点:独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。
  • 缺点:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且OneHotEncode+PCA这种组合在实际中也非常有用。

什么情况下(不)用独热编码

  • 用:独热编码用来解决类别型数据的离散值问题

  • 不用:将离散型特征进行one-hot编码的作用,是为了让距离计算更合理,但如果特征是离散的,并且不用one-hot编码就可以很合理的计算出距离,那么就没必要进行one-hot编码。 有些基于树的算法在处理变量时,并不是基于向量空间度量,数值只是个类别符号,即没有偏序关系,所以不用进行独热编码。 Tree Model不太需要one-hot编码: 对于决策树来说,one-hot的本质是增加树的深度。

什么情况下(不)需要归一化

  • 需要: 基于参数的模型或基于距离的模型,都是要进行特征的归一化。
  • 不需要:基于树的方法是不需要进行特征的归一化,例如随机森林,bagging 和 boosting等。

【参考OR摘自以下链接内容】

  1. http://www.bubuko.com/infodetail-2397564.html
  2. https://www.cnblogs.com/daguankele/p/6595470.html
image.png

你可能感兴趣的:(scikit_learn学习笔记十——机器学习之LabelEncoder与OneHotEncode(独热码))