在本教程中,我們將學習將我們的輸入或輸出序列數據轉換為一個熱門編碼,用於序列分類。
一個熱編碼是機器學習的一個有用特性,因為很少有機器學習演算法不能直接處理分類數據。在處理數據集時,我們遇到了沒有特定偏好順序的列。
如果我們正在處理序列分類類型問題,分類數據必須轉換成數字。當我們使用深度學習方法時,例如長短期記憶遞歸神經網路,也可以使用這種技術。
首先,我們將討論分類數據。
什麼是分類數據?
分類數據是具有標籤值而不是數值的變數類型。這些類型的變數也被稱為名義變數。讓我們看看下面分類數據的例子。
- 一輛「車」可變配值:「馬魯蒂」和「捷豹」。
- 值為「 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-tw/n/324840.html