將離散型特征使用one-hot編碼,會讓特征之間的距離計算更加合理。離散特征進行one-hot編碼后,編碼后的特征,其實每一維度的特征都可以看做是連續的特征。就可以跟對連續型特征的歸一化方法一樣,對每一維特征進行歸一化。
from sklearn.preprocessing import OneHotEncode
參數:
OneHotEncoder(n_values=’auto’,
categorical_features=’all’,
dtype=<class ‘numpy.float64’>,
sparse=True,
handle_unknown=’error’)
handle_unknown是一個比較有用的參數,默認是"error",指定為"ignore”更好,這個參數的目的是數據在轉化為one-hot編碼時,如果遇到一個屬性值沒有事先指定,程序應該怎么辦?如果是error的話,程序就報錯停止了,其實不方便處理數據,反而是ignore更好,程序可以繼續執行
一個例子:
enc = OneHotEncoder()
enc.fit([["男", 0, 3],
["男", 1, 0],
["女", 2, 1],
["女", 0, 2]])
首先訓練一下數據集,提取每一列的屬性種類:
print(enc.categories_)
[array(['女', '男'], dtype=object),
array([0, 1, 2], dtype=object),
array([0, 1, 2, 3], dtype=object)]
一個例子:
from sklearn.preprocessing import OneHotEncoder
enc = OneHotEncoder()
enc.fit([[0, 0, 3],
[1, 1, 0],
[0, 2, 1],
[1, 0, 2]])
# 如果不加 toarray() 的話,輸出的是稀疏的存儲格式,即索引加值的形式,也可以通過參數指定 sparse = False 來達到同樣的效果
ans = enc.transform([[0, 1, 3]]).toarray()
print(ans) # 輸出 [[ 1. 0. 0. 1. 0. 0. 0. 0. 1.]]
下面解釋輸出結果的意思。對於輸入數組,這依舊是把每一行當作一個樣本,每一列當作一個特征,
- 我們先來看第一個特征,即第一列 [0,1,0,1],也就是說它有兩個取值 0 或者 1,那么 one-hot 就會使用兩位來表示這個特征,[1,0] 表示 0, [0,1] 表示 1,在上例輸出結果中的前兩位 [1,0...],也就是表示該特征為 0
- 第二個特征,第二列 [0,1,2,0],它有三種值,那么 one-hot 就會使用三位來表示這個特征,[1,0,0] 表示 0, [0,1,0] 表示 1,[0,0,1] 表示 2,在上例輸出結果中的第三位到第六位 [...0,1,0,0...]也就是表示該特征為 1
- 第三個特征,第三列 [3,0,1,2],它有四種值,那么 one-hot 就會使用四位來表示這個特征,[1,0,0,0] 表示 0, [0,1,0,0] 表示 1,[0,0,1,0] 表示 2,[0,0,0,1] 表示 3,在上例輸出結果中的最后四位 [...0,0,0,1] 也就是表示該特征為 3
雖然訓練樣本中的數值僅僅代表類別,但是也必須使用數值格式的數據,如果使用字符串格式的數據會報錯。
n_values=’auto’,表示每個特征使用幾維的數值由數據集自動推斷,即幾種類別就使用幾位來表示。
原文鏈接:https://blog.csdn.net/gxc19971128/article/details/106932288/