One-Hot編碼,又稱為一位有效編碼,主要是采用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候只有一位有效。
One-Hot編碼是分類變量作為二進制向量的表示。這首先要求將分類值映射到整數值。然后,每個整數值被表示為二進制向量,除了整數的索引之外,它都是零值,它被標記為1。
聽概念的話顯得比較復雜,我們來看一個例子。
假設我們有一群學生,他們可以通過四個特征來形容,分別是:
- 性別:[“男”,“女”]
- 年級:[“初一”,“初二”,“初三”]
- 學校:[“一中”,“二中”,“三中”,“四中”]
舉個例子,用上述四個特征來描述小明同學,即“男生,初一,來自二中”,如果特征類別是有序的話,我們能夠用表示順序的數組表示
即“男生,初一,來自一中” ==> [0,0,1]
但是這樣的特征處理並不能直接放入機器學習算法中,因為類別之間是無序的
這時候就可以用獨熱編碼的形式來表示了,我們用采用N位狀態寄存器來對N個狀態進行編碼,拿上面的例子來說,就是:
性別 | [“男”,“女”] | N=2 | 男:1 0 女:0 1 |
年級 | [“初一”,“初二”,“初三”] | N=3 | 初一:1 0 0 初二:0 1 0 初三:0 0 1 |
學校 | [“一中”,“二中”,“三中”,“四中”] | N=4 | 一中:1 0 0 0 二中:0 1 0 0 三中:0 0 1 0 四中:0 0 0 1 |
因此,當我們再來描述小明的時候,就可以采用 [1 0 1 0 0 0 1 0 0]
很多人在介紹獨熱編碼的時候,都引用了下面這段代碼,但是解釋的比較模糊,下面詳細解釋一下。
from sklearn import preprocessing enc = preprocessing.OneHotEncoder() enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]]) #這里一共有4個數據,3種特征 array = enc.transform([[0,1,3]]).toarray() #這里使用一個新的數據來測試
print(array) # [[ 1 0 0 1 0 0 0 0 1]]
這里一共有四個數據,三種特征,是那四個呢,我們列出矩陣
第一種 | 第二種 | 第三種 | |
第一個 | 0 | 0 | 3 |
第二個 | 1 | 1 | 0 |
第三個 | 0 | 2 | 1 |
第四個 | 1 | 0 | 2 |
我們豎着看,可以看出第一種特征中只有0、1兩類,第二組有0,、1、2三類,第三種有0、1、2、3四類,因此分別可以用2、3、4個狀態類來表示。
enc.transform就是將[0,1,3]這組特征轉換成one hot編碼,toarray()則是轉成數組形式。
第一個數為0,對應第一種特征則為 1 0;
第二個數為1,對應第二種特征則為 0 1 0;
第三個數為3,對應第三種特征則為 0 0 0 1。
所以最后的輸出為:[[ 1 0 0 1 0 0 0 0 1]]
同樣的,當我們拿小明的表述[0,0,1]來測試的時候,得到了與第一個例子相同的結果。
from sklearn import preprocessing enc = preprocessing.OneHotEncoder() enc.fit([[0,0,3],[1,1,0],[0,2,1],[1,0,2]]) #這里一共有4個數據,3種特征 array = enc.transform([[0,0,1]]).toarray() #這里使用一個新的數據來測試 print(array) [[1. 0. 1. 0. 0. 0. 1. 0. 0.]]