1. 程式人生 > >從零開始-Machine Learning學習筆記(19)-One-hot與啞變數的區別與聯絡

從零開始-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編碼。