對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()的
有什么問題的歡迎指正,謝謝!
 


免責聲明!

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



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