1. 程式人生 > >對one hot 編碼的理解,sklearn. preprocessing.OneHotEncoder()如何進行fit()的?

對one hot 編碼的理解,sklearn. preprocessing.OneHotEncoder()如何進行fit()的?

查閱了很多資料,逐漸知道了one hot 的編碼,但是始終沒理解sklearn. preprocessing.OneHotEncoder()如何進行fit()的?自己琢磨了一下,後來終於明白是怎麼回事了。

先看one hot 的編碼的理解:引用至:https://blog.csdn.net/wy250229163/article/details/52983760 

網上關於One-hot編碼的例子都來自於同一個例子,而且結果來的太抖了。查了半天,終於給搞清楚這個獨熱編碼是怎麼回事了,其實挺簡單的,這裡再做個總結。 首先,引出例子:

已知三個feature,三個feature分別取值如下: feature1
=[“male”, “female”] feature2=[“from Europe”, “from US”, “from Asia”] feature3=[“uses Firefox”, “uses Chrome”, “uses Safari”, “uses Internet Explorer”] 如果做普通資料處理,那麼我們就按0,1,2,3進行編號就行了。例如feature1=[0,1],feature2=[0,1,2],feature3=[0,1,2,3]。 那麼,如果某個樣本為[“male”,“from Asia”, “uses Chrome”],它就可以表示為[0,2,1]。 以上為普通編碼方式。 獨熱編碼(One-hot)換了一種方式編碼,先看看百科定義的: 獨熱編碼即 One
-Hot 編碼,又稱一位有效編碼,其方法是使用N位狀態暫存器來對N個狀態進行編碼,每個狀態都有它獨立的暫存器位,並且在任意時候,其中只有一位有效。 例如對六個狀態進行編碼: 自然順序碼為 000,001,010,011,100,101 獨熱編碼則是 000001,000010,000100,001000,010000,100000 通過以上可以看到,獨熱編碼每一個碼的總的位數取決於狀態的種類數,每一個碼裡的“1”的位置,就代表了哪個狀態生效。 還是回到我們最開始的例子,那麼我們將它換成獨熱編碼後,應該是: feature1=[01,10] feature2=[001,010,100] feature3=[0001,0010,0100,1000] 注意,獨熱編碼還有個特性是,當某個特徵裡的某一狀態生效後,此特徵的其他狀態因為是互斥的關係,必須全部為0,切必須全部新增到特徵裡,不能省略不寫。 所以,對於前邊樣本[“male”,“
from Asia”, “uses Chrome”],經過獨熱編碼後,它應該為: [01,00, 000,000,100, 0000,0010,0000,0000] 。 以上的獨熱編碼可以寫成簡寫形式: [1,0, 0,0,1, 0,1,0,0] 最後,摘抄下獨熱編碼的好處: 由於分類器往往預設資料資料是連續的,並且是有序的,但是在很多機器學習任務中,存在很多離散(分類)特徵,因而將特徵值轉化成數字時,往往也是不連續的, One-Hot 編碼解決了這個問題。 並且,經過獨熱編碼後,特徵變成了稀疏的了。這有兩個好處,一是解決了分類器不好處理屬性資料的問題,二是在一定程度上也起到了擴充特徵的作用。

然後網上很多人舉了一個sklearn. preprocessing.OneHotEncoder()的例子:例子如下:

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()

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

>>> enc.n_values_
array([2, 3, 4])

>>> enc.feature_indices_
array([0, 2, 5, 9])

>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

看了很多人的部落格,都沒懂,於是自己琢磨,原來是fit是看可以取多少個值。比如在

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

這個fit中,所有的陣列第一個元素取值分別為:0,1,0,1(黃色標註的),最大為1,且為兩種元素(0,1),說明用2個狀態位來表示就可以了,且該維度的value值為2(該值只與最大值有關係,最大值為1)

所有的陣列第二個元素取值分別為:0,1,2,0(紅色標註的),最大為2,且為兩種元素(0,1,2),說明用3個狀態位來表示就可以了,且該維度的value值為3(該值只與最大值有關係,最大值為2)

所有的陣列第三個元素取值分別為:3,0,1,2(天藍色標註的),最大為3,且為兩種元素(0,1,2,3),說明用4個狀態位來表示就可以了,且該維度的value值為4(該值只與最大值有關係,最大值為4)

所以整個的value值為(2,3,4),這也就解釋了 enc.n_values_等於array([2,3,4])的原因。而enc.feature_indices_則是特徵索引,該例子中value值為(2,3,4),則特徵索引從0開始,到2的位置為第一個,到2+3=5的位置為第二個,到2+3+4的位置為第三個,索引為array([0,2,5,9])

那麼接下來理解

>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

這個就好辦了,enc.transform就是將[0,1,1]這組特徵轉換成one hot編碼,toarray()則是轉成陣列形式。[0,1,1],
第一個元素是0,由於之前的fit的第一個維度為2(有兩種表示:10,01.程式中10表示0,01表示1),所以用1,0表示用黃色標註);
第二個元素是1,由於之前的fit的第二個維度為3(有三種表示:100,010,001.程式中100表示0,010表示1,001表示2),所以用0,1,0表示用紅色標註);
第三個元素是1,由於之前的fit的第三個維度為4(有四種表示:1000,0100,0010,0001.程式中1000表示0,0100表示1,0010表示2,0001表示3),
所以用0,1,0,0(用天藍色標註)表示。綜上所述:[0,1,1]就被表示為array([[ 1., 0., 0., 1., 0., 0., 1., 0., 0.]])。


排版不易,怎麼排著排著就字型變成這樣了,而且 還沒找到格式刷。不過,總算理解了one hot編碼和sklearn. preprocessing.OneHotEncoder()如何進行fit()的
有什麼問題的歡迎指正,謝謝!