從零開始-Machine Learning學習筆記(19)-One-hot與啞變數的區別與聯絡
One-hot與啞變數的區別與聯絡
1. One-hot編碼
獨熱編碼直觀來說就是有多少個狀態就有多少個bit,且只有一個bit是1,其餘全是0的一種編碼方式。舉個例子就是一個氣球有四種顏色紅色R,紫色P,藍色B和黃色Y,我們使用One-hot進行編碼就可以表示為:
紅色R — 0001 紫色P — 0010 藍色B — 0100 黃色Y — 1000
如果此時氣球的特徵還有大小之分,那麼可以給大氣球編碼01,給小氣球編碼10。所以一條資料為紅色大氣球就可編碼為000101,就是將兩個特徵的one-hot編碼進行拼接,在python中我們可以呼叫sklearn中的庫。
from sklearn import preprocessing
import numpy as np
if __name__ == '__main__':
array = np.array([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
print('array = \n', array)
enc = preprocessing.OneHotEncoder()
enc.fit(array)
print('One-hot encoder bit: ', enc.n_values_)
print('One-hot encoder : ',enc.transform( [[0, 1, 3]]).toarray())
輸出結果為:
array = [[0 0 3] [1 1 0] [0 2 1] [1 0 2]] One-hot encoder bit: [2 3 4] One-hot encoder : [[1. 0. 0. 1. 0. 0. 0. 0. 1.]]
可以看到,第一列只有0和1兩個狀態,所以使用了兩位來編碼,第二列有三個狀態0,1,2,所以使用了三位來編碼,第三列有四個狀態,所以使用了4位來編碼,將編碼拼接起來就得到了one-hot編碼。在sklearn中,我們呼叫庫OneHotEncoder()
,呼叫函式fit()
對資料進行訓練,呼叫transform()
對新的資料進行編碼。可以通過呼叫enc.n_values_
fit_transform()
函式對自身進行編碼,如下所示:
print('One-hot encoder : ',enc.fit_transform(array))
輸出結果為:
[[1. 0. 1. 0. 0. 0. 0. 0. 1.] -> 0 0 3 [0. 1. 0. 1. 0. 1. 0. 0. 0.] -> 1 1 0 [1. 0. 0. 0. 1. 0. 1. 0. 0.] -> 0 2 1 [0. 1. 1. 0. 0. 0. 0. 1. 0.]] -> 1 0 2
2. 啞變數與One-hot編碼的區別與聯絡
啞變數與One-hot編碼的區別在於:啞變數將定性特徵轉化為n-1個特徵,而One-hot則是轉化為n個特徵。意思就是啞變數在編碼時會去除第一個狀態,而One-hot則對所有的狀態都會進行編碼。
啞變數可以呼叫pandas中的get_dummies()
來實現:
pd.get_dummies(df,columns = ['df_column_name'],drop_first = True)
其中,drop_first = True
表示去掉第一個狀態,如果這個引數設定為False,則與Onehot編碼一致。
下面用程式碼來說明:
from sklearn import preprocessing
import numpy as np
import pandas as pd
if __name__ == '__main__':
data = pd.DataFrame({'color': ['Red', 'Blue', 'Blue', 'Yellow'], 'size' : [10, 14, 20, 11], 'price' : [5, 6, 10, 5]})
dummy_code1 = pd.get_dummies(data, columns=['color'])
dummy_code2 = pd.get_dummies(data, columns=['color'], drop_first=True)
print(data)
print('drop_first = False:\n', dummy_code1)
print('drop_first = True:\n', dummy_code2)
結果為:
color price size 0 Red 5 10 1 Blue 6 14 2 Blue 10 20 3 Yellow 5 11
drop_first = False: price size color_Blue color_Red color_Yellow 0 5 10 0 1 0 1 6 14 1 0 0 2 10 20 1 0 0 3 5 11 0 0 1
drop_first = True: price size color_Red color_Yellow 0 5 10 1 0 1 6 14 0 0 2 10 20 0 0 3 5 11 0 1
從結果可以看出,如果drop_first = False
則編碼結果就是One-hot編碼,如果設定drop_first = True
,則會去掉第一個狀態,變成了啞變數,用全部為0來表示第一個狀態。
值得注意的是:One-hot不能對字串型別的狀態進行編碼!!!,需要先將字串型別轉化為連續的數值型變數,再進行編碼。
3. 為什麼要使用One-hot編碼
在進行機器學習的時候,我們通常需要對資料進行處理。很多時候我們會遇到字串型的資料,這個時候我們需要把它轉化成我們需要的數值型變數,如性別:男、女。如果我們直接給男賦值為1, 女賦值為0,就會有一個問題出現:男比女大。所以為了避免出現這種由於人為賦值造成的變數間的差異,所以我們採用One-hot編碼。