日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

特征筛选(随机森林)

發布時間:2025/5/22 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 特征筛选(随机森林) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

一般情況下,數據集的特征成百上千,因此有必要從中選取對結果影響較大的特征來進行進一步建模,相關的方法有:主成分分析、lasso等,這里我們介紹的是通過隨機森林來進行篩選。

用隨機森林進行特征重要性評估的思想比較簡單,主要是看每個特征在隨機森林中的每棵樹上做了多大的貢獻,然后取平均值,最后比較不同特征之間的貢獻大小。

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

衍生知識點:權重隨機森林的應用(用于增加小樣本的識別概率,從而提高總體的分類準確率)

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

?

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

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

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

?

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

其中,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.1824832) Malic acid 0.1586103) Ash 0.1509484) Alcalinity of ash 0.1319875) Magnesium 0.1065896) Total phenols 0.0782437) Flavanoids 0.0607188) Nonflavanoid phenols 0.0320339) 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) 2、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個特征進行網格搜索,重復此過程直到遍歷每個特征,并得到最終的調參結果。

?

轉載于:https://www.cnblogs.com/xiaochouk/p/8583255.html

總結

以上是生活随笔為你收集整理的特征筛选(随机森林)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。