天天看點

大神手把手教你:(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.

<b>1.什麼是</b><b>one-hot</b><b>編碼?</b>

one-hot編碼,又稱為一位有效編碼,主要是采用n位狀态寄存器來對n個狀态進行編碼,每個狀态都由他獨立的寄存器位,并且在任意時候隻有一位有效。

one-hot編碼是分類變量作為二進制向量的表示。這首先要求将分類值映射到整數值。然後,每個整數值被表示為二進制向量,除了整數的索引之外,它都是零值,它被标記為1。

<b>2.one-hot</b><b>編碼的工作示例</b>

讓我們用一個小例子來說明一下到底什麼是<b>one-hot</b><b>編碼</b>。假設我們有一個帶有'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]

[0, 1]

<b>1.為什麼要使用</b><b>one-hot</b><b>編碼?</b>

one hot 編碼進行資料的分類更準确,許多機器學習算法無法直接用于資料分類。資料的類别必須轉換成數字,對于分類的輸入和輸出變量都是一樣的。

我們可以直接使用整數編碼,需要時重新調整。這可能适用于在類别之間存在自然關系的問題,例如溫度“冷”(0)和”熱“(1)的标簽。

當沒有關系時,可能會出現問題,一個例子可能是标簽的“狗”和“貓”。

在這些情況下,我們想讓網絡更具表現力,為每個可能的标簽值提供機率式數字。這有助于進行問題網絡模組化。當輸出變量使用one-hot編碼時,它可以提供比單個标簽更準确的一組預測。

<b>2.手動</b><b>one hot</b><b>編碼:</b>

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

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

hello world。

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

完整的示例如下所示。

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

所有可能的輸入的映射都是從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, 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, 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, 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, 1, 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學習庫來對輸入序列自動完全捕獲輸入值的預期範圍的情況。

<b>3.one-hot encode with scikit-learn:</b>

在這個例子中,我們假設你有一個輸出序列如下3個标簽:

cold,warm,hot

10個時間序列的示例順序可以是:

cold,cold,warm,cold,hot,hot,warm,cold,warm,hot

這将首先需要一個整數編碼,如1,2,3,然後是整數到one hot編碼具有3個值的二進制向量,例如[1,0,0]。

這個情況下提供序列中每個可能值的至少一個示例。是以,我們可以使用自動方法來定義整數到二進制向量的映射。

運作示例首先列印标簽序列。之後是标簽的整數編碼,最後是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.]

 [ 0.  1.  0.]

0.  1.  0.]

0.  1.  0.]] 

['cold']

在下一個例子中,我們來看一下如何直接對一個整數值進行one hot編碼。

<b>4.one hot encode with keras:</b>

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

經過處理後,您可以直接使用整數。或者,您可以直接對整數進行one hot 編碼。這是非常重要的如果整數沒有真正的順序關系并且隻是标簽的占位符。

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

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

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

運作示例并列印輸入序列。

然後将整數編碼為二進制向量并列印。我們可以看到,正如我們預期的那樣,第一個整數值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.  1.  0.  0.]

<b>進一步閱讀:</b>

<b>總結:</b>

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

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

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

3.如何使用scikit-learn和keras庫來自動對python中的序列資料進行編碼。

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

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

文章原标題《how to one hot encode sequence data in python》,