sklearn之OneHotEncoder

一、簡介

OneHotEncoder(n_values = 'auto',categorical_features='all',dtype=<class 'numpy.float64'),sparse=True,handle_unknown = 'error')
  • 1、One-Hot編碼也稱爲“獨熱”式編碼,既然獨熱是隻能有一位是“發光”的。在衆多特徵中僅僅有一個特徵起作用。
  • 2、比如紅綠燈有三個特徵紅色、綠色、黃色,對這三種特徵進行數字化處理,我們可以簡單的通過定義紅色=1、綠色=2、黃色=3來進行分類,這種分類實現的是標籤編碼,即給不同的類別打上標籤。簡單分類的弊端是機器可能會根據數值進行排序,從而導致了紅色<綠色<黃色,我們事實只想讓機器去區分他們,某方面說他們的地位相等。
  • 3、爲了地位相等我們使用了One-Hot編碼,紅色(1,0,0)、綠色(0,1,0)、黃色(0,0,1)。這種情況下,每兩個向量之間的距離都是根號2,在向量空間中的距離是相等的,基本不會影響基於向量空間度量算法的效果。也可以看出來每次只有一位是1。

二、代碼操作及參數詳解

  • 1、簡答的代碼操作
from sklearn.preprocessing import  OneHotEncoder

enc = OneHotEncoder()
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])

ans = enc.transform([[0, 1, 3]]).toarray()
 # 如果不加 toarray() 的話,輸出的是稀疏的存儲格式,即索引加值的形式;也可以通過參數指定 sparse = False 來達到同樣的效果
print(ans) 
# 輸出 [[ 1.  0.  0.  1.  0.  0.  0.  0.  1.]]

註解:
(1)代碼中4*3的矩陣表示的是4個文本,每個文本具有3個特徵,即每一列是一個特徵維度。
(2)在矩陣第一列中[0,1,0,1]中,我們可以看到這列特徵中有兩個特徵,即0和1兩種;所以我們用兩位比特數據即可表示,(1,0)來表示0,用(0,1)來表示1
(3)在矩陣第一列中[0,1,2,0]中,我們可以看到這列特徵中有三個特徵,即0和1,2三種;所以我們用三位比特數據即可表示,(1,0,0)來表示0,用(0,1,0)來表示1,(0,0,1)來表示2
(4)在矩陣第一列中[3,0,1,2]中,我們可以看到這列特徵中有四個特徵,即0和1,2,3四種;所以我們用四位比特數據即可表示,(1,0,0,0)來表示0,用(0,1,0,0)來表示1,(0,0,1,0)來表示2,(0,0,0,1)來表示3。
(5)每一列的特徵表示完了之後,我們該如何表示第一行的文本[0,0,3]呢?
在第一個特徵中0的表示爲[1,0],在第二個特徵中0的表示爲[1,0,0],在第三個特徵中3的表示爲[0,0,0,1]。綜上我們第一行文本的表示爲[[1,0,1,0,0,0,0,0,1]]

  • 2、n_values=’auto’,表示每個特徵使用幾維的數值由數據集自動推斷,即每一列中有幾種不同的類別就使用幾位來表示。當然也可以自己指定,手動賦值特徵值的個數有助於防止類別的丟失,看下面這個例子:
from sklearn.preprocessing import  OneHotEncoder
enc = OneHotEncoder(n_values = [2, 3, 4])
enc.fit([[0, 0, 3],
         [1, 1, 0]])
ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) 
# 輸出 [[ 1.  0.  0.  0.  1.  0.  0.  0.  1.]]
  • 3、categorical_features = ‘all’,這個參數指定了對哪些特徵進行編碼,默認對所有類別都進行編碼。也可以自己指定選擇哪些特徵,通過索引或者 bool 值來指定,看下例:
from sklearn.preprocessing import  OneHotEncoder
enc = OneHotEncoder(categorical_features = [0,2]) 
# 等價於 [True, False, True],表示第一列和第三列的特徵有編碼
enc.fit([[0, 0, 3],
         [1, 1, 0],
         [0, 2, 1],
         [1, 0, 2]])
ans = enc.transform([[0, 2, 3]]).toarray()
print(ans) 
# 輸出 [[ 1.  0.  0.  0.  0.  1.  2.]]
#將有編碼的特徵列先進行輸出,沒有編碼的特徵列後輸出
  • 4、
    (1)dtype=<class ‘numpy.float64’> 表示編碼數值格式,默認是浮點型。
    (2)sparse=True 表示編碼的格式,默認爲 True,即爲稀疏的格式,指定 False 則就不用 toarray() 了
    (3)handle_unknown=’error’,其值可以指定爲 “error” 或者 “ignore”,即如果碰到未知的類別,是返回一個錯誤還是忽略它。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章