OneHotEncoder獨熱編碼和 LabelEncoder標簽編碼
轉自https://www.cnblogs.com/king-lps/p/7846414.html
獨熱碼的例子:
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]) # fit來學習編碼
enc.transform([[0, 1, 3]]).toarray() # 進行編碼
輸出:array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])
數據矩陣是4*3,即4個數據,3個特征維度。
0 0 3 觀察左邊的數據矩陣,第一列為第一個特征維度,有兩種取值0\1. 所以對應編碼方式為10 、01
1 1 0 同理,第二列為第二個特征維度,有三種取值0\1\2,所以對應編碼方式為100、010、001
0 2 1 同理,第三列為第三個特征維度,有四中取值0\1\2\3,所以對應編碼方式為1000、0100、0010、0001
1 0 2 再來看要進行編碼的參數[0 , 1, 3], 0作為第一個特征編碼為10, 1作為第二個特征編碼為010, 3作為第三個特征編碼為0001. 故此編碼結果為 1 0 0 1 0 0 0 0 1
利用LabelEncoder() 將轉換成連續的數值型變量:
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
le.transform([1,1,100,67,5])
輸出: array([0,0,3,2,1])
為什么要獨熱編碼?
正如上文所言,獨熱編碼(啞變量 dummy variable)是因為大部分算法是基于向量空間中的度量來進行計算的,為了使非偏序關系的變量取值不具有偏序性,并且到圓點是等距的。使用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的類別數目不太多,建議優先考慮。
五. 什么情況下(不)需要歸一化?
需要: 基于參數的模型或基于距離的模型,都是要進行特征的歸一化。
不需要:基于樹的方法是不需要進行特征的歸一化,例如隨機森林,bagging 和 boosting等。
標準化
from sklearn.preprocessing import StandardScaler
#標準化,返回值為標準化后的數據
StandardScaler().fit_transform(iris.data)
區間縮放法
from sklearn.preprocessing import MinMaxScaler
#區間縮放,返回值為縮放到[0, 1]區間的數據
MinMaxScaler().fit_transform(iris.data)
歸一化
from sklearn.preprocessing import MinMaxScaler
#區間縮放,返回值為縮放到[0, 1]區間的數據
MinMaxScaler().fit_transform(iris.data)
歸一化
簡單來說,標準化是依照特征矩陣的列處理數據,其通過求z-score的方法,將樣本的特征值轉換到同一量綱下。歸一化是依照特征矩陣的行處理數據,其目的在于樣本向量在點乘運算或其他核函數計算相似性時,擁有統一的標準,也就是說都轉化為“單位向量”。規則為l2的歸一化公式如下:
二值化
from sklearn.preprocessing import Binarizer
#二值化,閾值設置為3,返回值為二值化后的數據
Binarizer(threshold=3).fit_transform(iris.data)