參考:
http://www.17bigdata.com/隨機森林進行特征重要性度量的詳細說明/
https://www.baidu.com/link?url=HHOCABNztkHxNFOggE0DcgGdbZWKF6Z3kfhs69P65Q7KmZt7lhtxfhceZFBNYU0qxVqhamASwSFLPSE5GRC6kRvXD2kwRqVzQ0VhG_6yeIq&wd=&eqid=d0496b7b0006c658000000035daee8c9
https://www.jianshu.com/p/591523125637
https://www.cnblogs.com/tan2810/p/10594710.html
https://www.cnblogs.com/yszd/p/9583420.html
https://blog.csdn.net/weixin_40848065/article/details/87825538
有這么一句話在業界廣泛流傳:數據和特征決定了機器學習的上限,而模型和算法只是逼近這個上限而已。那特征工程到底是什么呢?顧名思義,其本質是一項工程活動,目的是最大限度地從原始數據中提取特征以供算法和模型使用。

特征選擇:區別於特征抽取,通過選擇原始特征數據的子集,以提高后面分類器的性能,或者加深整體上對問題的理解(某特征或者某屬性對輸出變量的影響)
選擇特征的過程,就是評估特征的過程,哪一個特征對輸出變量的影響大,就選擇哪一個;這個時候就涉及到各種評價指標,那么選取不同的,有些論文也會涉及這種不同的評價指標來進行測試。
特征選擇方法中,有一種方法是利用隨機森林,進行特征的重要性度量,選擇重要性較高的特征。下面對如何計算重要性進行說明。
1 特征重要性度量 計算某個特征X的重要性時,具體步驟如下:
1)對每一顆決策樹,選擇相應的袋外數據(out of bag,OOB)計算袋外數據誤差,記為errOOB1. 所謂袋外數據是指,每次建立決策樹時,通過重復抽樣得到一個數據用於訓練決策樹,這時還有大約1/3的數據沒有被利用,沒有參與決策樹的建立。這部分數據可以用於對決策樹的性能進行評估,計算模型的預測錯誤率,稱為袋外數據誤差。 這已經經過證明是無偏估計的,所以在隨機森林算法中不需要再進行交叉驗證或者單獨的測試集來獲取測試集誤差的無偏估計。
2)隨機對袋外數據OOB所有樣本的特征X加入噪聲干擾(可以隨機改變樣本在特征X處的值),再次計算袋外數據誤差,記為errOOB2。 3)假設森林中有N棵樹,則特征X的重要性=∑(errOOB2-errOOB1)/N。這個數值之所以能夠說明特征的重要性是因為,如果加入隨機噪聲后,袋外數據准確率大幅度下降(即errOOB2上升),說明這個特征對於樣本的預測結果有很大影響,進而說明重要程度比較高。
2 特征選擇 在特征重要性的基礎上,特征選擇的步驟如下:
1)計算每個特征的重要性,並按降序排序
2)確定要剔除的比例,依據特征重要性剔除相應比例的特征,得到一個新的特征集
3)用新的特征集重復上述過程,直到剩下m個特征(m為提前設定的值)。
4)根據上述過程中得到的各個特征集和特征集對應的袋外誤差率,選擇袋外誤差率最低的特征集。
step1 通過方差選擇特征
最簡單的方法就是方差篩選。方差越大的特征,那么我們可以認為它是比較有用的。如果方差較小,比如小於1,那么這個特征可能對我們的算法作用沒有那么大。最極端的,如果某個特征方差為0,即所有的樣本該特征的取值都是一樣的,那么它對我們的模型訓練沒有任何作用,可以直接舍棄。在實際應用中,我們會指定一個方差的閾值,當方差小於這個閾值的特征會被我們篩掉。sklearn中的VarianceThreshold類可以很方便的完成這個工作。
step 2
第三個可以使用的是假設檢驗,比如卡方檢驗。卡方檢驗可以檢驗某個特征分布和輸出值分布之間的相關性。個人覺得它比比粗暴的方差法好用。如果大家對卡方檢驗不熟悉,可以參看這篇卡方檢驗原理及應用,這里就不展開了。在sklearn中,可以使用chi2這個類來做卡方檢驗得到所有特征的卡方值與顯著性水平P臨界值,我們可以給定卡方值閾值, 選擇卡方值較大的部分特征。 除了卡方檢驗,我們還可以使用F檢驗和t檢驗,它們都是使用假設檢驗的方法,只是使用的統計分布不是卡方分布,而是F分布和t分布而已。在sklearn中,有F檢驗的函數f_classif和f_regression,分別在分類和回歸特征選擇時使用。
第四個是互信息,即從信息熵的角度分析各個特征和輸出值之間的關系評分。在決策樹算法中我們講到過互信息(信息增益)。互信息值越大,說明該特征和輸出值之間的相關性越大,越需要保留。在sklearn中,可以使用mutual_info_classif(分類)和mutual_info_regression(回歸)來計算各個輸入特征和輸出值之間的互信息。 '
以上就是過濾法的主要方法,個人經驗是,在沒有什么思路的 時候,可以優先使用卡方檢驗和互信息來做特征選擇(摘自: https://www.baidu.com/link?url=V3XjRzifgSVzhRmUVntzCkojPjSz_zdedSb0GrWjpPIbP2GMjyHvfhDhQjBeqo2ifJNjpDtZ9j1nAiaQLusyba&wd=&eqid=d0496b7b0006c658000000035daee8c9)
2.3 嵌入法選擇特征
嵌入法也是用機器學習的方法來選擇特征,但是它和RFE的區別是它不是通過不停的篩掉特征來進行訓練,而是使用的都是特征全集。在sklearn中,使用SelectFromModel函數來選擇特征。
最常用的是使用L1正則化和L2正則化來選擇特征。在之前講到的用scikit-learn和pandas學習Ridge回歸第6節中,我們講到正則化懲罰項越大,那么模型的系數就會越小。當正則化懲罰項大到一定的程度的時候,部分特征系數會變成0,當正則化懲罰項繼續增大到一定程度時,所有的特征系數都會趨於0. 但是我們會發現一部分特征系數會更容易先變成0,這部分系數就是可以篩掉的。也就是說,我們選擇特征系數較大的特征。常用的L1正則化和L2正則化來選擇特征的基學習器是邏輯回歸。
此外也可以使用決策樹或者GBDT。那么是不是所有的機器學習方法都可以作為嵌入法的基學習器呢?也不是,一般來說,可以得到特征系數coef或者可以得到特征重要度(feature importances)的算法才可以做為嵌入法的基學習器。‘
3. 尋找高級特征
在我們拿到已有的特征后,我們還可以根據需要尋找到更多的高級特征。比如有車的路程特征和時間間隔特征,我們就可以得到車的平均速度這個二級特征。根據車的速度特征,我們就可以得到車的加速度這個三級特征,根據車的加速度特征,我們就可以得到車的加加速度這個四級特征。。。也就是說,高級特征可以一直尋找下去。
在Kaggle之類的算法競賽中,高分團隊主要使用的方法除了集成學習算法,剩下的主要就是在高級特征上面做文章。所以尋找高級特征是模型優化的必要步驟之一。當然,在第一次建立模型的時候,我們可以先不尋找高級特征,得到以后基准模型后,再尋找高級特征進行優化。
尋找高級特征最常用的方法有:
若干項特征加和: 我們假設你希望根據每日銷售額得到一周銷售額的特征。你可以將最近的7天的銷售額相加得到。
若干項特征之差: 假設你已經擁有每周銷售額以及每月銷售額兩項特征,可以求一周前一月內的銷售額。
若干項特征乘積: 假設你有商品價格和商品銷量的特征,那么就可以得到銷售額的特征。
若干項特征除商: 假設你有每個用戶的銷售額和購買的商品件數,那么就是得到該用戶平均每件商品的銷售額。
當然,尋找高級特征的方法遠不止於此,它需要你根據你的業務和模型需要而得,而不是隨便的兩兩組合形成高級特征,這樣容易導致特征爆炸,反而沒有辦法得到較好的模型。個人經驗是,聚類的時候高級特征盡量少一點,分類回歸的時候高級特征適度的多一點。’

基於樹的特征選擇 (Tree-based feature selection) 基於樹的預測模型(見 sklearn.tree 模塊,森林見 sklearn.ensemble 模塊)能夠用來計算特征的重要程度,因此能用來去除不相關的特征(結合 sklearn.feature_selection.SelectFromModel):

決策樹是各種機器學習任務的常用方法。 決策樹是比較能滿足於數據挖掘的方法,因為它在特征值的縮放和其他各種轉換下保持不變,對無關特征是可靠的,而且能生成可被檢查的模型。 然而,生長很深的樹容易學習到高度不規則的模式,即過學習,在訓練集上具有低偏差和高方差的特點。隨機森林是平均多個深決策樹以降低方差的一種方法,其中,決策樹是在一個數據集上的不同部分進行訓練的。這是以偏差的小幅增加和一些可解釋性的喪失為代價的,但是在最終的模型中通常會大大提高性能。

簡單來說,隨機森林是一堆的決策樹組成的,每一個決策樹有一個結果,看有多少個決策樹對同一個Y進行了投票我們就可以確定Y。分類就是少數服從多數,回歸就是各個決策樹去平均值。 隨機森林是在機器學習里面是一個能達到非常非常好的分類回歸結果的模型,大家經常看到的datacastle的那類的數據比賽,也是非常多使用隨機森林的。我們直接拿隨機森林進行分類或回歸,一般也能得到比較好的結果。絕大多數情況下,隨機森林都會比線性回歸、logistic分類、K近鄰、決策樹要好。 在python的sklearn中,隨機森林的實現是非常簡單的。
簡單實現:https://www.jianshu.com/p/591523125637
隨機森林對特征重要性排序:https://blog.csdn.net/qq_15111861/article/details/80366787
性能及優缺點
優點:
1.很多的數據集上表現良好;
2.能處理高維度數據,並且不用做特征選擇;
3.訓練完后,能夠給出那些feature比較重要;
4.訓練速度快,容易並行化計算。
缺點:
1.在噪音較大的分類或回歸問題上會出現過擬合現象;
2.對於不同級別屬性的數據,級別划分較多的屬性會對隨機森林有較大影響,則RF在這種數據上產出的數值是不可信的。
定義:
隨機森林指的是利用多棵決策樹對樣本進行訓練並預測的一種分類器。可回歸可分類。 所以隨機森林是基於多顆決策樹的一種集成學習算法,常見的決策樹算法主要有以下幾種:
- ID3:使用信息增益g(D,A)進行特征選擇
- C4.5:信息增益率 =g(D,A)/H(A)
- CART:基尼系數 一個特征的信息增益(或信息增益率,或基尼系數)越大,表明特征對樣本的熵的減少能力更強,這個特征使得數據由不確定性到確定性的能力越強。
隨機森林屬於集成學習(Ensemble Learning)中的bagging算法。在集成學習中,主要分為bagging算法和boosting算法。我們先看看這兩種方法的特點和區別。
下面是將決策樹與這些算法框架進行結合所得到的新的算法:
1)Bagging + 決策樹 = 隨機森林
2)AdaBoost + 決策樹 = 提升樹
3)Gradient Boosting + 決策樹 = GBDT
代碼實現參考:
https://www.cnblogs.com/yszd/p/9583420.html
https://www.cnblogs.com/tan2810/p/10594710.html
