from http://breezedeus.github.io/2014/11/15/breezedeus-feature-processing.htmlhtml
請您移步原文觀看,本文只供本身學習使用git
特徵工程(Feature Engineering)常常被說爲機器學習中的black art,這裏麪包含了不少不可言說的方面。怎麼處理好特徵,最重要的固然仍是對要解決問題的瞭解。可是,它其實也有不少科學的地方。這篇文章我之因此命名爲特徵處理(Feature Processing),是由於這裏面要介紹的東西只是特徵工程中的一小部分。這部分比較基礎,比較容易說,因此由此開始。github
單個原始特徵(或稱爲變量)一般屬於如下幾類之一:web
本文中我主要介紹針對單個特徵的處理方法,雖然也會附帶介紹基礎的特徵組合方法。同時處理多個特徵,以及更復雜的特徵處理方法介紹,之後我再另外細說。下面我由淺入深地逐漸說明針對這三類特徵的經常使用處理方法。算法
這節要講的處理技術,應該剛接觸機器學習不久的同窗都會知道。機器學習
除了歸一化(去中心,方差歸一),不用作太多特殊處理,能夠直接把連續特徵扔到模型裏使用。函數
可使用One-hot(也叫One-of-k)的方法把每一個無序特徵轉化爲一個數值向量。好比一個無序特徵color
有三種取值:red
,green
,blue
。那麼能夠用一個長度爲3的向量來表示它,向量中的各個值分別對應於red
,green
,blue
。如:學習
color取值 | 向量表示 |
---|---|
red | (1, 0, 0) |
green | (0, 1, 0) |
blue | (0, 0, 1) |
這種方法在NLP裏用的不少,就是所謂的詞向量模型。變換後的向量長度對於詞典長度,每一個詞對應於向量中的一個元素。spa
機器學習書籍裏在講這個的時候介紹的處理方法可能跟我上面說的有點差異。上面說的表達方式裏有一個維度是能夠省略的。既然咱們知道color
必定是取3個值中的一個,那麼咱們知道向量的前兩個元素值,就能推斷第3個值是多少。因此,其實用下面的方式就能夠表達究竟是哪一種顏色:code
color取值 | 向量表示 |
---|---|
red | (1, 0) |
green | (0, 1) |
blue | (0, 0) |
這樣表達的好處是少用了一個維度,下降了轉化後特徵之間的相關性。但在實際問題中特徵基本都或多或少會有些缺失。使用第一種表達方式就能夠用全0的向量來表示值缺失,而第二種表達方式是無法表達缺失的。
有些特徵雖然也像無序特徵那樣只取限定的幾個值,可是這些值之間有順序的含義。例如一我的的狀態status
有三種取值:bad
, normal
, good
,顯然bad
< normal
< good
。
固然,對有序特徵最簡單的處理方式是忽略其中的順序關係,把它當作無序的,這樣咱們就可使用處理無序特徵的方式來處理它。在實際問題中,這種處理方式其實用的不少。
固然有些問題裏有序可能會很重要,這時候就不該該把其中的順序關係丟掉。通常的表達方式以下:
status取值 | 向量表示 |
---|---|
bad | (1, 0, 0) |
normal | (1, 1, 0) |
good | (1, 1, 1) |
上面這種表達方式很巧妙地利用遞進表達了值之間的順序關係。
最容易讓人掉以輕心的,每每就是你們以爲最簡單的事。在特徵處理中,最容易讓剛入門同窗忽略的,是對連續特徵的處理方式。
以線性分類器Linear Regression (LinearReg)爲例,它是經過特徵的線性加權來預測因變量yy:
但大部分實際狀況下,yy與xx都不會是這麼簡單的線性關係,甚至連單調關係都不會有。舉個只有一個特徵的例子,若是yy與xx的實際關係以下圖:
那麼直接把xx扔進LinearReg模型是怎麼也得不到好結果的。不少人會想着既然線性分類器搞不定,那就直接找個非線性的好了,好比高斯核的SVM。咱們確實能夠經過這種簡單換算法的方式解決這個簡單的問題。但對於不少實際問題(如廣告點擊率預測),每每特徵很是多,這時候時間約束一般不容許咱們使用很複雜的非線性分類器。這也是爲何算法發展這麼多年,廣告點擊率預測最經常使用的方法仍是Logistic Regression (LogisticReg)。
對於上面這個問題,有沒有什麼辦法使得LinearReg也能處理得不錯?固然是有,就是對原始特徵xx作轉化,把原來的非線性關係轉化爲線性關係。
最經常使用的轉化方式是對xx作離散化(discretization),也就是把原來的值分段,轉化成一個取值爲0或1的向量。原始值落在某個段裏,向量中此段對應的元素就爲1,不然爲0。
離散化的目標是yy與轉化後向量裏的每一個元素都保持比較好的線性關係。
好比取離散點{0.5,1.5,2.5}{0.5,1.5,2.5},經過判斷xx屬於(−∞,0.5)(−∞,0.5),[0.5,1.5)[0.5,1.5),[1.5,2.5)[1.5,2.5),[2.5,+∞)[2.5,+∞)中哪段來把它離散化爲4維的向量。下面是一些例子的離散結果:
原始值xx | 離散化後的值 |
---|---|
0.1 | (1, 0, 0, 0) |
1.3 | (0, 1, 0, 0) |
3.2 | (0, 0, 0, 1) |
5.8 | (0, 0, 0, 1) |
離散化方法的關鍵是怎麼肯定分段中的離散點。下面是經常使用的選取離散點的方法:
上面介紹的這種離散化爲0/1向量的方法有個問題,它在離散時不會考慮到具體的xx到離散邊界的距離。好比等距離散中取離散點爲{0.5,1.5,2.5}{0.5,1.5,2.5},那麼1.499,1.501和2.49分別會離散爲(0, 1, 0, 0),(0, 0, 1, 0)和(0, 0, 1, 0)。1.499和1.501很接近,但是就由於這種強制分段的離散致使它們離散的結果差距很大。
針對上面這種硬離散的一種改進就是使用軟離散,也就是在離散時考慮到xx與附近離散點的距離,離散出來的向量元素值能夠是0/1以外的其餘值。有興趣的同窗能夠去ESL1這本書中找點感受。
函數變換直接把原來的特徵經過非線性函數作變換,而後把原來的特徵,以及變換後的特徵一塊兒加入模型進行訓練。經常使用的變換函數見下表,不過其實你能夠嘗試任何函數。
經常使用非線性函數f(x)f(x) | xx的取值範圍 |
---|---|
xαxα; α∈(−∞,+∞)α∈(−∞,+∞) | (−∞,+∞)(−∞,+∞) |
log(x)log(x) | (0,+∞)(0,+∞) |
log(x1−x)log(x1−x) | (0,1)(0,1) |
這個方法操做起來很簡單,但記得對新加入的特徵作歸一化。
對於咱們前面的問題,只要把x2x2,x3x3也做爲特徵加入便可,由於實際上yy就是xx的一個三次多項式。
咱們可使用笛卡爾乘積的方式來組合2個或更多個特徵。好比有兩個類別特徵color
和light
,它們分別能夠取值爲red
,green
,blue
和on
, off
。這兩個特徵各自能夠離散化爲3維和2維的向量。對它們作笛卡爾乘積轉化,就能夠組合出長度爲6的特徵,它們分別對應着原始值對(red, on)
,(red, off)
,(green, on)
,(green, off)
,(blue, on)
,(blue, off)
。下面的矩陣表達方式更清楚地說明了這種組合。
X | on |
off |
---|---|---|
red |
||
green |
||
blue |
對於3個特徵的笛卡爾乘積組合,能夠表達爲立方的形式。更多特徵的組合依次類推。 這個方法也能夠直接用於連續特徵與類別特徵之間的組合,只要把連續特徵當作是1維的類別特徵就行了,這時候組合後特徵對應的值就不是0/1了,而是連續特徵的取值。
在上節中我已經介紹了一些經常使用的離散化單個連續特徵的方法,其中一個是畫圖觀察趨勢。畫圖觀察趨勢的好處是直觀、可解釋性強,壞處是很麻煩。當要離散化的特徵不少時,這種方法可操做性較差。
機器學習中有個很好解釋,速度也不錯的模型——決策樹模型。大白話說決策樹模型就是一大堆的if else
。它天生就能夠對連續特徵分段,因此把它用於離散化連續特徵合情合理。我稱這種方法爲決策樹離散化方法。例如Gmail在對信件作重要性排序時就使用了決策樹離散化方法2。
決策樹離散化方法一般也是每次離散化一個連續特徵,作法以下:
單獨用此特徵和目標值yy訓練一個決策樹模型,而後把訓練得到的模型內的特徵分割點做爲離散化的離散點。
這種方法固然也能夠同時離散化多個連續特徵,可是操做起來就更復雜了,實際用的很少。
核方法常常做爲線性模型的一種推廣出現。以線性迴歸模型爲例,它對應的核方法以下:
其中{xi}ni=1{xi}i=1n爲訓練樣本點,K(xi,xj)K(xi,xj)爲核函數,好比經常使用的高斯核函數爲:
若是咱們把上面模型裏的{K(x,xi)}ni=1{K(x,xi)}i=1n當作特徵,而θθ當作模型參數的話,上面的模型仍舊是個線性模型。因此能夠認爲核方法只是特徵函數變換的一種方式。
固然,若是把核函數K(xi,xj)K(xi,xj)當作一種類似度的話,那上面的模型就是kNN模型了,或者叫作加權平均模型也能夠。
由於核方法在預測時也要用到訓練樣本點,耗內存且計算量大,因此在數據量較大的實際問題中用的並很少。
到此,我已經介紹了很多針對單個特徵的處理方法。這些處理方法很難說哪一個好哪一個很差。有些問題這個好,有些問題那個好,也沒什麼絕招能直接判斷出哪一種方法能適合哪些問題。惟一的招就是:
Experiment a lot!
Trevor Hastie et al. The Elements of Statistical Learning, 2001. ↩
Douglas Aberdeen et al. The Learning Behind Gmail Priority Inbox, 2010. ↩