1. 程式人生 > >大神手把手教你:(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編碼就為:

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編碼。

完整的示例如下所示。

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.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
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編碼。

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
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文件

分類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 譯者:袁虎 審閱:李烽

文章為簡譯,更為詳細的內容,請檢視原文

相關推薦

手把手(Python)序列資料One Hot編碼

原文連結 機器學習演算法無法直接用於資料分類。資料分類必須轉換為數字才能進一步進行。 在本教程中,你將發現如何將輸入或輸出的序列資料轉換為一種熱編碼,以便於你在Python中深度學習的序列分類問題中使用。 看完本教程後,你將會了解: · 1.什麼是整

手把手寫一個頁面模板引擎,只需20行Javascript代碼!

[1] 表達 最終 strong ice ali 開頭 syntax years 只用20行Javascript代碼就寫出一個頁面模板引擎的大神是AbsurdJS的作者,下面是他分享的全文,轉需。 不知道你有木有聽說過一個基於Javascript的Web頁面預處理器,叫做A

Java進階架構師之如何畫好架構圖?阿裏手把手

edi 一起 dubbo 流程圖 把手 角度 網上 .com cimage 本文作者阿裏巴巴技術專家三畫,分享了自己和團隊在畫好架構圖方面的理念和經驗,首發於阿裏內部技術分享平臺,阿裏巴巴中間件授權轉載,梓敬、鵬升和余樂對此文亦有貢獻。 當我們想用一張或幾張圖來描述我

Java進階架構師之如何畫好架構圖?阿里手把手

本文作者阿里巴巴技術專家三畫,分享了自己和團隊在畫好架構圖方面的理念和經驗,首發於阿里內部技術分享平臺,阿里巴巴中介軟體授權

維基百科中的資料科學手把手Python讀懂全球最大百科全書

編譯:狗小白、李佳、張弛、魏子敏 沒人否認,維基百科是現代最令人驚歎的人類發明之一。 幾年前誰能想到,匿名貢獻者們的義務工作竟創造出前所未有的巨大線上知識庫?維基百科不僅是你寫大學論文時最好的資訊渠道,也是一個極其豐富的資料來源。 從自然語言處理到監督式機器學習,維

手把手微信棋牌源碼 MySQL的前綴索引

行記錄 col .com random post lte com exist nor MySQL的前綴索引 微信棋牌源碼咨詢Q 2171793408 官網地址:http://wowotouba.com/h5 MySQL的前綴索引指的是對指定的欄位的前面幾位建立的索引

手把手Python實踐深度學習|深度學習視頻教程

視頻 ref ati pan 人工神經網絡 com 深度學習 encoder auto 手把手教你用Python實踐深度學習網盤地址:https://pan.baidu.com/s/1mkoC9ELXDglvTNN_xPUWlQ 提取碼: zgpy備用地址(騰訊微雲):ht

獨家 | 手把手Python進行Web抓取(附程式碼)

作為一名資料科學家,我在工作中所做的第一件事就是網路資料採集。使用程式碼從網站收集資料,當時對我來說是一個完全陌生的概念,但它是最合理、最容易獲取的資料來源之一。經過幾次嘗試,網路抓取已經成為我的第二天性,也是我幾乎每天使用的技能之一。 在本教程中,我將介紹一個簡單的例子,說明如何抓取一個網站,

手把手Python金融財務分析

內容來自:微信公眾號:python金融量化 關注可瞭解更多的金融與Python乾貨。 內容目錄 貨幣時間價值 年金計算 實際利率 專案投資分析 單利與複利增長 關於CuteHand 1. 貨幣時間價值 實際上numpy和scipy很強大,

手把手Python獲取財經資料和視覺化分析

內容來自:微信公眾號:python金融量化 關注可瞭解更多的金融與Python乾貨。 “巧婦難為無米之炊”,找不到資料,量化分析也就無從談起。對於金融分析者來說,獲取資料是量化分析的第一步。Python的一個強大功能之一就是資料獲取(爬蟲)。但是對於沒時間學爬蟲程式的小白來說,pytho

Python量化】手把手python做股票分析入門

內容來自:微信公眾號:python金融量化 關注可瞭解更多的金融與Python乾貨。 目前,獲取股票資料的渠道有很多,而且基本上是免費的,比如,行情軟體有同花順、東方財富等,入口網站有新浪財經、騰訊財經、和訊網等。Python也有不少免費的開源api可以獲取交易行情資料,如pandas自

20T資料遷移經驗手把手群暉NAS資料遷移,黑裙暉通用!

原文網址:https://www.toutiao.com/a6630412335842329101/   2016年把Orico 陣列盒整成NAS,容量從8T增到20T,原本以為可以撐上個三五年,沒想到HIFI燒久了不僅錢包越來越癟,自動遇到Hao4K後就再也沒發現在家是一個儲存達

人工智慧應用-手把手Python硬體程式設計實現開啟或關閉電燈泡

之前我們已經給廣大愛好者或程式設計師朋友們,帶來了硬體版的或者說物聯網版本的Hello World C++Builder版、Delphi、Visual Basic.Net等的程式原始碼和教學資料,讓大家對硬體控制帶來一個嶄新的認識。有不少讀者使用者,建議我們出一套Python

阿里手把手構建一個高效能、高可用的大型分散式網站

大型分散式網站架構技術 大型網站的特點 大型網站一般有如下特點: 1.使用者多,分佈廣泛 2.大流量,高併發 3.海量資料,服

獨家 | 手把手Python建立簡單的神經網路(附程式碼)

作者:Michael J.Garbade 翻譯:陳之炎 校對:丁楠雅 本文共2000字,建議閱讀9分鐘。本文將為你演示如何建立一個神經網路,帶你深入瞭解神經網路的工作方式。 瞭解神經網路工作方式的最佳途徑莫過於親自建立一個神經網路,本文將演示如何做到這一點。

手把手做日曆控制元件——WinForm窗體控制元件庫和日曆演算法

WinForm窗體控制元件庫和日曆演算法 先來看看效果圖 圖中展現的是一個日曆自定義控制元件,其顯示格里高利曆、農曆及節氣。 控制元件製作 建立一個窗體控制元件庫專案,新建兩個控制元件:PanelDay和PanelMonth; Pan

手把手Python建立簡單的神經網路!

  資料   :   瞭解神經網路如何工作的最佳方法是學習如何從頭開始構建神經網路(而不是採用任何庫)。 在本文中,我們將演示如何利用Python程式語言建立一個簡單的神經網路。 問題 如下是一個展示問題的表格。

超有趣!手把手Python實現實時“人臉檢測”

  Instagram 的聯合創始人兼首席技術官 Mike Kreiger 說:“計算機視覺和機器學習其實已開始流行起來,但是對於大多數人來說,計算機看了影象後看到了什麼這方面還是比較模糊。”     近年來,計算機視覺這個神奇的領

手把手搭建Python虛擬環境,還不會的同學收藏學習哦!

不同的python專案可能會用到不同的包,而不同的包或不同的python版本之間可能存在衝突。因此,為每個專案建立不同的虛擬環境非常有用。它可以保證一個專案只訪問,它所在虛擬環境下安裝的包,保持全域性直譯器的乾淨整潔,而且由於環境是獨立的,因此不需要超戶許可權。 進群:943752371可以獲取