摘要:不懂One Hot編碼括堤?讓大神手把手教你(文中代碼可以直接運行),用小例子清晰明了的帶你進(jìn)入One hot 編碼抱既!
更多深度文章剪返,請關(guān)注:https://yq.aliyun.com/cloud
機(jī)器學(xué)習(xí)算法無法直接用于數(shù)據(jù)分類。數(shù)據(jù)分類必須轉(zhuǎn)換為數(shù)字才能進(jìn)一步進(jìn)行倚搬。
在本教程中冶共,你將發(fā)現(xiàn)如何將輸入或輸出的序列數(shù)據(jù)轉(zhuǎn)換為一種熱編碼,以便于你在Python中深度學(xué)習(xí)的序列分類問題中使用每界。
看完本教程后捅僵,你將會了解:
·? ?1.什么是整數(shù)編碼和One-Hot編碼,以及為什么它們在機(jī)器學(xué)習(xí)中是必需的眨层。
·? ?2.如何在Python中手工計算一個整數(shù)編碼和One-Hot編碼庙楚。
·? ?3.如何使用scikit-learn和Keras庫來自動對Python中的序列數(shù)據(jù)進(jìn)行編碼。
本教程分為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位狀態(tài)寄存器來對N個狀態(tài)進(jìn)行編碼窜司,每個狀態(tài)都由他獨立的寄存器位沛善,并且在任意時候只有一位有效。
One-Hot編碼是分類變量作為二進(jìn)制向量的表示塞祈。這首先要求將分類值映射到整數(shù)值金刁。然后,每個整數(shù)值被表示為二進(jìn)制向量议薪,除了整數(shù)的索引之外尤蛮,它都是零值,它被標(biāo)記為1斯议。
2.One-Hot編碼的工作示例
讓我們用一個小例子來說明一下到底什么是One-Hot編碼产捞。假設(shè)我們有一個帶有'red'和'green'值的標(biāo)簽序列。我們可以將'red'的整數(shù)值分配為0哼御,'green'的整數(shù)值為1坯临。只要我們總是將這些數(shù)字分配給這些標(biāo)簽,這稱為整數(shù)編碼恋昼。一致性是重要的看靠,所以我們可以稍后反轉(zhuǎn)編碼,并從整數(shù)值獲取標(biāo)簽液肌。
接下來挟炬,我們可以創(chuàng)建一個二進(jìn)制向量來表示每個整數(shù)值。對于2個可能的整數(shù)值嗦哆,向量的長度為2谤祖。
編碼為0的“紅色”標(biāo)簽將用二進(jìn)制向量[1,0]表示,其中第0個索引被標(biāo)記為值1老速。然后粥喜,編碼為1的“綠色”標(biāo)簽將用一個二進(jìn)制向量[0,1]橘券,其中第一個索引被標(biāo)記為1容客。
如果我們有序列:
‘red’,‘red’,‘green’。
我們可以用整數(shù)編碼來表示它:
0约郁,0,1
而One-Hot編碼就為:
1
2
3
[1, 0]
[1, 0]
[0, 1]
1.為什么要使用One-Hot編碼但两?
One hot 編碼進(jìn)行數(shù)據(jù)的分類更準(zhǔn)確鬓梅,許多機(jī)器學(xué)習(xí)算法無法直接用于數(shù)據(jù)分類。數(shù)據(jù)的類別必須轉(zhuǎn)換成數(shù)字谨湘,對于分類的輸入和輸出變量都是一樣的绽快。
我們可以直接使用整數(shù)編碼芥丧,需要時重新調(diào)整。這可能適用于在類別之間存在自然關(guān)系的問題坊罢,例如溫度“冷”(0)和”熱“(1)的標(biāo)簽续担。
當(dāng)沒有關(guān)系時,可能會出現(xiàn)問題活孩,一個例子可能是標(biāo)簽的“狗”和“貓”物遇。
在這些情況下,我們想讓網(wǎng)絡(luò)更具表現(xiàn)力憾儒,為每個可能的標(biāo)簽值提供概率式數(shù)字询兴。這有助于進(jìn)行問題網(wǎng)絡(luò)建模。當(dāng)輸出變量使用one-hot編碼時起趾,它可以提供比單個標(biāo)簽更準(zhǔn)確的一組預(yù)測诗舰。
2.手動One Hot編碼:
在這個例子中,我們將假設(shè)我們有一個字符串的例子训裆,但是示例序列并不涵蓋所有可能的例子眶根。
我們將使用以下字符的輸入序列:
Hello world。
我們將假設(shè)所有可能輸入是小寫字母和空格的完整字母表边琉。因此属百,我們將以此展示如何滾動我們自己的one hot編碼。
完整的示例如下所示艺骂。
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)
運行示例首先打印輸入字符串诸老。
所有可能的輸入的映射都是從char值創(chuàng)建為整數(shù)值。然后使用該映射對輸入字符串進(jìn)行編碼钳恕。我們可以看到輸入'h'中的第一個字母被編碼為7别伏。然后將整數(shù)編碼轉(zhuǎn)換為one hot編碼。一次完成一個整數(shù)編碼的字符忧额。創(chuàng)建0個值的列表厘肮,以便字母表的長度可以表示任何預(yù)期的字符的長度。
接下來睦番,特定字符的索引標(biāo)記為1类茂。我們可以看到,編碼為7的第一個字母“h”整數(shù)由二進(jìn)制向量表示托嚣,長度為27巩检,第七個索引標(biāo)記為1。
最后示启,我們反轉(zhuǎn)第一個字母的編碼并打印結(jié)果兢哭。我們通過使用NumPy argmax()函數(shù)定位具有最大值的二進(jìn)制向量中的索引,然后使用字符值的反向查找表中的整數(shù)進(jìn)行整數(shù)夫嗓。
注意:輸出格式化為可讀性(我們將空格默認(rèn)設(shè)置為z)迟螺。