天天看點

【轉】特征工程之特征選擇1. 特征的來源2.  選擇合适的特征(專家經驗選擇特征的第一候選集)3.  尋找進階特征(特征組合/特征構造尋找進階特征)4. 特征選擇小結

寫在前面:轉自部落格園的一篇文章  特征工程之特征選擇

寫的挺好的。

特征工程是資料分析中最耗時間和精力的一部分工作,它不像算法和模型那樣是确定的步驟,更多是工程上的經驗和權衡。是以沒有統一的方法。這裡隻是對一些常用的方法做一個總結。本文關注于特征選擇部分。後面還有兩篇會關注于特征表達和特征預處理。

1. 特征的來源

    在做資料分析的時候,特征的來源一般有兩塊,一塊是業務已經整理好各種特征資料,我們需要去找出适合我們問題需要的特征;另一塊是我們從業務特征中自己去尋找進階資料特征。我們就針對這兩部分來分别讨論。

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的機器學習模型選擇特征。它在第一輪訓練的時候,會選擇所有的特征來訓練,得到了分類的超平面𝑤𝑥˙+𝑏=0wx˙+b=0後,如果有n個特征,那麼RFE-SVM會選擇出𝑤w中分量的平方值𝑤2𝑖wi2最小的那個序号i對應的特征,将其排除,在第二類的時候,特征數就剩下n-1個了,我們繼續用這n-1個特征和輸出值來訓練SVM,同樣的,去掉𝑤2𝑖wi2最小的那個序号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. 特征選擇小結

    特征選擇是特征工程的第一步,它關系到我們機器學習算法的上限。是以原則是盡量不錯過一個可能有用的特征,但是也不濫用太多的特征。

繼續閱讀