欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sklearn:OneHotEncoder的简单用法

程序员文章站 2022-07-13 08:07:16
...

将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。离散特征进行one-hot编码后,编码后的特征,其实每一维度的特征都可以看做是连续的特征。就可以跟对连续型特征的归一化方法一样,对每一维特征进行归一化。

from sklearn.preprocessing import OneHotEncode

enc = OneHotEncoder()

在新版本中,初始化参数有5个,分别是categories、drop、sparse、dtype、handle_unknown。本人目前是初学者,读了官方文档后,认为前四个参数不用理会,默认即可,而handle_unknown是一个比较有用的参数,默认是"error",但我认为指定为"ignore”更好,这个参数的目的是数据在转化为one-hot编码时,如果遇到一个属性值没有事先指定,程序应该怎么办?如果是error的话,程序就报错停止了,其实不方便处理数据,反而是ignore更好,程序可以继续执行,下面举个例子说明。

enc.fit([["男", 0, 3], ["男", 1, 0], ["女", 2, 1], ["女", 0, 2]])

首先训练一下数据集,提取每一列的属性种类,得到结果如下

print(enc.categories_)
[array(['女', '男'], dtype=object), array([0, 1, 2], dtype=object), array([0, 1, 2, 3], dtype=object)]

意思是第一个特征有两个取值,分别为男和女,以此类推
如果handle_unknown默认的话,执行下面的语句就会报错:

print((enc.transform([["男", 0, 3], ["中性", 1, 0], ["女", 2, 1], ["女", 0, 2]]).toarray()))

因为“中性”没有训练过,所以碰到这个不知道怎么办了,就报错停止了
但是如果指定handle_unknown为ignore,就不会出报错,某种程度上,这样更好

enc = OneHotEncoder(handle_unknown='ignore')

这样我们就可以看到最后的one-hot编码:

[[0. 1. 1. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 1. 0. 1. 0. 0. 0.]
 [1. 0. 0. 0. 1. 0. 1. 0. 0.]
 [1. 0. 1. 0. 0. 0. 0. 1. 0.]]

可以注意到第二行,中性因为没有事先指定,所以显示0,0,而没有报错
如何查看独热编码每一列代表的意义呢?可以使用get_feature_names()方法

print(enc.get_feature_names())

最后可以看到特征名如下所示,对应上面的矩阵:

['x0_女' 'x0_男' 'x1_0' 'x1_1' 'x1_2' 'x2_0' 'x2_1' 'x2_2' 'x2_3']