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特徵的每一個取值是 ”地位平等
那麼什麼樣的特徵需要獨熱編碼呢?
“無序的離散特徵”我們一般需要進行獨熱編碼。但有一些不需要,比如人的身高,體重,這其實是有序的,連續的。
獨熱編碼會為每個離散值建立一個啞特徵(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個離散值。