獨熱編碼(OneHotEncoder)和標籤編碼(LabelEncoder)

數據分類

我們在構建模型對數據進行訓練之前,需要對數據進行特徵工程,我們的數據可以分爲連續型和離散型。
對於連續型數據,我們一般的做法是對其進行標準化或者歸一化,之前寫過一篇標準化和歸一化的介紹,大家有興趣的可以看一下:https://blog.csdn.net/weixin_43172660/article/details/83826051
對於離散型數據,我們基本就是按照one-hot(獨熱)編碼,該離散特徵有多少取值,就用多少維來表示該特徵。

獨熱編碼(OneHotEncoder)

對於離散型數據,比如一個特徵爲顏色,他一共有三個值,分別爲紅,藍,綠,按照正常想法,我們可能認爲,令紅色=0,藍色=1,綠色=2,這樣對數據進行了編碼,但是,如果把這些數據放到需要計算距離的或者其他模型中,模型會認爲重要性是綠色>藍色>紅色。但這並不是我們的讓機器學習的本意,只是想讓機器區分它們,並無大小比較之意。所以這時標籤編碼是不夠的,需要進一步轉換。我們可以設置,這個特徵有三個取值,我們可以設置三列,分別是紅,藍,綠,對於紅色,它的取值是1,0,0,對於藍色,它的取值是0,1,0,而對於綠色,它的取值是0,0,1。如此一來每兩個向量之間的距離都是根號2,在向量空間距離都相等,所以這樣不會出現偏序性,基本不會影響基於向量空間度量算法的效果。下面我們來舉一個例子,利用sklearn實現獨特編碼。

from sklearn import preprocessing #引入數據預處理模塊
ohe = preprocessing.OneHotEncoder()
ohe.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])#先fit
ohe.transform([[0, 1, 3]]).toarray()#後transform

輸出

array([[1., 0., 0., 1., 0., 0., 0., 0., 1.]])

說下這個例子,一共有三個特徵。
第一個特徵的取值是0,1,
第二個特徵的取值是0,1,2,
第三個特徵的取值是0,1,2,3。
第一個特徵,我們可以把它變成兩列,如果取值是0,則這兩列的取值是1,0 如果取值是1,則爲0,1。
第二個特徵,變成三列,取值分別爲1,0,0 / 0,1,0 / 0,0,1
第三個特徵,變成四列,取值分別爲1,0,0,0 / 0,1,0,0 / 0,0,1,0 / 0,0,0,1
通過獨熱編碼,三列的特徵被我們變成了2+3+4=9列的特徵。
對於0,1,3這個數字,我們就變爲了1,0,0,1,0,0,0,0,1。

獨熱編碼優點

通過獨熱編碼,會讓特徵之間的距離計算更加合理,並且,將特徵轉爲0,1,有利於提升計算速度。要是one hot encoding的類別數目不太多,建議優先考慮。 當類別的數量很多時,特徵空間會變得非常大。在這種情況下,一般可以用PCA來減少維度。而且one hot encoding+PCA這種組合在實際中也非常有用。

標籤編碼(LabelEncoder)

剛纔那個,例子,我們將紅,藍,綠轉化爲0,1,2就是標籤編碼,將轉換成連續的數值型變量。即是對不連續的數字或者文本進行編號。舉一個簡單的例子:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit([1,5,67,100])
print(le.classes_)
le.transform([1,1,100,67,5])

輸出

array([0,0,3,2,1])

總結

上面基本介紹了,如果遇到了離散型數據,我們需要怎麼處理,這樣有利於我們進行模型預測, 提高準確率。

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