看到One-Hot-Encoding發現網上大多數說明都是來自於同一個例子,最後結果感受出的好突兀,所以這裏總結一下。python
不少機器學習任務中,特徵並不老是連續值,有多是分類值。機器學習
考慮如下三個特徵:學習
["male", "female"] ["from Europe", "from US", "from Asia"] ["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]
若是將上述特徵用數字表示,效率會高不少。例如:編碼
["male", "from US", "uses Internet Explorer"] 表示爲[0, 1, 3]code
["female", "from Asia", "uses Chrome"]表示爲[1, 2, 1]orm
可是,轉化爲數字表示後,上述數據不能直接用在咱們的分類器中。由於,分類器每每默認數據數據是連續的,而且是有序的。但按上述表示的數字並不有序的,而是隨機分配的。ci
One-Hot Encoding
解決上述問題的一種方法是採用One-Hot Encoding。it
獨熱編碼,又稱一位有效編碼,其方法是使用N位狀態寄存器來對N個狀態進行編碼,每一個狀態都有它獨立的寄存器位,而且在任意時候,其中只有一位有效。form
例如:效率
天然狀態碼爲:000,001,010,011,100,101
獨熱編碼爲:000001,000010,000100,001000,010000,100000
能夠這樣理解,對於每個特徵,若是它有m個可能值,那麼通過獨熱編碼後,就變成了m個二元特徵。而且,這些特徵互斥,每次只有一個激活。所以,數據會變成稀疏的。
這樣作的好處主要有:
解決了分類器很差處理屬性數據的問題
在必定程度上也起到了擴充特徵的做用
基於python和Scikit-learn的一個簡單例子:
encoder = preprocessing.OneHotEncoder() encoder.fit([ [0, 2, 1, 12], [1, 3, 5, 3], [2, 3, 2, 12], [1, 2, 4, 3] ]) encoded_vector = encoder.transform([[2, 3, 5, 3]]).toarray() print("\n Encoded vector =", encoded_vector)
輸出結果:
Encoded vector = [[ 0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]
分析:
4個特徵:
第一個特徵(即爲第一列)爲[0,1,2,1] ,其中三類特徵值[0,1,2],所以One-Hot Code可將[0,1,2]表示爲:[100,010,001]
同理第二個特徵列可將兩類特徵值[2,3]表示爲[10,01]
第三個特徵將4類特徵值[1,2,4,5]表示爲[1000,0100,0010,0001]
第四個特徵將2類特徵值[3,12]表示爲[10,01]
所以最後可將[2,3,5,3]表示爲[0,0,1,0,1,0,0,0,1,1,0]