數據預處理之將類別數據數字化的方法 —— LabelEncoder VS OneHotEncoder

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 的具體例子:

LableEncoder VS 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, OneHotEncoder
encoder_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表示的數據列,如下圖:

 

歡迎關注我的知乎專欄【數據池塘】,專注於分享機器學習、數據挖掘乾貨:https://zhuanlan.zhihu.com/datapool

 

⬇️ 掃描下方二維碼關注公衆號【數據池塘】 ⬇️

回覆【算法】,獲取最全面的機器學習算法網絡圖:

 

發佈了38 篇原創文章 · 獲贊 23 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章