機器學習中會遇到一些離散型數據,沒法帶入模型進行訓練,因此要對其進行編碼,經常使用的編碼方式有兩種: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在特徵提取上屬於詞袋模型(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對其編碼就會獲得:
dummy encoding在pandas中有get_dummies()方法能夠實現