詳細詳解One Hot編碼-附程式碼
機器學習演算法無法直接用於資料分類。資料分類必須轉換為數字才能進一步進行。
在本教程中,你將發現如何將輸入或輸出的序列資料轉換為一種熱編碼,以便於你在Python中深度學習的序列分類問題中使用。
本教程分為4部分:
1.什麼是One-Hot編碼?
2.手動編寫One-Hot編碼
3.One-Hot Encode with scikit-learn.
4.One-Hot Encode with Keras.
1.什麼是One-Hot編碼?
One-Hot編碼,又稱為一位有效編碼,主要是採用N位狀態暫存器來對N個狀態進行編碼,每個狀態都由他獨立的暫存器位,並且在任意時候只有一位有效。
One-Hot編碼是分類變數作為二進位制向量的表示。這首先要求將分類值對映到整數值。然後,每個整數值被表示為二進位制向量,除了整數的索引之外,它都是零值,它被標記為1。
2.One-Hot編碼的工作示例
讓我們用一個小例子來說明一下到底什麼是One-Hot編碼。假設我們有一個帶有’red’和’green’值的標籤序列。我們可以將’red’的整數值分配為0,’green’的整數值為1。只要我們總是將這些數字分配給這些標籤,這稱為整數編碼。一致性是重要的,所以我們可以稍後反轉編碼,並從整數值獲取標籤。
接下來,我們可以建立一個二進位制向量來表示每個整數值。對於2個可能的整數值,向量的長度為2。
編碼為0的“紅色”標籤將用二進位制向量[1,0]表示,其中第0個索引被標記為值1。然後,編碼為1的“綠色”標籤將用一個二進位制向量[0,1],其中第一個索引被標記為1。
如果我們有序列:
‘red’,‘red’,‘green’。
我們可以用整數編碼來表示它:
0,0,1
而One-Hot編碼就為:
1 2 3 [1, 0] [1, 0] [0, 1]
1.為什麼要使用One-Hot編碼?
One hot 編碼進行資料的分類更準確,許多機器學習演算法無法直接用於資料分類。資料的類別必須轉換成數字,對於分類的輸入和輸出變數都是一樣的。
我們可以直接使用整數編碼,需要時重新調整。這可能適用於在類別之間存在自然關係的問題,例如溫度“冷”(0)和”熱“(1)的標籤。
當沒有關係時,可能會出現問題,一個例子可能是標籤的“狗”和“貓”。
在這些情況下,我們想讓網路更具表現力,為每個可能的標籤值提供概率式數字。這有助於進行問題網路建模。當輸出變數使用one-hot編碼時,它可以提供比單個標籤更準確的一組預測。
2.手動One Hot編碼:
在這個例子中,我們將假設我們有一個字串的例子,但是示例序列並不涵蓋所有可能的例子。
我們將使用以下字元的輸入序列:
Hello world。
我們將假設所有可能輸入是小寫字母和空格的完整字母表。因此,我們將以此展示如何滾動我們自己的one hot編碼。
完整的示例如下所示。
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
from
numpy
import
argmax
# define input string data = 'hello world' print ( data ) # define universe of possible input values alphabet = 'abcdefghijklmnopqrstuvwxyz ' # define a mapping of chars to integers char_to_int = dict ( ( c , i ) for i , c in enumerate ( alphabet ) ) int_to_char = dict ( ( i , c ) for i , c in enumerate ( alphabet ) ) # integer encode input data integer_encoded = [ char_to_int [ char ] for char in data ] print ( integer_encoded ) # one hot encode onehot_encoded = list ( ) for value in integer_encoded : letter = [ 0 for _ in range ( len ( alphabet ) ) ] letter [ value ] = 1 onehot_encoded . append ( letter ) print ( onehot_encoded ) # invert encoding inverted = int_to_char [ argmax ( onehot_encoded [ 0 ] ) ] print ( inverted ) |
執行示例首先列印輸入字串。執行結果:
[email protected]-VirtualBox:~$ python onehot.py hello world [7, 4, 11, 11, 14, 26, 22, 14, 17, 11, 3] [[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] h [[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] h [[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,<