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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章