01_什麼是one-hot編碼、one-hot編碼過程詳解、爲什麼需要one-hot編碼?one-hot編碼的優缺點、使用sklearn中的API舉例

以下資料來自:網絡+最後的整合
https://www.cnblogs.com/shuaishuaidefeizhu/p/11269257.html
https://www.cntofu.com/book/85/ml/clean-feature/one-hot.md

一、什麼是one-hot編碼

One-Hot編碼,又稱爲一位有效編碼,主要是採用N位狀態寄存器來對N個狀態進行編碼,每個狀態都由他獨立的寄存器位,並且在任意時候只有一位有效。

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

二、one-hot編碼過程詳解

比如我們要對 “hello world” 進行one-hot編碼,怎麼做呢?
1、確定要編碼的對象—hello world
2、確定分類變量–h e l l o 空格 w o r l d,共27種類別(26個小寫字母 + 空格)
3、以上問題就相當於,有11個樣本,每個樣本有27個特徵,將其轉化爲二進制向量表示。
這裏有一個前提,特徵排列的順序不同,對應的二進制向量亦不同(比如我把空格放在第一列和a放第一列,one-hot編碼結果肯定是不同的)
因此我們必須要事先約定特徵排列的順序:
1、27種特徵首先進行整數編碼:a–0,b–1,c–2,…,z–25,空格–26
2、27種特徵按照整數編碼的大小從前往後排列
得到的one-hot編碼如下:
在這裏插入圖片描述
再比如:我們要對[“中國”, “美國”, “日本”]進行one-hot編碼,
怎麼做呢?
1、確定要編碼的對象–[“中國”,“美國”,“日本”、“美國”]
2、確定分類變量–中國 美國 日本,共3種類別。
3、以上問題就相當於,有3個樣本,每個樣本有3個特徵,將其轉化爲二進制向量表示。

我們首先進行特徵的整數編碼:中國–0,美國–1,日本–2,並將特徵按照從小到大排列
得到one-hot編碼如下:
在這裏插入圖片描述

三、爲什麼需要one-hot編碼?

one hot編碼是將類別變量轉換爲機器學習算法易於利用的一種形式的過程。

上面的 hello world 相當於多分類的問題(27分類),每個樣本只對應於一個類別(即只在對應的特徵處值爲1,其餘地方值爲0),而我們的分類結果,得到的往往是隸屬於某個類別的概率,這樣在進行損失函數(例如交叉熵損失)或準確率計算時,變得非常方便。

四、one-hot編碼的缺陷

one-hot編碼要求每個類別之間相互獨立,如果之間存在某種連續型的關係,或許使用distributed respresentation(分佈式)更加合適。

五、one-hot的好處:

1、解決了分類器不好處理屬性數據的問題。
2、在一定程度上也起到了擴充特徵的作用。

六、舉例

from sklearn import preprocessing

enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
print(enc.transform([[0, 1, 3]]).toarray())

輸出結果爲:

[[1. 0. 0. 1. 0. 0. 0. 0. 1.]]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章