独热编码(OneHotEncoder)和标签编码(LabelEncoder)

数据分类

我们在构建模型对数据进行训练之前,需要对数据进行特征工程,我们的数据可以分为连续型和离散型。
对于连续型数据,我们一般的做法是对其进行标准化或者归一化,之前写过一篇标准化和归一化的介绍,大家有兴趣的可以看一下:https://blog.csdn.net/weixin_43172660/article/details/83826051
对于离散型数据,我们基本就是按照one-hot(独热)编码,该离散特征有多少取值,就用多少维来表示该特征。

独热编码(OneHotEncoder)

对于离散型数据,比如一个特征为颜色,他一共有三个值,分别为红,蓝,绿,按照正常想法,我们可能认为,令红色=0,蓝色=1,绿色=2,这样对数据进行了编码,但是,如果把这些数据放到需要计算距离的或者其他模型中,模型会认为重要性是绿色>蓝色>红色。但这并不是我们的让机器学习的本意,只是想让机器区分它们,并无大小比较之意。所以这时标签编码是不够的,需要进一步转换。我们可以设置,这个特征有三个取值,我们可以设置三列,分别是红,蓝,绿,对于红色,它的取值是1,0,0,对于蓝色,它的取值是0,1,0,而对于绿色,它的取值是0,0,1。如此一来每两个向量之间的距离都是根号2,在向量空间距离都相等,所以这样不会出现偏序性,基本不会影响基于向量空间度量算法的效果。下面我们来举一个例子,利用sklearn实现独特编码。

from sklearn import preprocessing #引入数据预处理模块
ohe = preprocessing.OneHotEncoder()
ohe.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])#先fit
ohe.transform([[0, 1, 3]]).toarray()#后transform

输出

array([[1., 0., 0., 1., 0., 0., 0., 0., 1.]])

说下这个例子,一共有三个特征。
第一个特征的取值是0,1,
第二个特征的取值是0,1,2,
第三个特征的取值是0,1,2,3。
第一个特征,我们可以把它变成两列,如果取值是0,则这两列的取值是1,0 如果取值是1,则为0,1。
第二个特征,变成三列,取值分别为1,0,0 / 0,1,0 / 0,0,1
第三个特征,变成四列,取值分别为1,0,0,0 / 0,1,0,0 / 0,0,1,0 / 0,0,0,1
通过独热编码,三列的特征被我们变成了2+3+4=9列的特征。
对于0,1,3这个数字,我们就变为了1,0,0,1,0,0,0,0,1。

独热编码优点

通过独热编码,会让特征之间的距离计算更加合理,并且,将特征转为0,1,有利于提升计算速度。要是one hot encoding的类别数目不太多,建议优先考虑。 当类别的数量很多时,特征空间会变得非常大。在这种情况下,一般可以用PCA来减少维度。而且one hot encoding+PCA这种组合在实际中也非常有用。

标签编码(LabelEncoder)

刚才那个,例子,我们将红,蓝,绿转化为0,1,2就是标签编码,将转换成连续的数值型变量。即是对不连续的数字或者文本进行编号。举一个简单的例子:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
print(le.classes_)
le.transform([1,1,100,67,5])

输出

array([0,0,3,2,1])

总结

上面基本介绍了,如果遇到了离散型数据,我们需要怎么处理,这样有利于我们进行模型预测, 提高准确率。

你可能感兴趣的:(特征工程,数据预处理)