close

在很多機器學習分類任務中,分類結果通常不是數值,而是字詞

例如:["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]

這樣的特徵並沒有辦法提供電腦進行後續的分類計算

因為,分類器往往默認數據是連續的,並且是有序的

為了解決上述問題,其中一種可能的解決方法是採用 one-hot encoding

對於每一個分類任務,如果它有m個可能值,那麼經過 one-hot encoding 後,就變成了m個二元特徵

這些特徵互斥,每次只有一個為 1,其他為 0,因此,數據會變成稀疏的

原文網址:https://read01.com/zh-tw/5M32Jn.html#.WYCeboiGOUk

在這邊我們利用 python 的 scikit-learn 插件來完成 one-hot encoding

假設我們的資料為:

data = [cold, cold, warm, cold, hot, hot, warm, cold, warm, hot]

則 python 的程式內容如下:

首先我們先導入所需要的 python package

from numpy import array
from numpy import argmax
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import OneHotEncoder

接著將資料轉換成陣列格式

# define example
# 利用 numpy 所提供的 array 將 data 轉換成陣列格式
data = ['cold', 'cold', 'warm', 'cold', 'hot', 'hot', 'warm', 'cold', 'warm', 'hot']
values = array(data)
print(values)

輸出結果如下圖,可以看到將 data 做一個輸出列印的動作

Screenshot_1.png

然後我們將 data 轉換成數值模式

這邊是利用 numpy 所提供的 LabelEncoder 將 data 轉換成數值編碼

其中 cold 被編碼成 0;hot 被編碼成 1;warm 被編碼成 2

# integer encode
label_encoder = LabelEncoder()
integer_encoded = label_encoder.fit_transform(values)
print(integer_encoded)

輸出結果如下圖

Screenshot_2.png

這樣的結果仍然不能被我們使用,所以需要進一步的轉換

這邊是利用 numpy 所提供的 onehot_encoder 將 data 進一步轉換成 2 位元編碼 (binary encode)

# 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)

輸出結果如下圖

Screenshot_3.png

到這邊,我們已經完成將 data 轉換成 2 位元編碼格式,適合做後續的處理

雖然這樣的方式對於機器學習來說,並不夠好,因為數據是稀疏的 (包含太多 0 )

但是至少是機器可處理的

最後我們可以透過逆轉換,將 2 位元編碼內容轉換回原本的 data

例如我們將第一筆 2 位元編碼 [1. 0. 0.] 逆轉換回 "cold"

# invert first example
inverted = label_encoder.inverse_transform([argmax(onehot_encoded[0, :])])
print(inverted)

Screenshot_4.png

 

arrow
arrow

    MingHsiangSu 發表在 痞客邦 留言(0) 人氣()