數據預處理之將類別數據數字化的方法—— LabelEncoder VS OneHotEncoder
02-09
LabelEncoder 和 OneHotEncoder 是什麼
- 在數據處理過程中,我們有時需要對不連續的數字或者文本進行數字化處理。
- 在使用 Python 進行數據處理時,用 encoder 來轉化 dummy variable(虛擬數據)非常簡便,encoder 可以將數據集中的文本轉化成0或1的數值。
- LabelEncoder 和 OneHotEncoder 是 scikit-learn 包中的兩個功能,可以實現上述的轉化過程。
- sklearn.preprocessing.OneHotEncoder 的官方介紹:LabelEncoder
- sklearn.preprocessing.OneHotEncoder 的官方介紹:OneHotEnncoder
數據集中的類別數據
在使用回歸模型和機器學習模型時,所有的考察數據都是數值更容易得到好的結果。因為回歸和機器學習都是基於數學函數方法的,所以當我們要分析的數據集中出現了類別數據(categorical data),此時的數據是不理想的,因為我們不能用數學的方法處理它們。例如,在處理男和女兩個性別數據時,我們用0和1將其代替,再進行分析。由於這種情況的出現,我們需要可以將文字數字化的現成方法。
LabelEncoder 和 OneHotEncoder 的例子
下面是一個使用 Python sci-kit 包中 LableEncoder 和 OneHotEncoder 的具體例子:
- 首先,我們需要創建一個變數 encoder_x 來進行編碼工作。
- 程序執行過後,我們的類別數據就被轉化成了數值0、1、2、3.
- 顯然這種結果還不理想,因為計算機會對這些數值進行對比,例如2比1大,3比2也大,不利於我們進行數據分析。所以我們需要對這些數值進行再次的處理,得到一些虛擬數據。
- 接下來我們就需要藉助 OneHotEncoder 來創造一些虛擬數據。
- OneHotEncoder 可以把數據分成多個不同的列,每一列都用0或1來表示。
- 使用 OneHotEncoder 時,我們需要指明要處理的列。在這個例子中,我們想對第一列虛擬數據進行編碼處理,所以我們設定 categorical_features 中的 index=0。
下面是具體代碼:
from sklearn.preprocessing import LabelEncoder, OneHotEncoderencoder_x=LabelEncoder()x[:,0]=encoder_x.fit_transform(x[:,0])onehotencoder = onehotencoder(categorical_features = [0])x=onehotencoder.fit_transform(x).toarray()x=[:,1:]
遠離虛擬數據陷阱
- 如果數據集裡面有一個以上的虛擬變數,而且這些虛擬變數之間又有聯繫,這樣的數據集被數字化編碼以後就容易掉入虛擬數據陷阱。
- 在上面的例子中,如果被分析變數不是 b, c 或 d,那麼一定就是 a! 所以就會出現虛擬變數陷阱,這個陷阱的實質其實就是完全共線性。(矩陣不是滿秩的)
- 接下來,我們需要去掉虛擬變數中的一列。也就是說,如果有 m 個定性變數,我們就引入 m-1 個虛擬變數。
- 代碼的最後一行 x=[:,1:] 作用是,從第1列開始複製數據中的所有行和所有列。
- 至此,第一列啞數據被去除了,虛擬數據陷阱就得以避免了。
LabelEncoder 和 OneHotEncoder 的區別
- LabelEncoder 將一列文本數據轉化成數值。
- 例如,[red, blue, red, yellow] = [0,2,0,1]
- OneHotEncoder 將一列文本數據轉化成一列或多列只有0和1的數據。
- 例如,[red, blue, red, yellow] = [1,2,1,3] 會被轉化成3列用0和1表示的數據列,如下圖:
推薦閱讀:
※複雜數據處理(下):1816-2013年拉薩年平均氣溫變化分析
※fMRI experiment Design:GLM引發的一些實驗設計要求
※不會excel,也能玩轉數據分析?