1. 程式人生 > >資料預處理之將類別資料數字化的方法 —— LabelEncoder VS OneHotEncoder

資料預處理之將類別資料數字化的方法 —— 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表示的資料列,如下圖: