天天看點

機器學習—特征工程—OneHotEncoder獨熱編碼

獨熱編碼

一、為什麼要獨熱編碼?

獨熱編碼(是因為大部分算法是基于向量空間中的度量來進行計算的,為了使非偏序關系的變量取值不具有偏序性,并且到原點是等距的。使用one-hot編碼,将離散特征的取值擴充到了歐式空間,離散特征的某個取值就對應歐式空間的某個點。将離散型特征使用one-hot編碼,會讓特征之間的距離計算更加合理。離散特征進行one-hot編碼後,編碼後的特征,其實每一次元的特征都可以看做是連續的特征。就可以跟對連續型特征的歸一化方法一樣,對每一維特征進行歸一化。比如歸一化到[-1,1]或歸一化到均值為0,方差為1。

為什麼特征向量要映射到歐式空間?

将離散特征通過one-hot編碼映射到歐式空間,是因為,在回歸,分類,聚類等機器學習算法中,特征之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算餘弦相似性,基于的就是歐式空間。

二、獨熱編碼的優缺點

優點:獨熱編碼解決了分類器不好處理屬性資料的問題,在一定程度上也起到了擴充特征的作用。它的值隻有0和1,不同的類型存儲在垂直的空間。

缺點:當類别的數量很多時,特征空間會變得非常大,成為一個高維稀疏矩陣。在這種情況下,一般可以用PCA來減少次元。而且one hot encoding+PCA這種組合在實際中也非常有用。

三、什麼情況下(不)用獨熱編碼?

用:獨熱編碼用來解決類别型資料的離散值問題,

不用:将離散型特征進行one-hot編碼的作用,是為了讓距離計算更合理,但如果特征是離散的,并且不用one-hot編碼就可以很合理的計算出距離,那麼就沒必要進行one-hot編碼。 有些基于樹的算法在處理變量時,并不是基于向量空間度量,數值隻是個類别符号,即沒有偏序關系,是以不用進行獨熱編碼。 Tree Model不太需要one-hot編碼: 對于決策樹來說,one-hot的本質是增加樹的深度。

總的來說,要是one hot encoding的類别數目不太多,建議優先考慮。

OneHotEncoder()内部參數

OneHotEncoder(n_values=’auto’, categorical_features=’all’, dtype=<class ‘numpy.float64’>, sparse=True, handle_unknown=’error’)

n_values=’auto’,表示每個特征使用幾維的數值由資料集自動推斷,即幾種類别就使用幾位來表示。

categorical_features = ‘all’,這個參數指定了對哪些特征進行編碼,預設對所有類别都進行編碼。

sparse=True 表示編碼的格式,預設為 True,即為稀疏的格式,指定 False 則就不用 toarray() 了

handle_unknown=’error’,其值可以指定為 “error” 或者 “ignore”,即如果碰到未知的類别,是傳回一個錯誤還是忽略它。

官方解析

舉例:

import pandas as pd
a = pd.DataFrame([[1,2,3],
                  [4,5,6],
                  [10,8,9]],columns = ["feature_1", "feature_2", "label"])

from sklearn.preprocessing import OneHotEncoder

#sparse表示編碼的格式,預設為 True,即為稀疏的格式,指定 False 則就不用 toarray() 了
#handle_unknown其值可以指定為 "error" 或者 "ignore",即如果碰到未知的類别,是傳回一個錯誤還是忽略它。

hotCoder=OneHotEncoder(sparse = False, handle_unknown = "ignore")

hot = hotCoder.fit_transform(a)
print(hot)
print(pd.DataFrame(hot))
           

結果展示

[[1. 0. 0. 1. 0. 0. 1. 0. 0.]
 [0. 1. 0. 0. 1. 0. 0. 1. 0.]
 [0. 0. 1. 0. 0. 1. 0. 0. 1.]]
     0    1    2    3    4    5    6    7    8
0  1.0  0.0  0.0  1.0  0.0  0.0  1.0  0.0  0.0
1  0.0  1.0  0.0  0.0  1.0  0.0  0.0  1.0  0.0
2  0.0  0.0  1.0  0.0  0.0  1.0  0.0  0.0  1.0
           

繼續閱讀