python對離散數據進行編碼

機器學習中會遇到一些離散型數據,沒法帶入模型進行訓練,因此要對其進行編碼,經常使用的編碼方式有兩種:app

一、特徵不具有大小意義的直接獨熱編碼(one-hot encoding)機器學習

二、特徵有大小意義的採用映射編碼(map encoding)學習

兩種編碼在sklearn.preprocessing包裏有實現方法編碼

 

映射編碼就是用一個字典指定不一樣離散型數據對應哪些數字spa

import pandas as pd   
df = pd.DataFrame([    
            ['green', 'M', 10.1, 'label1'],     
            ['red', 'L', 13.5, 'label2'],     
            ['blue', 'XL', 15.3, 'label2']])    
# color、label不具有大小含義,size具備大小意義  
df.columns = ['color', 'size', 'length', 'label']
size_mapping = {    
           'XL': 3,    
           'L': 2,    
           'M': 1}    
df['size'] = df['size'].map(size_mapping)    

 

one-hot編碼有兩種形式:code

1.one-hot編碼,又稱獨熱編碼、一位有效編碼。其方法是使用N位狀態寄存器來對N個狀態進行編碼,每一個狀態都有它獨立的寄存器位,而且在任意時候,其中只有一位有效。舉個例子,假設咱們有四個樣本(行),每一個樣本有三個特徵(列),如圖:blog

      

上圖中咱們已經對每一個特徵進行了普通的數字編碼:咱們的feature_1有兩種可能的取值,好比是男/女,這裏男用1表示,女用2表示。那麼one-hot編碼是怎麼搞的呢?咱們再拿feature_2來講明:get

這裏feature_2 有4種取值(狀態),咱們就用4個狀態位來表示這個特徵,one-hot編碼就是保證每一個樣本中的單個特徵只有1位處於狀態1,其餘的都是0。pandas

      

對於2種狀態、三種狀態、甚至更多狀態都是這樣表示,因此咱們能夠獲得這些樣本特徵的新表示:class

      

one-hot編碼將每一個狀態位都當作一個特徵。對於前兩個樣本咱們能夠獲得它的特徵向量分別爲

     

one-hot在提取文本特徵上的應用

  one hot在特徵提取上屬於詞袋模型(bag of words)。關於如何使用one-hot抽取文本特徵向量咱們經過如下例子來講明。假設咱們的語料庫中有三段話:

    我愛中國

    爸爸媽媽愛我

    爸爸媽媽愛中國

咱們首先對預料庫分離並獲取其中全部的詞,而後對每一個此進行編號:

    1 我; 2 愛; 3 爸爸; 4 媽媽;5 中國

而後使用one hot對每段話提取特徵向量:

 

所以咱們獲得了最終的特徵向量爲

    我愛中國  ->   1,1,0,0,1

    爸爸媽媽愛我  ->  1,1,1,1,0

    爸爸媽媽愛中國  ->  0,1,1,1,1

 

優缺點分析

優勢:一是解決了分類器很差處理離散數據的問題,二是在必定程度上也起到了擴充特徵的做用(上面樣本特徵數從3擴展到了9)

缺點:在文本特徵表示上有些缺點就很是突出了。首先,它是一個詞袋模型,不考慮詞與詞之間的順序(文本中詞的順序信息也是很重要的);其次,它假設詞與詞相互獨立(在大多數狀況下,詞與詞是相互影響的);最後,它獲得的特徵是離散稀疏的。

 

one-hot的基本思想:將離散型特徵的每一種取值都當作一種狀態,若你的這一特徵中有N個不相同的取值,那麼咱們就能夠將該特徵抽象成N種不一樣的狀態,one-hot編碼保證了每個取值只會使得一種狀態處於「激活態」,也就是說這N種狀態中只有一個狀態位值爲1,其餘狀態位都是0。舉個例子,假設咱們以學歷爲例,咱們想要研究的類別爲小學、中學、大學、碩士、博士五種類別,咱們使用one-hot對其編碼就會獲得:

       

2.dummy encoding,啞變量編碼直觀的解釋就是任意的將一個狀態位去除。仍是拿上面的例子來講,咱們用4個狀態位就足夠反應上述5個類別的信息,也就是咱們僅僅使用前四個狀態位 [0,0,0,0] 就能夠表達博士了。只是由於對於一個咱們研究的樣本,他已不是小學生、也不是中學生、也不是大學生、又不是研究生,那麼咱們就能夠默認他是博士,是否是。(額,固然他現實生活也可能上幼兒園,可是咱們統計的樣本中他並非,^-^)。因此,咱們用啞變量編碼能夠將上述5類表示成:

      

dummy encoding在pandas中有get_dummies()方法能夠實現

相關文章
相關標籤/搜索