類別變量類型:
- 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