機器學習之One-Hot Encoding詳解

看到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]

相關文章
相關標籤/搜索