天天看点

OneHotEncoder独热编码和LabelEncoder标签编码

特征类别:连续型特征和离散型特征。

数据处理时会用到以下的知识:

  • 连续性特征使用归一化,

特征A的取值范围是[-1000,1000],特征B的取值范围是[-1,1]。

如果使用logistic回归,w1x1+w2x2,因为x1的取值太大了,所以x2基本起不了作用。

所以,必须进行特征的归一化,每个特征都单独进行归一化。

  • 离散型使用独热编码(哑变量)。

OneHotEncoder独热编码

什么是独热编码

独热码,称做 one-hot code(多么直观的英文啊), 好像也叫做(哑变量 dummy variable)。

直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。

举例如下:假如有三种颜色特征:红、黄、蓝。 在利用机器学习的算法时一般需要进行向量化或者数字化。那么你可能想令 红=1,黄=2,蓝=3.

那么这样其实实现了标签编码,即给不同类别以标签。然而这意味着机器可能会学习到“红<黄<蓝”,但这并不是我们的让机器学习的本意,只是想让机器区分它们,并无大小比较之意。所以这时标签编码是不够的,需要进一步转换。因为有三种颜色状态,所以就有3个比特。

为什么要使用独热编码

独热编码是因为大部分算法是基于向量空间中的度量来进行计算的,为了使非偏序关系的变量取值不具有偏序性,并且到圆点是等距的。使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。

离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1。

注意⚠️:

为什么特征向量要映射到欧式空间?

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

独热编码优缺点

优点:独热编码解决了分类器不好处理属性数据的问题,在一定程度上也起到了扩充特征的作用。它的值只有0和1,不同的类型存储在垂直的空间。

缺点:当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。

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

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

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

总的来说,要是one hot encoding的类别数目不太多,建议优先考虑。

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

需要: 基于参数的模型或基于距离的模型,都是要进行特征的归一化。

不需要:基于树的方法是不需要进行特征的归一化,例如随机森林,bagging 和 boosting等。

注意:⚠️

在sklearn和pandas中都有关于独热编码的函数,推荐采用

pands.get_dummies()

函数

=====================================================

LabelEncoder标签编码

作用:标准化标签,将标签值统一转换成range(标签值个数-1)范围内(给特征打编号)

In [1]: from sklearn import preprocessing
   ...: le =preprocessing.LabelEncoder()
   ...: le.fit(["paris", "paris", "tokyo", "amsterdam"])
   ...: print('标签个数:%s'% le.classes_)
   ...: print('标签值标准化:%s' % le.transform(["tokyo", "tokyo", "paris"]))
   ...: print('标准化标签值反转:%s' % le.inverse_transform([2, 2, 1]))
   ...:
标签个数:['amsterdam' 'paris' 'tokyo']
标签值标准化:[2 2 1]
标准化标签值反转:['tokyo' 'tokyo' 'paris']

           

总结

简单来说 LabelEncoder 是对不连续的数字或者文本进行编号,OneHotEncoder 用于将表示分类的数据扩维。

继续阅读