特徵篩選(隨機森林)

參考:http://blog.csdn.net/zjuPeco/article/details/77371645?locationNum=7&fps=1html

通常狀況下,數據集的特徵成百上千,所以有必要從中選取對結果影響較大的特徵來進行進一步建模,相關的方法有:主成分分析、lasso等,這裏咱們介紹的是經過隨機森林來進行篩選。數組

用隨機森林進行特徵重要性評估的思想比較簡單,主要是看每一個特徵在隨機森林中的每棵樹上作了多大的貢獻,而後取平均值,最後比較不一樣特徵之間的貢獻大小。dom

貢獻度的衡量指標包括:基尼指數(gini)袋外數據(OOB)錯誤率做爲評價指標來衡量。優化

衍生知識點:權重隨機森林的應用(用於增長小樣本的識別機率,從而提升整體的分類準確率)spa

隨機森林/CART樹在使用時通常經過gini值做爲切分節點的標準,而在加權隨機森林(WRF)中,權重的本質是賦給小類較大的權重,給大類較小的權重。也就是給小類更大的懲罰。權重的做用有2個,第1點是用於切分點選擇中加權計算gini值,表達式以下:.net

 

其中,N表示未分離的節點,NL和NR分別表示分離後的左側節點和右側節點,Wi爲c類樣本的類權重,ni表示節點內各種樣本的數量,Δi是不純度減小量,該值越大代表分離點的分離效果越好。3d

第2點是在終節點,類權重用來決定其類標籤,表達式以下:rest

參考文獻:隨機森林針對小樣本數據類權重設置     https://wenku.baidu.com/view/07ba98cca0c7aa00b52acfc789eb172ded639998.htmlcode

 

這裏介紹經過gini值來進行評價,咱們將變量的重要性評分用VIM來表示,gini值用GI表示,假設有m個特徵X1,X2,...Xc,如今要計算出每一個特徵Xj的gini指數評分VIMj,即第j個特徵在隨機森林全部決策樹中節點分裂不純度的平均改變量,gini指數的計算公式以下表示:orm

其中,k表示有k個類別,pmk表示節點m(將特徵m逐個對節點計算gini值變化量)中類別k所佔的比例。

特徵Xj在節點m的重要性,即節點m分枝先後的gini指數變化量爲:

其中GIl和GIr分別表示分枝後兩個新節點的gini指數。

若是特徵Xj在決策樹i中出現的節點在集合M中,那麼Xj在第i棵樹的重要性爲:

假設隨機森林共有n棵樹,那麼:

最後把全部求得的重要性評分進行歸一化處理就獲得重要性的評分:

經過sklearn中的隨機森林返回特徵的重要性:

from sklearn.ensemble import RandomForestClassifier forest = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1) importances = forest.feature_importances_ #樣例的輸出結果以下所示
 1) Alcohol 0.182483 2) Malic acid 0.158610 3) Ash 0.150948 4) Alcalinity of ash 0.131987 5) Magnesium 0.106589 6) Total phenols 0.078243 7) Flavanoids 0.060718 8) Nonflavanoid phenols 0.032033 9) Proanthocyanins 0.025400 10) Color intensity 0.022351 11) Hue 0.022078 12) OD280/OD315 of diluted wines 0.014645 13) Proline 0.013916

舉個樣例:

from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier import pandas as pd import numpy as np iris = load_iris() df = pd.DataFrame(iris.data, columns=iris.feature_names) df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75 df['species'] = pd.Categorical.from_codes(iris.target, iris.target_names) df.head() train, test = df[df['is_train']==True], df[df['is_train']==False] features = df.columns[:4] clf = RandomForestClassifier(n_jobs=2) y, _ = pd.factorize(train['species']) clf.fit(train[features], y) preds = iris.target_names[clf.predict(test[features])] pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds']) clf.feature_importances_
#返回特徵重要性的結果:
[ 0.085598  ,  0.01877088,  0.45324092,  0.4423902 ]

sklearn.metrics中的評估方法介紹: 

1、sklearn.metrics.roc_curve(true_y. pred_proba_score, pos_labal) #返回roc曲線的3個屬性:fpr, tpr,和閾值
import numpy as np from sklearn.metrics import roc_curve y = np.array([1,1,2,2]) pred = np.array([0.1, 0.4, 0.35, 0.8]) fpr, tpr, thresholds = roc_curve(y, pred, pos_label=2) fpr # array([ 0. , 0.5, 0.5, 1. ]) 
tpr      # array([ 0.5, 0.5, 1. , 1. ]) 
thresholds      #array([ 0.8 , 0.4 , 0.35, 0.1 ]) 
from sklearn.metrics import auc metrics.auc(fpr, tpr) 二、sklearn.metrics.auc(x, y, reorder=False) #計算AUC值,其中x,y分別爲數組形式,根據(xi,yi)在座標上的點,生成的曲線,計算AUC值

3、sklearn.metrics.roc_auc_score(true_y, pred_proba_y) #直接根據真實值(必須是二值)、預測值(能夠是0/1,或是prob)計算出auc值

參考:http://blog.csdn.net/cherdw/article/details/54971771

網格搜索調參:

grid.fit():運行網格搜索

grid_scores_:給出不一樣參數狀況下的評價結果

best_params_描述了已取得最佳結果的參數的組合

best_score_:成員提供優化過程期間觀察到的最好的評分

param_test1= {'n_estimators':range(10,71,10)}    #對參數'n_estimators'進行網格調參
gsearch1= GridSearchCV(estimator = RandomForestClassifier(min_samples_split=100,min_samples_leaf=20,max_depth=8,max_features='sqrt' ,random_state=10), param_grid =param_test1, scoring='roc_auc',cv=5) gsearch1.fit(X,y) gsearch1.grid_scores_,gsearch1.best_params_, gsearch1.best_score_ #輸出調參結果,並返回最優下的參數 #輸出結果以下:
([mean:0.80681, std: 0.02236, params: {'n_estimators': 10}, mean: 0.81600, std: 0.03275, params:{'n_estimators': 20}, mean: 0.81818, std: 0.03136, params:{'n_estimators': 30}, mean: 0.81838, std: 0.03118, params:{'n_estimators': 40}, mean: 0.82034, std: 0.03001, params:{'n_estimators': 50}, mean: 0.82113, std: 0.02966, params:{'n_estimators': 60}, mean: 0.81992, std: 0.02836, params:{'n_estimators': 70}], {'n_estimators':60},  0.8211334476626017) #多個特徵的網格搜索,以下所示
param_test2= {'max_depth':range(3,14,2),'min_samples_split':range(50,201,20)} gsearch2= GridSearchCV(estimator = RandomForestClassifier(n_estimators= 60, min_samples_leaf=20,max_features='sqrt' ,oob_score=True,random_state=10),  param_grid = param_test2,scoring='roc_auc',iid=False, cv=5) gsearch2.fit(X,y) gsearch2.grid_scores_,gsearch2.best_params_, gsearch2.best_score_ #經過查看袋外準確率(oob)來判別參數調整先後準確率的變化狀況
rf1= RandomForestClassifier(n_estimators= 60, max_depth=13, min_samples_split=110,  min_samples_leaf=20,max_features='sqrt' ,oob_score=True,random_state=10) rf1.fit(X,y) print(rf1.oob_score_) 
#經過每次對1-3個特徵進行網格搜索,重複此過程直到遍歷每一個特徵,並獲得最終的調參結果。
相關文章
相關標籤/搜索