1. 程式人生 > >詳細詳解One Hot編碼-附程式碼

詳細詳解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’。

我們可以用整數編碼來表示它:

001

而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,<