什么是分類變量膝捞?
- 通常來說,分類變量是用來表示類別或標(biāo)記的愧沟。小型分類變量例如:一年中的四季蔬咬,行業(yè)(銀行、保險沐寺、券商林艘、科技......),一線城市“北上廣深”等等混坞;大型分類變量例如:IP地址狐援,用戶ID,語料庫的詞匯表等等
- 不管類別的大小究孕,分類變量有2個顯而易見的特點(diǎn):數(shù)量有限且無序啥酱。因此在很多涉及到數(shù)值度量的模型中,如:LR厨诸,SVM等镶殷,我們不能像處理數(shù)值型變量那樣來處理分類變量。
-
所以今天我們來講講小型分類變量的常見處理方式:one-hot編碼微酬,虛擬編碼和效果編碼绘趋,以及通過虛構(gòu)的“城市&租金”數(shù)據(jù)來看看,三者之間的聯(lián)系與差異颗管。
one-hot編碼(one-hot encoding)
- 在虛構(gòu)的“城市&租金”數(shù)據(jù)中陷遮,“CITY”特征有BJ, SH, SZ三種值,我們可以簡單地為其標(biāo)注為0忙上,1拷呆,2,但是這樣做的結(jié)果是使類別彼此之間有了順序和大小關(guān)系疫粥。所以更好地方法是使用一組比特位茬斧,每個比特位表示一種可能的類別,因此k個類別的分類變量就可以編碼為長度為k的特征向量梗逮。one-hot encoding可以用scikit-learn中的sklearn.proprocessing.OneHotEncoder來實(shí)現(xiàn)项秉,在這里我們用pandas.get_dummies實(shí)現(xiàn)。
pd.get_dummies(df, columns=["CITY"])
虛擬編碼(dummy encoding)
- 在one-hot編碼中慷彤,我們看到分類變量有k個類別娄蔼,就用了長度為k的特征向量來表示怖喻。而在虛擬編碼中,我們只使用長度為(k-1)的特征向量來表示岁诉,被去掉的特征被一個全零向量所替代锚沸,它被稱為參照類。
pd.get_dummies(df, columns=["CITY"], drop_first=True)
效果編碼(effect coding)
- 另一種編碼是效果編碼涕癣,與虛擬編碼非常相似哗蜈,區(qū)別在于效果編碼的參照類由全零向量變成了全部由-1組成的向量來表示。
#先進(jìn)行虛擬編碼
dummyDF = pd.get_dummies(df, columns=["CITY"], drop_first=True)
#對編碼過后的DF進(jìn)行效果編碼形式的轉(zhuǎn)換
dummy2effect(dummyDF, columns)
#虛擬編碼轉(zhuǎn)為效果編碼的函數(shù)
def dummy2effect(dummyDF, columns):
"""將經(jīng)過虛擬編碼的DF轉(zhuǎn)變?yōu)樾Ч幋a的形式"""
dummyColumns = dummyDF.columns.tolist()
effectCols = [[newCol for newCol in dummyColumns if newCol.split("_")[0]==col] for col in columns ]
effectDF = dummyDF.copy()
for pairCols in effectCols:
featureidx = [dummyColumns.index(c) for c in pairCols]
sampleidx = np.nonzero(dummyDF[effectCols[0]].sum(axis=1).values == 0)[0]
effectDF.iloc[sampleidx, featureidx] = -1.
return effectDF
三種編碼的解釋性
- 對編碼后的數(shù)據(jù)分別進(jìn)行線性回歸坠韩,再依次進(jìn)行解釋距潘。
if __name__ == "__main__":
df = pd.DataFrame({'CITY':['BJ','BJ','BJ','SH','SH','SH','SZ','SZ','SZ'],
'RENT':[3999,4000,4001,3499,3500,3501,2999,3000,3001]})
#分別進(jìn)行編碼
onehot_df = coding(df, ["CITY"], "one-hot")
dummy_df = coding(df, ["CITY"], "dummy")
effect_df = coding(df, ["CITY"], "effect")
#分別進(jìn)行線性回歸
from sklearn import linear_model
clf_onehot = linear_model.LinearRegression()
clf_onehot.fit(onehot_df.drop("RENT", axis=1), onehot_df["RENT"])
clf_dummy = linear_model.LinearRegression()
clf_dummy.fit(dummy_df.drop("RENT", axis=1), dummy_df["RENT"])
clf_effect = linear_model.LinearRegression()
clf_effect.fit(effect_df.drop("RENT", axis=1), effect_df["RENT"])
- 我們可以發(fā)現(xiàn),在one-hot編碼中只搁,截距代表了整體Y值(租金)的均值音比,每個線性系數(shù)代表了相應(yīng)城市的租金均值與整體租金均值有多大差別。
- 在虛擬編碼中氢惋,截距代表了參照類Y值(租金)的均值洞翩,本例中的參照類是BJ,第i個特征的系數(shù)等于第i個類別的租金均值與參照類均值的差異焰望。
- 在效果編碼中菱农,截距代表了整體Y值(租金)的均值,各個系數(shù)表示了各個類別的均值與整體均值之間的差柿估,此處BJ的均值當(dāng)且僅當(dāng)"CITY_SH=CITY_SZ=-1"時所取到的值。
以上就是one-hot, 虛擬編碼, 效果編碼的簡單介紹陷猫,謝謝閱讀秫舌。
全部代碼可前往以下地址下載:
https://github.com/shoucangjia1qu/ML_gzh/tree/master/FeatureEngineer
*本文知識點(diǎn)參考了Alice Zheng 的《Mastering Feature Engineering Principles and Techniques for Data Scientists》一書。
學(xué)無止境绣檬,歡迎關(guān)注筆者公眾號足陨,互相學(xué)習(xí)!