Python数据预处理中的LabelEncoder与OneHotEncoder

1、LabelEncoder

LabelEncoder是用来对分类型特征值进行编码,即对不连续的数值或文本进行编码。其中包含以下常用方法:

fit(y) :fit可看做一本空字典,y可看作要塞到字典中的词。
fit_transform(y):相当于先进行fit再进行transform,即把y塞到字典中去以后再进行transform得到索引值。
inverse_transform(y):根据索引值y获得原始数据。
transform(y) :将y转变成索引值。

如:

>>> from sklearn import preprocessing
>>> le = preprocessing.LabelEncoder()
>>> le.fit([1, 2, 2, 6])
LabelEncoder()
>>> le.classes_
array([1, 2, 6])
>>> le.transform([1, 1, 2, 6]) 
array([0, 0, 1, 2]...)
>>> le.inverse_transform([0, 0, 1, 2])
array([1, 1, 2, 6])
>>> le = preprocessing.LabelEncoder()
>>> le.fit(["paris", "paris", "tokyo", "amsterdam"])
LabelEncoder()
>>> list(le.classes_)
['amsterdam', 'paris', 'tokyo']
>>> le.transform(["tokyo", "tokyo", "paris"]) 
array([2, 2, 1]...)
>>> list(le.inverse_transform([2, 2, 1]))
['tokyo', 'tokyo', 'paris']

2、OneHotEncoder

有一些特征并不是以连续值的形式给出。例如:人的性别 [“male”, “female”],来自的国家 [“from Europe”, “from US”, “from Asia”],使用的浏览器[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”]。这种特征可以采用整数的形式进行编码,如: [“male”, “from US”, “uses Internet Explorer”] 可表示成 [0, 1, 3] ,[“female”, “from Asia”, “uses Chrome”] 可表示成[1, 2, 1]。 但是,这些整数形式的表示不能直接作为某些机器学习算法输入,因为有些机器学习算法是需要连续型的输入数据,同一列数据之间数值的大小可代表差异程度。如: [0, 1, 3]与[0,1,0]的特征差异比[0, 1, 3]与[0,1,2]之间的差异要大,但事实上它们的差异是一样的,都是浏览器使用不一样。

一个解决办法就是采用OneHotEncoder,这种表示方式将每一个分类特征变量的m个可能的取值转变成m个二值特征,对于每一条数据这m个值中仅有一个特征值为1,其他的都为0。

例如:

>>> enc = preprocessing.OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])  # 注意:第123列分别有234个可能的取值
OneHotEncoder(categorical_features='all', dtype=<... 'numpy.float64'>,
       handle_unknown='error', n_values='auto', sparse=True)
>>> enc.transform([[0, 1, 3]]).toarray() #要对[0,1,3]进行编码
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  1.]]) # [1,0]对应数值0,[0,1,0]对应数值1,[0,0,0,1]对应数值3

3、LabelEncoder与OneHotEncoder的混合使用方式

from sklearn.preprocessing import LabelEncoder,OneHotEncoder
enc = OneHotEncoder()
lb = LabelEncoder()
tmp = lb.fit_transform([123,456,789])
print(tmp)#输出LabelEncoder的结果
enc.fit(tmp.reshape(-1,1))#将LabelEncoder的结果作为OneHotEncoder特征输入
x_train = enc.transform(lb.transform([123,789]).reshape(-1, 1))
#输出特征[123,789]的OneHotEncoder的编码结果
print(x_train)

输出为:

[0 1 2]
(0, 0) 1.0 # 第0行第0列为1,其它为0
(1, 2) 1.0 #第1行第2列为1,其它为0

参考:
LabelEncoder
OneHotEncoder

你可能感兴趣的:(机器学习,python)