當前位置:
首頁 > 知識 > 大神手把手教你:(Python)序列數據的One Hot編碼

大神手把手教你:(Python)序列數據的One Hot編碼

機器學習演算法無法直接用於數據分類。數據分類必須轉換為數字才能進一步進行。

在本教程中,你將發現如何將輸入或輸出的序列數據轉換為一種熱編碼,以便於你在Python中深度學習的序列分類問題中使用。

看完本教程後,你將會了解:

· 1.什麼是整數編碼和One-Hot編碼,以及為什麼它們在機器學習中是必需的。

· 2.如何在Python中手工計算一個整數編碼和One-Hot編碼。

· 3.如何使用scikit-learn和Keras庫來自動對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編碼就為:


123 [1, 0][1, 0][0, 1]

1.為什麼要使用One-Hot編碼?

One hot 編碼進行數據的分類更準確,許多機器學習演算法無法直接用於數據分類。數據的類別必須轉換成數字,對於分類的輸入和輸出變數都是一樣的。

我們可以直接使用整數編碼,需要時重新調整。這可能適用於在類別之間存在自然關係的問題,例如溫度「冷」(0)和」熱「(1)的標籤。

當沒有關係時,可能會出現問題,一個例子可能是標籤的「狗」和「貓」。

在這些情況下,我們想讓網路更具表現力,為每個可能的標籤值提供概率式數字。這有助於進行問題網路建模。當輸出變數使用one-hot編碼時,它可以提供比單個標籤更準確的一組預測。

2.手動One Hot編碼:

在這個例子中,我們將假設我們有一個字元串的例子,但是示例序列並不涵蓋所有可能的例子。

我們將使用以下字元的輸入序列:

Hello world。

我們將假設所有可能輸入是小寫字母和空格的完整字母表。因此,我們將以此展示如何滾動我們自己的one hot編碼。

完整的示例如下所示。

from numpy import argmax# define input stringdata = "hello world"print(data)# define universe of possible input valuesalphabet = "abcdefghijklmnopqrstuvwxyz "# define a mapping of chars to integerschar_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 datainteger_encoded = [char_to_int[char] for char in data]print(integer_encoded)# one hot encodeonehot_encoded = list()for value in integer_encoded:

運行示例首先列印輸入字元串。

所有可能的輸入的映射都是從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.One-Hot Encode with scikit-learn:

在這個例子中,我們假設你有一個輸出序列如下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

運行示例首先列印標籤序列。之後是標籤的整數編碼,最後是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編碼。

4.One Hot Encode with Keras:

您可能有一個已經是整數編碼的序列。

經過處理後,您可以直接使用整數。或者,您可以直接對整數進行one hot 編碼。這是非常重要的如果整數沒有真正的順序關係並且只是標籤的佔位符。

Keras提供了一個名為to_categorical()的函數,它可以幫助你使用one hot編碼整數數據。接下來我們看一個小例子:

在這個例子中,我們有4個整數值[0,1,2,3],我們有以下10個數字的輸入序列:

Data = [1,3,2,0,3,2,2,1,0,1]

該序列具有已知了所有值,因此我們可以直接使用to_categorical()函數。以下列出了此功能的完整示例。

from numpy import array

運行示例並列印輸入序列。

然後將整數編碼為二進位向量並列印。我們可以看到,正如我們預期的那樣,第一個整數值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文檔

分類Keras API文檔

Python中使用XGBoost進行漸變增強的數據準備

多層次分類教程與Keras深度學習庫

總結:

從該教程中你應該學到了:

1.什麼是整數編碼和one hot編碼,為什麼它們在機器學習中是必需的。

2.如何在Python中手工計算一個整數編碼和one hot編碼。

3.如何使用scikit-learn和Keras庫來自動對Python中的序列數據進行編碼。

文章代碼可以直接運行!希望能夠幫助各位理解one-hot編碼

希望上述的介紹能夠幫助到你!

本文由北郵@愛可可-愛生活老師推薦,阿里云云棲社區組織翻譯。

文章原標題《How to One Hot Encode Sequence Data in Python》,

作者:Jason Brownlee 譯者:袁虎

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雲棲社區 的精彩文章:

阿里雲首推音樂變速短視頻SDK,上線抖音 freestyle只需1步
錢盾率先提出的「全流程屏障」究竟是怎樣的一種能力?
開發機器學習系統的一個新途徑:Certigrad,隨機計算圖優化系統
DeepTraffic:如何讓MIT的遊戲利用深度學習來減少交通阻塞
巴黎科技展:「中國技術太厲害了,我們得趕緊學學!」

TAG:雲棲社區 |

您可能感興趣

pandas 庫作者手把手教你 Python 數據分析
TensorFlow手把手教你概率編程:TF Probability內置了開源教材,新手友好
手把手教你使用PowerShell繞過AppLocker
手把手教你將YouTube上的流量引流到Pinterest
手把手教你自釀世濤 Stout Mini mash
手把手教你用Python庫Keras做預測
手把手教你做Syndicate
pandas創始人手把手教你利用Python進行數據分析
手把手教你轉換App Store區域,安裝iOS 原版 Adobe XD
GitHub 9K Star!Apollo作者手把手教你微服務配置中心之道
58 張圖,手把手教會你 Simscape Multibody 物理建模與剛體變換
NVIDIA線下交流會:手把手教你搭建TensorFlow&Caffe深度學習伺服器
手把手教Vue-路由「Vue-rouer」
乾貨!手把手教你為FreeSync顯示器開啟G-Sync教程
手把手教你搭建AlphaZero
Kinja deals如何發帖?手把手教你熱門美亞Deal站Kinja推廣(圖文)
手把手教你NumPy來實現Word2vec
手把手教你在本地構建Nervos AppChain全家桶
手把手帶你寫Cover Letter,骨灰級教案呈上
手把手教你如何更換iPhone 6S的電池,送給iPhone 6S的忠實粉!