機器學習常見問題 - 類別變量處理

類別變量類型:

  • Nominal: 紅,黃,藍
  • Ordinal,高,中,低

連續變量:1.1,2.1,1.3,1.4

 

類別變量問題的一些挑戰

  • 類別數量很多,但是每個類別的樣本不多,例如“城市”
  • 一些機器學習模型,例如迴歸或者SVM 需要輸入是數值型的,類別需要先轉化成數值才能應用這些算法
  • 對於機器來說,不一定能輕鬆理解一些人理解的信息,例如 北京,上海,杭州三個城市,人可以知道上海到杭州更近點,但是對於模型來說,僅僅代表三個不同的level,所以需要增加一些額外的信息。

 

幾種處理方法:

  • one-hot encoding 

[2] 中提到直接用pandas中的get_dummies 函數就可以做處理,方便點;當然,sklearn中也有支持的,具體見文章吧

import pandas as pd


data=pd.DataFrame({
    "x":["黃瓜","黃瓜","南瓜","冬瓜"],
    "y":["紅","藍","白","黑"]
})

df=pd.get_dummies(data,prefix="蔬菜",columns=["x"])
print(df)


# 輸出
   y  蔬菜_冬瓜  蔬菜_南瓜  蔬菜_黃瓜
0  紅      0      0      1
1  藍      0      0      1
2  白      0      1      0
3  黑      1      0      0

針對迴歸模型,對one-hot編碼後的特徵,需要刪除第1列或者最後一列,需要滿足自由度爲N-1的要求,說白了,是共線性的問題!對於SVM,神經網絡和一些聚類算法也是如此操作。

但是在樹模型中,我們需要用到N個one-hot編碼後的特徵

 

  • label encoding

用1...N 表示類別,例如,逾期,正常還款用 1,2 來表示 ; 這個編碼會有個問題,實際上類別之間是沒有關係的,但機器會認爲他們有關係。

                                                                         df1=data.copy()                                                          
df1.loc[:,"x_encode"] =pd.factorize(df1["x"])[0].reshape(-1,1)           
print(df1)    

# 輸出

    x  y  x_encode
0  黃瓜  紅         0
1  黃瓜  藍         0
2  南瓜  白         1
3  冬瓜  黑         2                                                           
  • binary encoding

需要經歷兩個步驟:

1.類別變量首先需要轉化爲數值有序變量,比如1,2,3,4 這種 ,這裏的有序僅僅是數字上的有序

2.將上一步的結果轉爲爲二進制,比如 4,轉化爲 100 ,1 轉爲爲 001

import category_encoders  as ce

bencoder=ce.BinaryEncoder(cols=["x","y"])  
dfbin=bencoder.fit_transform(data)         
print(dfbin)                               

# 輸出
   x_0  x_1  x_2  y_0  y_1  y_2
0    0    0    1    0    0    1
1    0    0    1    0    1    0
2    0    1    0    0    1    1
3    0    1    1    1    0    0

 

其他常見的方法還有WOE,均值,頻度等,這裏就不介紹,具體可以參見如下的refer

 

refer:

[1] https://hub.packtpub.com/how-to-handle-categorical-data-for-machine-learning-algorithms/ 

[2] https://towardsdatascience.com/all-about-categorical-variable-encoding-305f3361fd02

[3] https://www.datacamp.com/community/tutorials/categorical-data 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章