隨機(jī)森林原理

1、隨機(jī)森林步驟
1)給定包含N個樣本的數(shù)據(jù)集,經(jīng)過m次有放回的隨機(jī)抽樣操作,得到T個含m個訓(xùn)練樣本的采樣集
2)對每個采樣集,從所有屬性中隨機(jī)選擇k個屬性,選擇最佳分割屬性作為節(jié)點(diǎn)建立CART模型,最終建立擁有T個CART模型的隨機(jī)森林
注:k一般選擇(其中d為樣本所有屬性):
k=log_{2}^ztxw1pq
3)將模型用于測試機(jī),對于測試每個樣本會有T個預(yù)測值,對分類任務(wù)使用簡單投票法確定該樣本最終預(yù)測值,對回歸任務(wù)使用簡單平均法確定該樣本最終預(yù)測值

2、特征重要性
1)對整個隨機(jī)森林,得到相應(yīng)的袋外數(shù)據(jù)(out of bag,OOB)?計算袋外數(shù)據(jù)誤差,記為errOOB1.
注:每個采樣集只使用了初始訓(xùn)練集中約63.2%的樣本【每個樣本被抽到的概率是1/N,樣本不被抽到概率就是1-1/N,總共抽了m次,第m次試驗后樣本不被抽到的概率是(1-1/N)m,當(dāng)m趨近于無窮大時,(1-1/n)m=1/e,約等于36.8%】,另外抽不到的樣本叫做out-of-bag(OOB) examples,這部分?jǐn)?shù)據(jù)可以用于對決策樹的性能進(jìn)行評估,計算模型的預(yù)測錯誤率,稱為袋外數(shù)據(jù)誤差。這已經(jīng)經(jīng)過證明是無偏估計的,所以在隨機(jī)森林算法中不需要再進(jìn)行交叉驗證或者單獨(dú)的測試集來獲取測試集誤差的無偏估計

2)隨機(jī)對袋外數(shù)據(jù)OOB所有樣本的特征X加入噪聲干擾(可以隨機(jī)改變樣本在特征X處的值),再次計算袋外數(shù)據(jù)誤差,記為errOOB2。假設(shè)森林中有N棵樹,則特征X的重要性=∑errOOB2?errOOB1N∑errOOB2?errOOB1N。這個數(shù)值之所以能夠說明特征的重要性是因為,如果加入隨機(jī)噪聲后,袋外數(shù)據(jù)準(zhǔn)確率大幅度下降(即errOOB2上升),說明這個特征對于樣本的預(yù)測結(jié)果有很大影響,進(jìn)而說明重要程度比較高。

3)在特征重要性的基礎(chǔ)上,特征選擇的步驟如下:
a)計算每個特征的重要性,并按降序排序
b)確定要剔除的比例,依據(jù)特征重要性剔除相應(yīng)比例的特征,得到一個新的特征集
c)用新的特征集重復(fù)上述過程,直到剩下m個特征(m為提前設(shè)定的值)。
d)根據(jù)上述過程中得到的各個特征集和特征集對應(yīng)的袋外誤差率,選擇袋外誤差率最低的特征集。?

3、隨機(jī)森林優(yōu)點(diǎn)
隨機(jī)森林中的基學(xué)習(xí)器多樣性不僅來自樣本擾動,還來自屬性的擾動,這就使得最終模型的泛化性能可通過個體學(xué)習(xí)器之間的差異度增加而進(jìn)一步提升

3、python代碼
class sklearn.ensemble.RandomForestClassifier(
n_estimators=10, criterion='gini', max_depth=None, min_samples_split=2,
min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_split=1e-07, bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False,class_weight=None)
以下用常用參數(shù):
1)n_estimators:設(shè)置多少個基分類器(取決于數(shù)據(jù)量)
2)min_samplies_split:單獨(dú)葉子節(jié)點(diǎn)至少要有幾個樣本,
3)max_features:一次抽樣抽多少feature,回歸問題設(shè)置為特征數(shù),分類問題設(shè)置為sqrt(n_features)
4)max_depth:樹的最大深度(5-10)
5)oob_score

from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import precision_recall_curve
rf=RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=5,
min_samples_split=2,  oob_score=True, n_jobs=1 )
param_grid ={"n_estimators":[5,10],'max_depth':[3,5]}
gscv = GridSearchCV(clf,param_grid,n_jobs= -1,verbose = 1,cv = 5,error_score = 0,scoring='auc')
gscv.fit(X,y)
gscv.best_score_
gscv.best_params_
gscv.predict_proba(X)#refit=True,gscv為最佳分類器
gscv.grid_scores_#score=roc_auc,auc值
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容