在做資料分析的時候,特徵的**一般有兩塊,一塊是業務已經整理好各種特徵資料,我們需要去找出適合我們問題需要的特徵;另一塊是我們從業務特徵中自己去尋找高階資料特徵。我們就針對這兩部分來分別討論。
2. 選擇合適的特徵
我們首先看當業務已經整理好各種特徵資料時,我們如何去找出適合我們問題需要的特徵,此時特徵數可能成百上千,哪些才是我們需要的呢?
第一步是找到該領域懂業務的專家,讓他們給一些建議。比如我們需要解決乙個藥品療效的分類問題,那麼先找到領域專家,向他們諮詢哪些因素(特徵)會對該藥品的療效產生影響,較大影響的和較小影響的都要。這些特徵就是我們的特徵的第一候選集。
這個特徵集合有時候也可能很大,在嘗試降維之前,我們有必要用特徵工程的方法去選擇出較重要的特徵結合,這些方法不會用到領域知識,而僅僅是統計學的方法。
最簡單的方法就是方差篩選。方差越大的特徵,那麼我們可以認為它是比較有用的。如果方差較小,比如小於1,那麼這個特徵可能對我們的演算法作用沒有那麼大。最極端的,如果某個特徵方差為0,即所有的樣本該特徵的取值都是一樣的,那麼它對我們的模型訓練沒有任何作用,可以直接捨棄。在實際應用中,我們會指定乙個方差的閾值,當方差小於這個閾值的特徵會被我們篩掉。sklearn中的variancethreshold類可以很方便的完成這個工作。
特徵選擇方法有很多,一般分為三類:第一類過濾法比較簡單,它按照特徵的發散性或者相關性指針對各個特徵進行評分,設定評分閾值或者待選擇閾值的個數,選擇合適特徵。上面我們提到的方差篩選就是過濾法的一種。第二類是包裝法,根據目標函式,通常是**效果評分,每次選擇部分特徵,或者排除部分特徵。第三類嵌入法則稍微複雜一點,它先使用某些機器學習的演算法和模型進行訓練,得到各個特徵的權值係數,根據權值係數從大到小來選擇特徵。類似於過濾法,但是它是通過機器學習訓練來確定特徵的優劣,而不是直接從特徵的一些統計學指標來確定特徵的優劣。下面我們分別來看看3類方法
2.1 過濾法選擇特徵
上面我們已經講到了使用特徵方差來過濾選擇特徵的過程。除了特徵的方差這第一種方法,還有其他一些統計學指標可以使用。
第二個可以使用的是相關係數。這個主要用於輸出連續值的監督學習演算法中。我們分別計算所有訓練集中各個特徵與輸出值之間的相關係數,設定乙個閾值,選擇相關係數較大的部分特徵。
第三個可以使用的是假設檢驗,比如卡方檢驗。卡方檢驗可以檢驗某個特徵分布和輸出值分布之間的相關性。個人覺得它比比粗暴的方差法好用。如果大家對卡方檢驗不熟悉,可以參看這篇卡方檢驗原理及應用,這裡就不展開了。在sklearn中,可以使用chi2這個類來做卡方檢驗得到所有特徵的卡方值與顯著性水平p臨界值,我們可以給定卡方值閾值, 選擇卡方值較大的部分特徵。
除了卡方檢驗,我們還可以使用f檢驗和t檢驗,它們都是使用假設檢驗的方法,只是使用的統計分布不是卡方分布,而是f分布和t分布而已。在sklearn中,有f檢驗的函式f_classif和f_regression,分別在分類和回歸特徵選擇時使用。
第四個是互資訊,即從資訊熵的角度分析各個特徵和輸出值之間的關係評分。在決策樹演算法中我們講到過互資訊(資訊增益)。互資訊值越大,說明該特徵和輸出值之間的相關性越大,越需要保留。在sklearn中,可以使用mutual_info_classif(分類)和mutual_info_regression(回歸)來計算各個輸入特徵和輸出值之間的互資訊。
以上就是過濾法的主要方法,個人經驗是,在沒有什麼思路的 時候,可以優先使用卡方檢驗和互資訊來做特徵選擇
2.2 包裝法選擇特徵
包裝法的解決思路沒有過濾法這麼直接,它會選擇乙個目標函式來一步步的篩選特徵。
最常用的包裝法是遞迴消除特徵法(recursive feature elimination,以下簡稱rfe)。遞迴消除特徵法使用乙個機器學習模型來進行多輪訓練,每輪訓練後,消除若干權值係數的對應的特徵,再基於新的特徵集進行下一輪訓練。在sklearn中,可以使用rfe函式來選擇特徵。
我們下面以經典的svm-rfe演算法來討論這個特徵選擇的思路。這個演算法以支援向量機來做rfe的機器學習模型選擇特徵。它在第一輪訓練的時候,會選擇所有的特徵來訓練,得到了分類的超平面wx˙+b=0後,如果有n個特徵,那麼rfe-svm會選擇出w中分量的平方值w2i最小的那個序號i對應的特徵,將其排除,在第二類的時候,特徵數就剩下n-1個了,我們繼續用這n-1個特徵和輸出值來訓練svm,同樣的,去掉w2i最小的那個序號i對應的特徵。以此類推,直到剩下的特徵數滿足我們的需求為止。
2.3 嵌入法選擇特徵
嵌入法也是用機器學習的方法來選擇特徵,但是它和rfe的區別是它不是通過不停的篩掉特徵來進行訓練,而是使用的都是特徵全集。在sklearn中,使用selectfrommodel函式來選擇特徵。
最常用的是使用l1正則化和l2正則化來選擇特徵。在之前講到的用scikit-learn和pandas學習ridge回歸第6節中,我們講到正則化懲罰項越大,那麼模型的係數就會越小。當正則化懲罰項大到一定的程度的時候,部分特徵係數會變成0,當正則化懲罰項繼續增大到一定程度時,所有的特徵係數都會趨於0. 但是我們會發現一部分特徵係數會更容易先變成0,這部分係數就是可以篩掉的。也就是說,我們選擇特徵係數較大的特徵。常用的l1正則化和l2正則化來選擇特徵的基學習器是邏輯回歸。
此外也可以使用決策樹或者gbdt。那麼是不是所有的機器學習方法都可以作為嵌入法的基學習器呢?也不是,一般來說,可以得到特徵係數coef或者可以得到特徵重要度(feature importances)的演算法才可以做為嵌入法的基學習器。
3. 尋找高階特徵
在我們拿到已有的特徵後,我們還可以根據需要尋找到更多的高階特徵。比如有車的路程特徵和時間間隔特徵,我們就可以得到車的平均速度這個二級特徵。根據車的速度特徵,我們就可以得到車的加速度這個**特徵,根據車的加速度特徵,我們就可以得到車的加加速度這個四級特徵。。。也就是說,高階特徵可以一直尋找下去。
在kaggle之類的演算法競賽中,高分團隊主要使用的方法除了整合學習演算法,剩下的主要就是在高階特徵上面做文章。所以尋找高階特徵是模型優化的必要步驟之一。當然,在第一次建立模型的時候,我們可以先不尋找高階特徵,得到以後基準模型後,再尋找高階特徵進行優化。
尋找高階特徵最常用的方法有:
若干項特徵加和: 我們假設你希望根據每日銷售額得到一周銷售額的特徵。你可以將最近的7天的銷售額相加得到。
若干項特徵之差: 假設你已經擁有每週銷售額以及每月銷售額兩項特徵,可以求一周前一月內的銷售額。
若干項特徵乘積: 假設你有商品**和商品銷量的特徵,那麼就可以得到銷售額的特徵。
若干項特徵除商: 假設你有每個使用者的銷售額和購買的商品件數,那麼就是得到該使用者平均每件商品的銷售額。
當然,尋找高階特徵的方法遠不止於此,它需要你根據你的業務和模型需要而得,而不是隨便的兩兩組合形成高階特徵,這樣容易導致特徵**,反而沒有辦法得到較好的模型。個人經驗是,聚類的時候高階特徵盡量少一點,分類回歸的時候高階特徵適度的多一點。
4. 特徵選擇小結
特徵選擇是特徵工程的第一步,它關係到我們機器學習演算法的上限。因此原則是盡量不錯過乙個可能有用的特徵,但是也不濫用太多的特徵。
特徵工程之特徵選擇
在前一篇文章中我介紹了一些資料預處理的方法,原始資料在經過預處理之後可以被演算法處理了,但是實際中可能有一些特徵是沒有必要的,比如在中國採集的一些資料,那麼國籍就都是中國,其實也就沒有意義了,反映在統計量上就是方差過小,也就是樣本在這個特徵上變化很小。還有一種情況是特徵和最後的結果相關性很小,也就是...
特徵工程之特徵選擇
特徵選擇其實就是減少屬性個數,為什麼要這麼做呢?直接使用原始資料來訓練模型的話,雖然說在訓練模型上的準確率會非常高,但是在測試樣本上的準確率將會大打折扣,也就是會產生過擬合的現象。所以說需要選擇出最適合的屬性進行訓練。特徵選擇的原因 2 雜訊 部分特徵對 結果又影響 進行特徵選擇的時候有兩種情況 一...
特徵工程之特徵表達
在特徵工程之特徵選擇中,我們講到了特徵選擇的一些要點。本篇我們繼續討論特徵工程,不過會重點關注於特徵表達部分,即如果對某乙個特徵的具體表現形式做處理。主要包括缺失值處理,特殊的特徵處理比如時間和地理位置處理,離散特徵的連續化和離散化處理,連續特徵的離散化處理幾個方面。特徵有缺失值是非常常見的,大部分...