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為樣本所有屬性):
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次試驗(yàn)后樣本不被抽到的概率是(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)行交叉驗(yàn)證或者單獨(dú)的測試集來獲取測試集誤差的無偏估計
2)隨機(jī)對袋外數(shù)據(jù)OOB所有樣本的特征X加入噪聲干擾(可以隨機(jī)改變樣本在特征X處的值)挎袜,再次計算袋外數(shù)據(jù)誤差,記為errOOB2肥惭。假設(shè)森林中有N棵樹盯仪,則特征X的重要性=∑errOOB2?errOOB1N∑errOOB2?errOOB1N。這個數(shù)值之所以能夠說明特征的重要性是因?yàn)槊鄞校绻尤腚S機(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值