Sklearn 中 OneHotEncoder 解析


將離散型特征使用one-hot編碼,會讓特征之間的距離計算更加合理。離散特征進行one-hot編碼后,編碼后的特征,其實每一維度的特征都可以看做是連續的特征。就可以跟對連續型特征的歸一化方法一樣,對每一維特征進行歸一化。

from sklearn.preprocessing import OneHotEncode

參數:

OneHotEncoder(n_values=’auto’, 
             categorical_features=’all’, 
             dtype=<class ‘numpy.float64’>, 
             sparse=True, 
             handle_unknown=’error’)

handle_unknown是一個比較有用的參數,默認是"error",指定為"ignore”更好,這個參數的目的是數據在轉化為one-hot編碼時,如果遇到一個屬性值沒有事先指定,程序應該怎么辦?如果是error的話,程序就報錯停止了,其實不方便處理數據,反而是ignore更好,程序可以繼續執行
一個例子:

enc = OneHotEncoder()

enc.fit([["男", 0, 3], 
          ["男", 1, 0],
          ["女", 2, 1], 
          ["女", 0, 2]])

首先訓練一下數據集,提取每一列的屬性種類:

print(enc.categories_)
[array(['女', '男'], dtype=object), 
array([0, 1, 2], dtype=object), 
array([0, 1, 2, 3], dtype=object)]

一個例子:

from sklearn.preprocessing import  OneHotEncoder

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

# 如果不加 toarray() 的話,輸出的是稀疏的存儲格式,即索引加值的形式,也可以通過參數指定 sparse = False 來達到同樣的效果

ans = enc.transform([[0, 1, 3]]).toarray()  
print(ans) # 輸出 [[ 1.  0.  0.  1.  0.  0.  0.  0.  1.]]

下面解釋輸出結果的意思。對於輸入數組,這依舊是把每一行當作一個樣本,每一列當作一個特征,

  • 我們先來看第一個特征,即第一列 [0,1,0,1],也就是說它有兩個取值 0 或者 1,那么 one-hot 就會使用兩位來表示這個特征,[1,0] 表示 0, [0,1] 表示 1,在上例輸出結果中的前兩位 [1,0...],也就是表示該特征為 0
  • 第二個特征,第二列 [0,1,2,0],它有三種值,那么 one-hot 就會使用三位來表示這個特征,[1,0,0] 表示 0, [0,1,0] 表示 1,[0,0,1] 表示 2,在上例輸出結果中的第三位到第六位 [...0,1,0,0...]也就是表示該特征為 1
  • 第三個特征,第三列 [3,0,1,2],它有四種值,那么 one-hot 就會使用四位來表示這個特征,[1,0,0,0] 表示 0, [0,1,0,0] 表示 1,[0,0,1,0] 表示 2,[0,0,0,1] 表示 3,在上例輸出結果中的最后四位 [...0,0,0,1] 也就是表示該特征為 3
    雖然訓練樣本中的數值僅僅代表類別,但是也必須使用數值格式的數據,如果使用字符串格式的數據會報錯。

n_values=’auto’,表示每個特征使用幾維的數值由數據集自動推斷,即幾種類別就使用幾位來表示。

原文鏈接:https://blog.csdn.net/gxc19971128/article/details/106932288/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM