大神手把手教你:(Python)序列數據的One Hot編碼
更多深度文章,請關注:https://yq.aliyun.com/cloud
在本教程中,你將發現如何將輸入或輸出的序列數據轉換為一種熱編碼,以便於你在Python中深度學習的序列分類問題中使用。
· 1.什麼是整數編碼和One-Hot編碼,以及為什麼它們在機器學習中是必需的。
· 2.如何在Python中手工計算一個整數編碼和One-Hot編碼。
· 3.如何使用scikit-learn和Keras庫來自動對Python中的序列數據進行編碼。
本教程分為4部分:
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。
0,0,1
而One-Hot編碼就為:
1.為什麼要使用One-Hot編碼?
One hot 編碼進行數據的分類更準確,許多機器學習算法無法直接用於數據分類。數據的類別必須轉換成數字,對於分類的輸入和輸出變量都是一樣的。
我們可以直接使用整數編碼,需要時重新調整。這可能適用於在類別之間存在自然關係的問題,例如溫度“冷”(0)和”熱“(1)的標簽。
當沒有關係時,可能會出現問題,一個例子可能是標簽的“狗”和“貓”。
在這些情況下,我們想讓網絡更具表現力,為每個可能的標簽值提供概率式數字。這有助於進行問題網絡建模。當輸出變量使用one-hot編碼時,它可以提供比單個標簽更準確的一組預測。
2.手動One Hot編碼:
Hello world。
我們將假設所有可能輸入是小寫字母和空格的完整字母表。因此,我們將以此展示如何滾動我們自己的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值創建為整數值。然後使用該映射對輸入字符串進行編碼。我們可以看到輸入'h'中的第一個字母被編碼為7。然後將整數編碼轉換為one hot編碼。一次完成一個整數編碼的字符。創建0個值的列表,以便字母表的長度可以表示任何預期的字符的長度。
接下來,特定字符的索引標記為1。我們可以看到,編碼為7的第一個字母“h”整數由二進製向量表示,長度為27,第七個索引標記為1。
最後,我們反轉第一個字母的編碼並打印結果。我們通過使用NumPy argmax()函數定位具有最大值的二進製向量中的索引,然後使用字符值的反向查找表中的整數進行整數。
注意:輸出格式化為可讀性(我們將空格默認設置為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 |
現在我們已經看到了如何從頭開始自己的one hot編碼,我們來看看如何使用scikit學習庫來對輸入序列自動完全捕獲輸入值的預期範圍的情況。
在這個例子中,我們假設你有一個輸出序列如下3個標簽:
Cold,warm,hot
10個時間序列的示例順序可以是:
Cold,cold,warm,cold,hot,hot,warm,cold,warm,hot
這將首先需要一個整數編碼,如1,2,3,然後是整數到one hot編碼具有3個值的二進製向量,例如[1,0,0]。
在這個例子中,我們將使用scikit學習庫的編碼器。具體來說,LabelEncoder創建標簽的整數編碼,OneHotEncoder用於創建整數編碼值的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)
運行示例首先打印標簽序列。之後是標簽的整數編碼,最後是one hot編碼。訓練數據包含所有可能示例的集合,因此我們可以依靠整數和one hot編碼變換來創建標簽到編碼的完整映射。
默認情況下,OneHotEncoder類將返回更高效的稀疏編碼,這可能不適用於某些應用程序。例如使用Keras深度學習庫。在這種情況下,我們通過設置sparse = False這個參數來禁用稀疏返回類型。
首先,我們可以使用argmax()NumPy函數來找到具有最大值的列的索引。然後可以將其輸入到LabelEncoder,以計算反向變換回文本標簽。運行結果為:
|
['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'] |
在下一個例子中,我們來看一下如何直接對一個整數值進行one hot編碼。
經過處理後,您可以直接使用整數。或者,您可以直接對整數進行one hot 編碼。這是非常重要的如果整數沒有真正的順序關係並且隻是標簽的占位符。
Keras提供了一個名為to_categorical()的函數,它可以幫助你使用one hot編碼整數數據。接下來我們看一個小例子:
在這個例子中,我們有4個整數值[0,1,2,3],我們有以下10個數字的輸入序列:
該序列具有已知了所有值,因此我們可以直接使用to_categorical()函數。以下列出了此功能的完整示例。
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)
然後將整數編碼為二進製向量並打印。我們可以看到,正如我們預期的那樣,第一個整數值1被編碼為[0,1,0,0]。
然後,我們使用NumPy argmax()函數反轉編碼,該函數返回第一個整數的期望值1的序列中的第一個值。
|
[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 |
OneHotEncoder scikit-learn API文檔
LabelEncoder scikit-learn API文檔
1.什麼是整數編碼和one hot編碼,為什麼它們在機器學習中是必需的。
2.如何在Python中手工計算一個整數編碼和one hot編碼。
3.如何使用scikit-learn和Keras庫來自動對Python中的序列數據進行編碼。
本文由北郵@愛可可-愛生活老師推薦,阿裏雲雲棲社區組織翻譯。
文章原標題《How to One Hot Encode Sequence Data in Python》,
文章為簡譯,更為詳細的內容,請查看原文
最後更新:2017-07-21 23:33:19