如何用 Python 對序列數據進行熱編碼

在本教程中,我們將學習將我們的輸入或輸出序列數據轉換為一個熱門編碼,用於序列分類。

一個熱編碼是機器學習的一個有用特性,因為很少有機器學習算法不能直接處理分類數據。在處理數據集時,我們遇到了沒有特定偏好順序的列。

如果我們正在處理序列分類類型問題,分類數據必須轉換成數字。當我們使用深度學習方法時,例如長短期記憶遞歸神經網絡,也可以使用這種技術。

首先,我們將討論分類數據。

什麼是分類數據?

分類數據是具有標籤值而不是數值的變量類型。這些類型的變量也被稱為名義變量。讓我們看看下面分類數據的例子。

  • 一輛“”可變配值:“馬魯蒂”和“捷豹”。
  • 值為“ Veg ”和“非 Veg ”的“食品”變量。
  • 一個“”放置”變量的值為:“第一個”、“第二個”和“第三個”。

正如我們在上面的代碼中看到的,一些類別可能有自然的關係,比如自然排序。在第三個示例中,“place”變量具有自然的值順序。

分類數據的問題

一些機器學習算法能夠直接處理分類數據。少數算法不能直接對標籤數據進行操作,因為它們要求所有的數據變量和輸出變量都是數字。

因此,我們必須將分層數據轉換為數字形式。假設分類變量是輸出變量。在這種情況下,您可能還希望通過模型將預測更改回分類形式,以表示它們或在某些應用中使用它們。

如何將分類數據轉換為數字數據

有兩種方法用於將分類數據轉換為數字數據。

  • 整數編碼
  • 一次性編碼

在下一節中,我們將討論一熱編碼。

什麼是熱門編碼?

單一熱編碼用於將分類變量轉換為數值。在進行進一步的數據分析之前,分類值被映射為整數值。每列包含“0”或“1”,對應於它被放置的列。在這個過程中,每個整數值都表示為二進制向量,除了用 1 標記的整數索引之外,該向量都為零。

一個熱編碼的例子

讓我們通過下面這個簡單的例子來理解它。

假設我們有一系列帶有“黃色”和“紅色”值的標籤。為了將它們轉換為數值,我們為“黃色”指定一個整數值 1,對應於列中的類別數,為“紅色”指定 0。當我們遇到這些標籤時,我們將分配相同的整數值。它被稱為整數編碼。

讓我們看另一個例子——假設有一個類別叫做動物,它有四個值——貓、狗、牛和駱駝。考慮由動物及其相應分類值組成的下表。

輸入表-

| 動物 | 動物的分類價值 |
| 貓 | five |
| 狗 | Ten |
| 母牛 | Fifteen |
| 駱駝 | Eleven |

經過一次熱編碼後,輸出如下所示。

| 貓 | 狗 | 母牛 | 駱駝 |
| one | Zero | Zero | Zero |
| Zero | one | Zero | Zero |
| Zero | Zero | one | Zero |
| Zero | Zero | Zero | one |

如果我們以向量的形式表示上面的輸出,那麼它將如下所示。

Cat – > [1,0,0,0]

狗- > [0,1,0,0]

奶牛- > [0,0,1,0]

Camel – > [0,0,0,1]

為什麼使用一個熱編碼?

One Hot 編碼的一個最大優點是,它代表分類數據,更具表現力。正如我們前面討論的,許多機器學習算法不能直接處理分類數據,因此需要將其轉換為整數。

我們可以直接或在需要的地方使用整數值。它可以解決自然序數在類別之間有關係的問題。例如-我們可以將整數值賦給“天氣”標籤,如‘冬季’、‘夏季’和‘季風’。

但是如果找不到序數關係,可能會有問題。如果我們允許表象傾斜或任何這樣的關係,它可能會損害解決問題的學習。

手動一次熱編碼

在下面的示例中,我們將考慮一個將被轉換為整數值的字母字符串示例。


hello world

現在,我們將對上面給定的字符串值實現一個熱編碼。讓我們看看下面的例子。

示例-


from numpy import argmax
# Here we are define input string
str_data = 'hello python'
print(str_data)
# Here we are defining possible input values of english alphabate
eng_alphabet = 'abcdefghijklmnopqrstuvwxyz '
# define a mapping of chars to integers
char_to_int = dict((c, i) for i, c in enumerate(eng_alphabet))
int_to_char = dict((i, c) for i, c in enumerate(eng_alphabet))
# input data is encoding in integer
int_encoded = [char_to_int[char] for char in data]
print(int_encoded)
# one hot encode
onehot_encoded = list()
for value in int_encoded:
  letter = [0 for _ in range(len(eng_alphabet))]
  letter[value] = 1
  onehot_encoded.append(letter)
print(onehot_encoded)
# invert encoding
inverted = int_to_char[argmax(onehot_encoded[0])]
print(inverted)

輸出:

hello python

[7, 4, 11, 11, 14, 26, 15, 24, 19, 7, 14, 13]

[[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, 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, 1, 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, 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, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

說明:

在上面的代碼中,我們已經聲明並打印了輸入字符串。接下來,我們定義了可能輸入值的宇宙。然後,創建從字符值到整數值的所有可能輸入的映射。我們使用這個映射來編碼輸入字符串。

我們可以在上面的輸出中看到,第一個字母 h 編碼為 7。然後,這個整數編碼被轉換成一個熱編碼。一次一個整數編碼字符。

每個字符都有特定的索引值;我們將特定字符的索引標記為 1。第一個字符在二進制向量 27 中表示為 7。我們將第 7指數標記為 1 表示 h

現在,我們將學習使用 scikit-learn 庫實現一個熱編碼。

一個使用 Scikit-learn 的熱編碼

在本例中,讓我們假設以下 3 個標籤的輸出序列。


"apple"
"mango"
"banana"

10 個時間步長示例序列可以是。


apple, apple, mango, apple, banana, banana, mango, apple.

我們用整數值對上面的標籤進行編碼,比如 1,2,3。在熱編碼中,我們將使用具有 3 個值的二進制向量,例如[1,0,0]。該序列包括序列中一個可能值的至少一個例子。

我們將使用 scikit-learn 庫。我們將使用其中的標籤編碼器模塊來創建標籤的整數編碼,使用 OneHotEncoder 來創建整數編碼值的 one hot 編碼。

讓我們理解下面的例子。

示例-


from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder
# defining sequence example
data_1 = ['apple', 'apple', 'mango', 'apple', 'banana', 'banana', 'mango', 'apple']
values_of_seq = array(data_1)
print(values_of_seq)
# first appling integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values_of_seq)
print(integer_encoded)
# Now doing 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)

輸出:

['apple' 'apple' 'mango' 'apple' 'banana' 'banana' 'mango' 'apple']
[0 0 2 0 1 1 2 0]
[[1\. 0\. 0.]
 [1\. 0\. 0.]
 [0\. 0\. 1.]
 [1\. 0\. 0.]
 [0\. 1\. 0.]
 [0\. 1\. 0.]
 [0\. 0\. 1.]
 [1\. 0\. 0.]]

解釋-

在上面的代碼中,首先,我們打印了標籤序列。然後,我們執行整數編碼,最後是熱編碼。OneHotEncoder 類返回組織良好的稀疏編碼。但是這對於某些應用來說並不有效,例如使用 keras 庫。

一種帶有 Keras 的熱編碼

假設我們有一個已經被整數編碼的序列。我們可以直接使用整數編碼,或者將整數編碼映射到標籤值上。我們可以使用to _ classic()函數對整數數據進行熱編碼。

在這個例子中,我們有五個整數值[0,1,2,3,4],我們有一個由以下 15 個數字組成的輸入序列。


data_1 = [1, 4, 3, 3, 0, 3, 2, 2, 4, 0, 1, 2, 1, 4, 3]

讓我們理解下面的例子。

示例-


from numpy import array
from numpy import argmax
from keras.utils import to_categorical
# define example
data_1 = [1, 4, 3, 3, 0, 3, 2, 2, 4, 0, 1, 2, 1, 4, 3]
data = array(data_1)
print(data)
# one hot encoding using the to_categorical() method
encoded = to_categorical(data)
print(encoded)
# invert encoding
inverted = argmax(encoded[0])
print(inverted)

輸出:

[1 4 3 3 0 3 2 2 4 0 1 2 1 4 3]
[[0\. 1\. 0\. 0\. 0.]
 [0\. 0\. 0\. 0\. 1.]
 [0\. 0\. 0\. 1\. 0.]
 [0\. 0\. 0\. 1\. 0.]
 [1\. 0\. 0\. 0\. 0.]
 [0\. 0\. 0\. 1\. 0.]
 [0\. 0\. 1\. 0\. 0.]
 [0\. 0\. 1\. 0\. 0.]
 [0\. 0\. 0\. 0\. 1.]
 [1\. 0\. 0\. 0\. 0.]
 [0\. 1\. 0\. 0\. 0.]
 [0\. 0\. 1\. 0\. 0.]
 [0\. 1\. 0\. 0\. 0.]
 [0\. 0\. 0\. 0\. 1.]
 [0\. 0\. 0\. 1\. 0.]]
1

解釋-

在上面的代碼中,我們已經將整數編碼為二進制向量並打印出來。然後,我們使用 Numpy argmax() 函數來反轉序列中第一個值的編碼。


原創文章,作者:QKTUZ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/324840.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
QKTUZ的頭像QKTUZ
上一篇 2025-01-13 13:23
下一篇 2025-01-13 13:23

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29

發表回復

登錄後才能評論