1. 程式人生 > >sklearn資料預處理(preprocessing)系列——類別以及特徵的編碼(Encoder)

sklearn資料預處理(preprocessing)系列——類別以及特徵的編碼(Encoder)

 

一、特徵編碼

1 類別的獨熱編碼(One-Hot Encoder)

關於什麼是獨熱編碼以及為什麼要進行獨熱編碼,這裡就不詳細介紹了,本文只介紹“具體實踐方式”,原理一筆帶過。

第一步:先對離散的數字、離散的文字、離散的類別進行編號,使用 LabelEncoder,LabelEncoder會根據取值的種類進行標註。

import sklearn.preprocessing as pre_processing
import numpy as np

label=pre_processing.LabelEncoder()
labels=label.fit_transform(['中國','美國','法國','德國'])
print(labels)

labels的結果為:[0,3,2,1]

第二步:然後進行獨熱編碼,使用OneHotEncoder 

labels=np.array(labels).reshape(len(labels),1) #先將X組織成(sample,feature)的格式

onehot=pre_processing.OneHotEncoder()
onehot_label=onehot.fit_transform(labels)
print(onehot_label.toarray())   #這裡一定要進行toarray()

結果為:

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

注意,上面的第二步也可以使用LabelBinarizer進行替代

onehot_label=pre_processing.LabelBinarizer().fit_transform(labels)

這裡的引數labels就是【0,3,2,1】,不需要組織成(samples,features)的形式。

2、對“特徵”進行編碼

上面講的是對分類的類別進行編碼,有時候也需要對特徵進行編碼,為什麼呢?比如有下面的一些樣本

一共有3個特徵,color  price  size  。  classlabel對應於類別,類別的獨熱編碼上面已經進行了講解,但是特徵為什麼也需要進行獨熱編碼呢,單純的進行數字化難道不行嗎?比如用1表示green,2表示red,3表示blue。這顯然不行,因為對於模型而言,color特徵的每一個取值是 ”地位平等

“的,也就是說所說的”無序性“如果單純的用1、2、3進行數值化,豈不是就說告訴模型,red是green的2倍,blue是green的3倍嗎?這顯然不合理,憑什麼你就是我的3倍,我們都是顏色啊。

那麼什麼樣的特徵需要獨熱編碼呢?

無序的離散特徵”我們一般需要進行獨熱編碼。但有一些不需要,比如人的身高,體重,這其實是有序的,連續的。

獨熱編碼會為每個離散值建立一個啞特徵(dummy feature)。什麼是啞特徵呢?舉例來說,對於‘顏色’這一特徵中的‘藍色’,我們將其編碼為[藍色=1,綠色=0,紅色=0],同理,對於‘綠色’,我們將其編碼為[藍色=0,綠色=1,紅色=0],特點就是向量只有一個1,其餘均為0,故稱之為one-hot。這麼做的目的是為了保證每一個離散取值的“無序性、公平性、彼此正交性”

X=[[1,10.1,1],[2,13.5,2],[3,15.3,3]]
onehot=pre_processing.OneHotEncoder()
features=onehot.fit_transform(X)

print(features.toarray())  #一定要toarray()

上面的原始資料為:

  color price size
1 1 10.1 1
2 2 13.5 2
3 3 15.3 3

先使用了LabelEncoder對color這一列,size這一列進行的“標籤編碼",參見上面。

執行結果為:

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

即下面的結果:

  color_1 color_2 color_3 price_1 price_2 price_3 size_1 size_2 size_3
1 1 0 0 1 0 0 1 0 0
2 0 1 0 0 1 0 0 1 0
3 0 0 1 0 0 1 0 0 1

3、OneHotEncoder類的詳解

下面列出在使用它的時候要注意的一些問題:

(1)給fit_transform傳遞的X一定要是 2D的,即(samples,features),否則會報錯

(2)要檢視fit_transform返回的結果,一定要使用toarray()函式進一步轉化,方便檢視

(3)在沒有缺失資料的時候,每一個離散特徵取值種類是自動計算的,但是如果有某個特徵值丟失了,則需要自己手動指定,如下:

enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4])  ,

##  2 表示的是 X1有兩個離散值,3 表示的是X2有三個離散值, 4 表示的是X4有4個離散值。