1、独热编码OneHotEncoder() 

from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])    # fit来学习编码
enc.transform([[0, 1, 3]]).toarray()    # 进行编码

   输出:array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]])
解释:再来看要进行编码的参数[0 , 1,  3], 0作为第一个特征编码为10,  1作为第二个特征编码为010, 3作为第三个特征编码为0001.  故此编码结果为 1 0 0     1 0 0      0 0 1 

优点:使用one-hot编码,将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。比如归一化到[-1,1]或归一化到均值为0,方差为1。

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

适用场景:Tree Model不太需要one-hot编码: 对于决策树来说,one-hot的本质是增加树的深度。基于距离的近邻需要,如KNN

使用:

enc.fit(df['column1','column2',...])

enc.transform(df['column1','column2',...])

即可把df的column1和column2变成独热编码(假如是性别列:则男变成(1,0)女变成(0,1))

2、数字标签替换 LabelEncoder 

# coding:utf-8
from sklearn import preprocessing
 
le = preprocessing.LabelEncoder()
le.fit(["Japan", "china", "Japan", "Korea","china"])
print('标签个数:%s' % le.classes_)
print('标签值标准化:%s' % le.transform(["Japan", "china", "Japan", "Korea","china"]))
print('标准化标签值反转:%s' % le.inverse_transform([0, 2 ,0 ,1 ,2]))
 
# 标签个数:['Japan' 'Korea' 'china']
# 标签值标准化:[0 2 0 1 2]
# 标准化标签值反转:['Japan' 'china' 'Japan' 'Korea' 'china']

缺点:比如有[dog,cat,dog,mouse,cat],我们把其转换为[1,2,1,3,2]。这里就产生了一个奇怪的现象:dog和mouse的平均值是cat。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐