1. 程式人生 > >資料預處理:One-Hot Encoding

資料預處理:One-Hot Encoding

機器學習中,在對資料進行訓練之前,都會對資料進行預處理,也就是特徵提取,個人認為特徵提取是訓練模型中非常非常重要的一步!
在迴歸,分類,聚類等機器學習演算法中,特徵之間距離的計算或相似度的計算是非常重要的,而我們常用的距離或相似度的計算都是在歐式空間的相似度計算,計算餘弦相似性,基於的就是歐式空間。
將離散型特徵使用one-hot編碼,確實會讓特徵之間的距離計算更加合理。比如,有一個離散型特徵,代表工作型別,該離散型特徵,共有五個取值,不使用one-hot編碼,其表示分別是x_1 = (1), x_2 = (2), x_3 = (3),x_4 = (4),x_5 = (5)。兩個工作之間的距離是,(x_1, x_2) = 1, d(x_2, x_3) = 1, d(x_1, x_3) = 2,d(x_1, x_5) = 4… 那麼x_1和x_5工作之間就越不相似嗎?顯然這樣的表示,計算出來的特徵的距離是不合理。那如果使用one-hot編碼,則得到x_1 = (1, 0, 0,0,0), x_2 = (0, 1, 0,0,0), x_3 = (0, 0, 1,0,0),x_4 = (0, 0, 0,1,0),x_5 = (0, 0, 0,0,1),那麼兩個工作之間的距離就都是sqrt(2).即每兩個工作之間的距離是一樣的,顯得更合理。
而各個機器學習、深度學習框架都提供了One-Hot Encoding,這裡只提供Keras 的API:

# coding=utf-8
# By author MZ
from keras.utils import np_utils
from numpy.ma import array

y_lable_train=array([[6],[9],[5],[5],[4],[1]])
##使用keras提供的np_utils.to_categorical方法,進行One-Hot Encoding轉換
categorical = np_utils.to_categorical(y_lable_train)
##列印輸出
print(categorical.shape)
print(categorical)
列印結果是:
Using TensorFlow backend.   這一行是keras預設使用tensorflow作為backend
(6, 10)     共6項,每一項都是由10個0或者1組成
[[0. 0. 0. 0. 0. 0. 1. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]
 [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]]