Python 序列数据的One Hot编码
機(jī)器學(xué)習(xí)算法無(wú)法直接用于數(shù)據(jù)分類(lèi)。數(shù)據(jù)分類(lèi)必須轉(zhuǎn)換為數(shù)字才能進(jìn)一步進(jìn)行。
在本教程中,你將發(fā)現(xiàn)如何將輸入或輸出的序列數(shù)據(jù)轉(zhuǎn)換為一種熱編碼,以便于你在Python中深度學(xué)習(xí)的序列分類(lèi)問(wèn)題中使用。
看完本教程后,你將會(huì)了解:
·? ?1.什么是整數(shù)編碼和One-Hot編碼,以及為什么它們?cè)跈C(jī)器學(xué)習(xí)中是必需的。
·? ?2.如何在Python中手工計(jì)算一個(gè)整數(shù)編碼和One-Hot編碼。
·? ?3.如何使用scikit-learn和Keras庫(kù)來(lái)自動(dòng)對(duì)Python中的序列數(shù)據(jù)進(jìn)行編碼。
本教程分為4部分:
1.什么是One-Hot編碼?
2.手動(dòng)編寫(xiě)One-Hot編碼
3.One-Hot Encode with scikit-learn.
4.One-Hot Encode with Keras.
1.什么是One-Hot編碼?
One-Hot編碼,又稱(chēng)為一位有效編碼,主要是采用N位狀態(tài)寄存器來(lái)對(duì)N個(gè)狀態(tài)進(jìn)行編碼,每個(gè)狀態(tài)都由他獨(dú)立的寄存器位,并且在任意時(shí)候只有一位有效。
One-Hot編碼是分類(lèi)變量作為二進(jìn)制向量的表示。這首先要求將分類(lèi)值映射到整數(shù)值。然后,每個(gè)整數(shù)值被表示為二進(jìn)制向量,除了整數(shù)的索引之外,它都是零值,它被標(biāo)記為1。
2.One-Hot編碼的工作示例
讓我們用一個(gè)小例子來(lái)說(shuō)明一下到底什么是One-Hot編碼。假設(shè)我們有一個(gè)帶有'red'和'green'值的標(biāo)簽序列。我們可以將'red'的整數(shù)值分配為0,'green'的整數(shù)值為1。只要我們總是將這些數(shù)字分配給這些標(biāo)簽,這稱(chēng)為整數(shù)編碼。一致性是重要的,所以我們可以稍后反轉(zhuǎn)編碼,并從整數(shù)值獲取標(biāo)簽。
接下來(lái),我們可以創(chuàng)建一個(gè)二進(jìn)制向量來(lái)表示每個(gè)整數(shù)值。對(duì)于2個(gè)可能的整數(shù)值,向量的長(zhǎng)度為2。
編碼為0的“紅色”標(biāo)簽將用二進(jìn)制向量[1,0]表示,其中第0個(gè)索引被標(biāo)記為值1。然后,編碼為1的“綠色”標(biāo)簽將用一個(gè)二進(jìn)制向量[0,1],其中第一個(gè)索引被標(biāo)記為1。
如果我們有序列:
‘red’,‘red’,‘green’。
我們可以用整數(shù)編碼來(lái)表示它:
0,0,1
而One-Hot編碼就為:
1 2 3 | [1, 0] [1, 0] [0, 1] |
1.為什么要使用One-Hot編碼?
One hot?編碼進(jìn)行數(shù)據(jù)的分類(lèi)更準(zhǔn)確,許多機(jī)器學(xué)習(xí)算法無(wú)法直接用于數(shù)據(jù)分類(lèi)。數(shù)據(jù)的類(lèi)別必須轉(zhuǎn)換成數(shù)字,對(duì)于分類(lèi)的輸入和輸出變量都是一樣的。
我們可以直接使用整數(shù)編碼,需要時(shí)重新調(diào)整。這可能適用于在類(lèi)別之間存在自然關(guān)系的問(wèn)題,例如溫度“冷”(0)和”熱“(1)的標(biāo)簽。
當(dāng)沒(méi)有關(guān)系時(shí),可能會(huì)出現(xiàn)問(wèn)題,一個(gè)例子可能是標(biāo)簽的“狗”和“貓”。
在這些情況下,我們想讓網(wǎng)絡(luò)更具表現(xiàn)力,為每個(gè)可能的標(biāo)簽值提供概率式數(shù)字。這有助于進(jìn)行問(wèn)題網(wǎng)絡(luò)建模。當(dāng)輸出變量使用one-hot編碼時(shí),它可以提供比單個(gè)標(biāo)簽更準(zhǔn)確的一組預(yù)測(cè)。
2.手動(dòng)One Hot編碼:
在這個(gè)例子中,我們將假設(shè)我們有一個(gè)字符串的例子,但是示例序列并不涵蓋所有可能的例子。
我們將使用以下字符的輸入序列:
Hello world。
我們將假設(shè)所有可能輸入是小寫(xiě)字母和空格的完整字母表。因此,我們將以此展示如何滾動(dòng)我們自己的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] = 1onehot_encoded.append(letter) print(onehot_encoded) # invert encoding inverted = int_to_char[argmax(onehot_encoded[0])] print(inverted)運(yùn)行示例首先打印輸入字符串。
所有可能的輸入的映射都是從char值創(chuàng)建為整數(shù)值。然后使用該映射對(duì)輸入字符串進(jìn)行編碼。我們可以看到輸入'h'中的第一個(gè)字母被編碼為7。然后將整數(shù)編碼轉(zhuǎn)換為one hot編碼。一次完成一個(gè)整數(shù)編碼的字符。創(chuàng)建0個(gè)值的列表,以便字母表的長(zhǎng)度可以表示任何預(yù)期的字符的長(zhǎng)度。
接下來(lái),特定字符的索引標(biāo)記為1。我們可以看到,編碼為7的第一個(gè)字母“h”整數(shù)由二進(jìn)制向量表示,長(zhǎng)度為27,第七個(gè)索引標(biāo)記為1。
最后,我們反轉(zhuǎn)第一個(gè)字母的編碼并打印結(jié)果。我們通過(guò)使用NumPy argmax()函數(shù)定位具有最大值的二進(jìn)制向量中的索引,然后使用字符值的反向查找表中的整數(shù)進(jìn)行整數(shù)。
注意:輸出格式化為可讀性(我們將空格默認(rèn)設(shè)置為z)。
| ? | ?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], ?[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, 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, 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, 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, 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, 1, 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, 1, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]] ? h |
現(xiàn)在我們已經(jīng)看到了如何從頭開(kāi)始自己的one hot編碼,我們來(lái)看看如何使用scikit學(xué)習(xí)庫(kù)來(lái)對(duì)輸入序列自動(dòng)完全捕獲輸入值的預(yù)期范圍的情況。
3.One-Hot Encode with scikit-learn:在這個(gè)例子中,我們假設(shè)你有一個(gè)輸出序列如下3個(gè)標(biāo)簽:
Cold,warm,hot
10個(gè)時(shí)間序列的示例順序可以是:
Cold,cold,warm,cold,hot,hot,warm,cold,warm,hot
這將首先需要一個(gè)整數(shù)編碼,如1,2,3,然后是整數(shù)到one hot編碼具有3個(gè)值的二進(jìn)制向量,例如[1,0,0]。
這個(gè)情況下提供序列中每個(gè)可能值的至少一個(gè)示例。因此,我們可以使用自動(dòng)方法來(lái)定義整數(shù)到二進(jìn)制向量的映射。
在這個(gè)例子中,我們將使用scikit學(xué)習(xí)庫(kù)的編碼器。具體來(lái)說(shuō),LabelEncoder創(chuàng)建標(biāo)簽的整數(shù)編碼,OneHotEncoder用于創(chuàng)建整數(shù)編碼值的one hot編碼。
from numpy import array from numpy import argmax from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import OneHotEncoder # define example data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot'] values = array(data) print(values) # integer encode label_encoder = LabelEncoder() integer_encoded = label_encoder.fit_transform(values) print(integer_encoded) # binary encode onehot_encoder = OneHotEncoder(sparse=False) integer_encoded = integer_encoded.reshape(len(integer_encoded), 1) onehot_encoded = onehot_encoder.fit_transform(integer_encoded) print(onehot_encoded) # invert first example inverted = label_encoder.inverse_transform([argmax(onehot_encoded[0, :])]) print(inverted)運(yùn)行示例首先打印標(biāo)簽序列。之后是標(biāo)簽的整數(shù)編碼,最后是one hot編碼。訓(xùn)練數(shù)據(jù)包含所有可能示例的集合,因此我們可以依靠整數(shù)和one hot編碼變換來(lái)創(chuàng)建標(biāo)簽到編碼的完整映射。
默認(rèn)情況下,OneHotEncoder類(lèi)將返回更高效的稀疏編碼,這可能不適用于某些應(yīng)用程序。例如使用Keras深度學(xué)習(xí)庫(kù)。在這種情況下,我們通過(guò)設(shè)置sparse = False這個(gè)參數(shù)來(lái)禁用稀疏返回類(lèi)型。
首先,我們可以使用argmax()NumPy函數(shù)來(lái)找到具有最大值的列的索引。然后可以將其輸入到LabelEncoder,以計(jì)算反向變換回文本標(biāo)簽。運(yùn)行結(jié)果為:
['cold' 'cold' 'warm' 'cold' 'hot' 'hot' 'warm' 'cold' 'warm' 'hot']? [0 0 2 0 1 1 2 0 2 1] [[ 1.??0.??0.] ?[ 1.??0.??0.] ?[ 0.??0.??1.] ?[ 1.??0.??0.] ?[ 0.??1.??0.] ?[ 0.??1.??0.] ?[ 0.??0.??1.] ?[ 1.??0.??0.] ?[ 0.??0.??1.] ?[ 0.??1.??0.]]? ['cold'] |
在下一個(gè)例子中,我們來(lái)看一下如何直接對(duì)一個(gè)整數(shù)值進(jìn)行one hot編碼。
4.One Hot Encode with Keras:
您可能有一個(gè)已經(jīng)是整數(shù)編碼的序列。
經(jīng)過(guò)處理后,您可以直接使用整數(shù)。或者,您可以直接對(duì)整數(shù)進(jìn)行one hot?編碼。這是非常重要的如果整數(shù)沒(méi)有真正的順序關(guān)系并且只是標(biāo)簽的占位符。
Keras提供了一個(gè)名為to_categorical()的函數(shù),它可以幫助你使用one hot編碼整數(shù)數(shù)據(jù)。接下來(lái)我們看一個(gè)小例子:
在這個(gè)例子中,我們有4個(gè)整數(shù)值[0,1,2,3],我們有以下10個(gè)數(shù)字的輸入序列:
Data = [1,3,2,0,3,2,2,1,0,1]
該序列具有已知了所有值,因此我們可以直接使用to_categorical()函數(shù)。以下列出了此功能的完整示例。
from numpy import array from numpy import argmax from keras.utils import to_categorical # define example data = [1, 3, 2, 0, 3, 2, 2, 1, 0, 1] data = array(data) print(data) # one hot encode encoded = to_categorical(data) print(encoded) # invert encoding inverted = argmax(encoded[0]) print(inverted)運(yùn)行示例并打印輸入序列。
然后將整數(shù)編碼為二進(jìn)制向量并打印。我們可以看到,正如我們預(yù)期的那樣,第一個(gè)整數(shù)值1被編碼為[0,1,0,0]。
然后,我們使用NumPy argmax()函數(shù)反轉(zhuǎn)編碼,該函數(shù)返回第一個(gè)整數(shù)的期望值1的序列中的第一個(gè)值。
[1 3 2 0 3 2 2 1 0 1] [[ 0.??1.??0.??0.] ?[ 0.??0.??0.??1.] ?[ 0.??0.??1.??0.] ?[ 1.??0.??0.??0.] ?[ 0.??0.??0.??1.] ?[ 0.??0.??1.??0.] ?[ 0.??0.??1.??0.] ?[ 0.??1.??0.??0.] ?[ 1.??0.??0.??0.] ?[ 0.??1.??0.??0.] 1 |
進(jìn)一步閱讀:
?OneHotEncoder scikit-learn API文檔
?LabelEncoder scikit-learn API文檔
?分類(lèi)Keras API文檔
?Python中使用XGBoost進(jìn)行漸變?cè)鰪?qiáng)的數(shù)據(jù)準(zhǔn)備
?多層次分類(lèi)教程與Keras深度學(xué)習(xí)庫(kù)
總結(jié):
從該教程中你應(yīng)該學(xué)到了:
1.什么是整數(shù)編碼和one hot編碼,為什么它們?cè)跈C(jī)器學(xué)習(xí)中是必需的。
2.如何在Python中手工計(jì)算一個(gè)整數(shù)編碼和one hot編碼。
3.如何使用scikit-learn和Keras庫(kù)來(lái)自動(dòng)對(duì)Python中的序列數(shù)據(jù)進(jìn)行編碼。
文章代碼可以直接運(yùn)行!希望能夠幫助各位理解one-hot編碼
希望上述的介紹能夠幫助到你!?
原文來(lái)自?https://yq.aliyun.com/articles/126741
總結(jié)
以上是生活随笔為你收集整理的Python 序列数据的One Hot编码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于 Electron + React
- 下一篇: 分享PowerMill数控编程应用技巧,