特徵工程是數據分析中最耗時間和精力的一部分工做,它不像算法和模型那樣是肯定的步驟,更可能是工程上的經驗和權衡。所以沒有統一的方法。這裏只是對一些經常使用的方法作一個總結。本文關注於特徵選擇部分。後面還有兩篇會關注於特徵表達和特徵預處理。html
在作數據分析的時候,特徵的來源通常有兩塊,一塊是業務已經整理好各類特徵數據,咱們須要去找出適合咱們問題須要的特徵;另外一塊是咱們從業務特徵中本身去尋找高級數據特徵。咱們就針對這兩部分來分別討論。算法
咱們首先看當業務已經整理好各類特徵數據時,咱們如何去找出適合咱們問題須要的特徵,此時特徵數可能成百上千,哪些纔是咱們須要的呢?segmentfault
第一步是找到該領域懂業務的專家,讓他們給一些建議。好比咱們須要解決一個藥品療效的分類問題,那麼先找到領域專家,向他們諮詢哪些因素(特徵)會對該藥品的療效產生影響,較大影響的和較小影響的都要。這些特徵就是咱們的特徵的第一候選集。機器學習
這個特徵集合有時候也可能很大,在嘗試降維以前,咱們有必要用特徵工程的方法去選擇出較重要的特徵結合,這些方法不會用到領域知識,而僅僅是統計學的方法。函數
最簡單的方法就是方差篩選。方差越大的特徵,那麼咱們能夠認爲它是比較有用的。若是方差較小,好比小於1,那麼這個特徵可能對咱們的算法做用沒有那麼大。最極端的,若是某個特徵方差爲0,即全部的樣本該特徵的取值都是同樣的,那麼它對咱們的模型訓練沒有任何做用,能夠直接捨棄。在實際應用中,咱們會指定一個方差的閾值,當方差小於這個閾值的特徵會被咱們篩掉。sklearn中的VarianceThreshold類能夠很方便的完成這個工做。學習
特徵選擇方法有不少,通常分爲三類:第一類過濾法比較簡單,它按照特徵的發散性或者相關性指標對各個特徵進行評分,設定評分閾值或者待選擇閾值的個數,選擇合適特徵。上面咱們提到的方差篩選就是過濾法的一種。第二類是包裝法,根據目標函數,一般是預測效果評分,每次選擇部分特徵,或者排除部分特徵。第三類嵌入法則稍微複雜一點,它先使用某些機器學習的算法和模型進行訓練,獲得各個特徵的權值係數,根據權值係數從大到小來選擇特徵。相似於過濾法,可是它是經過機器學習訓練來肯定特徵的優劣,而不是直接從特徵的一些統計學指標來肯定特徵的優劣。下面咱們分別來看看3類方法。優化
上面咱們已經講到了使用特徵方差來過濾選擇特徵的過程。除了特徵的方差這第一種方法,還有其餘一些統計學指標可使用。code
第二個可使用的是相關係數。這個主要用於輸出連續值的監督學習算法中。咱們分別計算全部訓練集中各個特徵與輸出值之間的相關係數,設定一個閾值,選擇相關係數較大的部分特徵。htm
第三個可使用的是假設檢驗,好比卡方檢驗。卡方檢驗能夠檢驗某個特徵分佈和輸出值分佈之間的相關性。我的以爲它比比粗暴的方差法好用。若是你們對卡方檢驗不熟悉,能夠參看這篇卡方檢驗原理及應用,這裏就不展開了。在sklearn中,可使用chi2這個類來作卡方檢驗獲得全部特徵的卡方值與顯著性水平P臨界值,咱們能夠給定卡方值閾值, 選擇卡方值較大的部分特徵。blog
除了卡方檢驗,咱們還可使用F檢驗和t檢驗,它們都是使用假設檢驗的方法,只是使用的統計分佈不是卡方分佈,而是F分佈和t分佈而已。在sklearn中,有F檢驗的函數f_classif和f_regression,分別在分類和迴歸特徵選擇時使用。
第四個是互信息,即從信息熵的角度分析各個特徵和輸出值之間的關係評分。在決策樹算法中咱們講到過互信息(信息增益)。互信息值越大,說明該特徵和輸出值之間的相關性越大,越須要保留。在sklearn中,可使用mutual_info_classif(分類)和mutual_info_regression(迴歸)來計算各個輸入特徵和輸出值之間的互信息。
以上就是過濾法的主要方法,我的經驗是,在沒有什麼思路的 時候,能夠優先使用卡方檢驗和互信息來作特徵選擇
包裝法的解決思路沒有過濾法這麼直接,它會選擇一個目標函數來一步步的篩選特徵。
最經常使用的包裝法是遞歸消除特徵法(recursive feature elimination,如下簡稱RFE)。遞歸消除特徵法使用一個機器學習模型來進行多輪訓練,每輪訓練後,消除若干權值係數的對應的特徵,再基於新的特徵集進行下一輪訓練。在sklearn中,可使用RFE函數來選擇特徵。
咱們下面以經典的SVM-RFE算法來討論這個特徵選擇的思路。這個算法以支持向量機來作RFE的機器學習模型選擇特徵。它在第一輪訓練的時候,會選擇全部的特徵來訓練,獲得了分類的超平面$w \dot x+b=0$後,若是有n個特徵,那麼RFE-SVM會選擇出$w$中份量的平方值$w_i^2$最小的那個序號i對應的特徵,將其排除,在第二類的時候,特徵數就剩下n-1個了,咱們繼續用這n-1個特徵和輸出值來訓練SVM,一樣的,去掉$w_i^2$最小的那個序號i對應的特徵。以此類推,直到剩下的特徵數知足咱們的需求爲止。
嵌入法也是用機器學習的方法來選擇特徵,可是它和RFE的區別是它不是經過不停的篩掉特徵來進行訓練,而是使用的都是特徵全集。在sklearn中,使用SelectFromModel函數來選擇特徵。
最經常使用的是使用L1正則化和L2正則化來選擇特徵。在以前講到的用scikit-learn和pandas學習Ridge迴歸第6節中,咱們講到正則化懲罰項越大,那麼模型的係數就會越小。當正則化懲罰項大到必定的程度的時候,部分特徵係數會變成0,當正則化懲罰項繼續增大到必定程度時,全部的特徵係數都會趨於0. 可是咱們會發現一部分特徵係數會更容易先變成0,這部分系數就是能夠篩掉的。也就是說,咱們選擇特徵係數較大的特徵。經常使用的L1正則化和L2正則化來選擇特徵的基學習器是邏輯迴歸。
此外也可使用決策樹或者GBDT。那麼是否是全部的機器學習方法均可以做爲嵌入法的基學習器呢?也不是,通常來講,能夠獲得特徵係數coef或者能夠獲得特徵重要度(feature importances)的算法才能夠作爲嵌入法的基學習器。
在咱們拿到已有的特徵後,咱們還能夠根據須要尋找到更多的高級特徵。好比有車的路程特徵和時間間隔特徵,咱們就能夠獲得車的平均速度這個二級特徵。根據車的速度特徵,咱們就能夠獲得車的加速度這個三級特徵,根據車的加速度特徵,咱們就能夠獲得車的加加速度這個四級特徵。。。也就是說,高級特徵能夠一直尋找下去。
在Kaggle之類的算法競賽中,高分團隊主要使用的方法除了集成學習算法,剩下的主要就是在高級特徵上面作文章。因此尋找高級特徵是模型優化的必要步驟之一。固然,在第一次創建模型的時候,咱們能夠先不尋找高級特徵,獲得之後基準模型後,再尋找高級特徵進行優化。
尋找高級特徵最經常使用的方法有:
若干項特徵加和: 咱們假設你但願根據每日銷售額獲得一週銷售額的特徵。你能夠將最近的7天的銷售額相加獲得。
若干項特徵之差: 假設你已經擁有每週銷售額以及每個月銷售額兩項特徵,能夠求一週前一月內的銷售額。
若干項特徵乘積: 假設你有商品價格和商品銷量的特徵,那麼就能夠獲得銷售額的特徵。
若干項特徵除商: 假設你有每一個用戶的銷售額和購買的商品件數,那麼就是獲得該用戶平均每件商品的銷售額。
固然,尋找高級特徵的方法遠不止於此,它須要你根據你的業務和模型須要而得,而不是隨便的兩兩組合造成高級特徵,這樣容易致使特徵爆炸,反而沒有辦法獲得較好的模型。我的經驗是,聚類的時候高級特徵儘可能少一點,分類迴歸的時候高級特徵適度的多一點。
特徵選擇是特徵工程的第一步,它關係到咱們機器學習算法的上限。所以原則是儘可能不錯過一個可能有用的特徵,可是也不濫用太多的特徵。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: liujianping-ok@163.com)