中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
(數(shù)據(jù)科學(xué)學(xué)習(xí)手札26)隨機(jī)森林分類(lèi)器原理詳解&Python與R實(shí)現(xiàn)

轉(zhuǎn)自 博客園

一、簡(jiǎn)介

  作為集成學(xué)習(xí)中非常著名的方法,隨機(jī)森林被譽(yù)為“代表集成學(xué)習(xí)技術(shù)水平的方法”,由于其簡(jiǎn)單、容易實(shí)現(xiàn)、計(jì)算開(kāi)銷(xiāo)小,使得它在現(xiàn)實(shí)任務(wù)中得到廣泛使用,因?yàn)槠鋪?lái)源于決策樹(shù)和bagging,決策樹(shù)我在前面的一篇博客中已經(jīng)詳細(xì)介紹,下面就來(lái)簡(jiǎn)單介紹一下集成學(xué)習(xí)與Bagging;

二、集成學(xué)習(xí)

  集成學(xué)習(xí)(ensemble learning)是指通過(guò)構(gòu)建并結(jié)合多個(gè)學(xué)習(xí)器來(lái)完成學(xué)習(xí)任務(wù),有時(shí)也被稱(chēng)為多分類(lèi)器系統(tǒng)(multi-classifier system)等;

  集成學(xué)習(xí)的一般結(jié)構(gòu)如下:

可以看出,集成學(xué)習(xí)的一般過(guò)程就是先產(chǎn)生一組“個(gè)體學(xué)習(xí)器”(individual learner),再使用某種策略將這些學(xué)習(xí)器結(jié)合起來(lái)。個(gè)體學(xué)習(xí)器通常由一個(gè)現(xiàn)有的學(xué)習(xí)算法從訓(xùn)練數(shù)據(jù)產(chǎn)生,例如C4.5決策樹(shù)算法,BP神經(jīng)網(wǎng)絡(luò)算法等,此時(shí)集成中只包含同種類(lèi)型的個(gè)體學(xué)習(xí)器,譬如“決策樹(shù)集成”純由若干個(gè)決策樹(shù)學(xué)習(xí)器組成,這樣的集成是“同質(zhì)”(homogeneous),同質(zhì)集成中的個(gè)體學(xué)習(xí)器又稱(chēng)作“基學(xué)習(xí)器”(base learner),相應(yīng)的學(xué)習(xí)算法稱(chēng)為“基學(xué)習(xí)算法”(base learning algorithm)。集成也可以包含不同類(lèi)型的個(gè)體學(xué)習(xí)器,例如可以同時(shí)包含決策樹(shù)與神經(jīng)網(wǎng)絡(luò),這樣的集成就是“異質(zhì)”的(heterogenous),異質(zhì)集成中的個(gè)體學(xué)習(xí)器由不同的學(xué)習(xí)算法組成,這時(shí)不再有基學(xué)習(xí)算法;對(duì)應(yīng)的,個(gè)體學(xué)習(xí)器也不再稱(chēng)作基學(xué)習(xí)器,而是改稱(chēng)為“組件學(xué)習(xí)器”(component learner)或直接成為個(gè)體學(xué)習(xí)器;

  集成學(xué)習(xí)通過(guò)將多個(gè)學(xué)習(xí)器進(jìn)行結(jié)合,??色@得比單一學(xué)習(xí)器更加顯著優(yōu)越的泛化性能,尤其是對(duì)“弱學(xué)習(xí)器”(weak learner),因此集成學(xué)習(xí)的很多理論研究都是針對(duì)弱學(xué)習(xí)器來(lái)的,通過(guò)分別訓(xùn)練各個(gè)個(gè)體學(xué)習(xí)器,預(yù)測(cè)時(shí)將待預(yù)測(cè)樣本輸入每個(gè)個(gè)體學(xué)習(xí)器中產(chǎn)出結(jié)果,最后使用加權(quán)和、最大投票法等方法將所有個(gè)體學(xué)習(xí)器的預(yù)測(cè)結(jié)果處理之后得到整個(gè)集成的最終結(jié)果,這就是集成學(xué)習(xí)的基本思想;

三、Bagging

  通過(guò)集成學(xué)習(xí)的思想,我們可以看出,想要得到泛化性能強(qiáng)的集成,則集成中的個(gè)體學(xué)習(xí)器應(yīng)當(dāng)盡可能相互獨(dú)立,但這在現(xiàn)實(shí)任務(wù)中幾乎無(wú)法實(shí)現(xiàn),所以我們可以通過(guò)盡可能增大基學(xué)習(xí)器間的差異來(lái)達(dá)到類(lèi)似的效果;一方面,我們希望盡可能增大基學(xué)習(xí)器間的差異:給定一個(gè)數(shù)據(jù)集,一種可能的做法是對(duì)訓(xùn)練樣本進(jìn)行采樣,分離出若干個(gè)子集,再?gòu)拿總€(gè)子集中訓(xùn)練出一個(gè)基學(xué)習(xí)器,這樣我們訓(xùn)練出的各個(gè)基學(xué)習(xí)器因?yàn)楦髯杂?xùn)練集不同的原因就有希望取得比較大的差異;另一方面,為了獲得好的集成,我們希望個(gè)體學(xué)習(xí)器的性能不要太差,因?yàn)槿绻且沟貌蓸映龅拿總€(gè)自己彼此不相交,則由于每個(gè)子集樣本數(shù)量不足而無(wú)法進(jìn)行有效學(xué)習(xí),從而無(wú)法確保產(chǎn)生性能較好的個(gè)體學(xué)習(xí)器,為了解決這矛盾的問(wèn)題,Bagging應(yīng)運(yùn)而生;

  Bagging是并行式集成學(xué)習(xí)方法最著名的代表,它基于自助采樣法(bootstrap sampling),對(duì)給定包含m個(gè)樣本的數(shù)據(jù)集,我們先隨機(jī)取出一個(gè)樣本放入采樣集中,再把該樣本放回初始數(shù)據(jù)集,即一次有放回的簡(jiǎn)單隨機(jī)抽樣,這樣重復(fù)指定次數(shù)的抽樣,得到一個(gè)滿(mǎn)足要求的采樣集合,且樣本數(shù)據(jù)集中的樣本有的在該采樣集中多次出現(xiàn),有的則從未出現(xiàn)過(guò),我們可以將那些沒(méi)有在該采樣集出現(xiàn)過(guò)的樣本作為該采樣集對(duì)應(yīng)訓(xùn)練出的學(xué)習(xí)器的驗(yàn)證集,來(lái)近似估計(jì)該個(gè)體學(xué)習(xí)器的泛化能力,這被稱(chēng)作“包外估計(jì)”(out-of-bag estimate),令Dt表示第t個(gè)個(gè)體學(xué)習(xí)器對(duì)應(yīng)的采樣集,令Hoob(x)表示該集成學(xué)習(xí)器對(duì)樣本x的包外預(yù)測(cè),即僅考慮那些未使用x訓(xùn)練的學(xué)習(xí)器在x上的預(yù)測(cè)表現(xiàn),有:

則Bagging泛化誤差的包外估計(jì)為:

而且包外樣本還可以在一些特定的算法上實(shí)現(xiàn)較為實(shí)用的功能,例如當(dāng)基學(xué)習(xí)器是決策樹(shù)時(shí),可使用保外樣本來(lái)輔助剪枝,或用于估計(jì)決策樹(shù)中各結(jié)點(diǎn)的后驗(yàn)概率以輔助對(duì)零訓(xùn)練樣本節(jié)點(diǎn)的處理;當(dāng)基學(xué)習(xí)器是神經(jīng)網(wǎng)絡(luò)時(shí),可以用包外樣本來(lái)輔助進(jìn)行早停操作;

四、隨機(jī)森林

  隨機(jī)森林(Random Forest)是Bagging的一個(gè)擴(kuò)展變體。其在以決策樹(shù)為基學(xué)習(xí)器構(gòu)建Bagging集成的基礎(chǔ)上,進(jìn)一步在決策樹(shù)的訓(xùn)練過(guò)程中引入了隨機(jī)屬性選擇,即:傳統(tǒng)決策樹(shù)在選擇劃分屬性時(shí)是在當(dāng)前結(jié)點(diǎn)的屬性集合中(假設(shè)共有d個(gè)結(jié)點(diǎn))基于信息純度準(zhǔn)則等選擇一個(gè)最優(yōu)屬性,而在隨機(jī)森林中,對(duì)基決策樹(shù)的每個(gè)結(jié)點(diǎn),先從該結(jié)點(diǎn)的屬性集合中隨機(jī)選擇一個(gè)包含k個(gè)屬性的子集,再對(duì)該子集進(jìn)行基于信息準(zhǔn)則的劃分屬性選擇;這里的k控制了隨機(jī)性的引入程度;若令k=d,則基決策樹(shù)的構(gòu)建與傳統(tǒng)決策樹(shù)相同;若令k=1,則每次的屬性選擇純屬隨機(jī),與信息準(zhǔn)則無(wú)關(guān);一般情況下,推薦k=log2d。

  隨機(jī)森林對(duì)Bagging只做了小小的改動(dòng),但是與Bagging中基學(xué)習(xí)器的“多樣性”僅通過(guò)樣本擾動(dòng)(即改變采樣規(guī)則)不同,隨機(jī)森林中基學(xué)習(xí)器的多樣性不僅來(lái)自樣本擾動(dòng),還來(lái)自屬性擾動(dòng),這就使得最終集成的泛化性能可通過(guò)個(gè)體學(xué)習(xí)器之間差異度的增加而進(jìn)一步提升;

  隨機(jī)森林的收斂性與Bagging類(lèi)似,但隨機(jī)森林在基學(xué)習(xí)器數(shù)量較為可觀時(shí)性能會(huì)明顯提升,即隨著基學(xué)習(xí)器數(shù)量的增加,隨機(jī)森林會(huì)收斂到更低的泛化誤差;

五、Python實(shí)現(xiàn)

  我們使用sklearn.ensemble中的RandomForestClassifier()來(lái)進(jìn)行隨機(jī)森林分類(lèi),其細(xì)節(jié)如下:

常用參數(shù):

n_estimator:整數(shù)型,控制隨機(jī)森林算法中基決策樹(shù)的數(shù)量,默認(rèn)為10,我建議取一個(gè)100-1000之間的奇數(shù);

criterion:字符型,用來(lái)指定做屬性劃分時(shí)使用的評(píng)價(jià)準(zhǔn)則,'gini'表示基尼系數(shù),也就是CART樹(shù),'entropy'表示信息增益;

max_features:用來(lái)控制每個(gè)結(jié)點(diǎn)劃分時(shí)從當(dāng)前樣本的屬性集合中隨機(jī)抽取的屬性個(gè)數(shù),即控制了隨機(jī)性的引入程度,默認(rèn)為'auto',有以下幾種選擇:

  1.int型時(shí),則該傳入?yún)?shù)即作為max_features;

  2.float型時(shí),將 傳入數(shù)值*n_features 作為max_features;

  3.字符串時(shí),若為'auto',max_features=sqrt(n_features);'sqrt'時(shí), 同'auto';'log2'時(shí),max_features=log2(n_features);

  4.None時(shí),max_features=n_features;

max_depth:控制每棵樹(shù)所有預(yù)測(cè)路徑的長(zhǎng)度上限(即從根結(jié)點(diǎn)出發(fā)經(jīng)歷的劃分屬性的個(gè)數(shù)),建議訓(xùn)練時(shí)該參數(shù)從小逐漸調(diào)大;默認(rèn)為None,此時(shí)每棵樹(shù)只有等到所有的葉結(jié)點(diǎn)中都只存在一種類(lèi)別的樣本或結(jié)點(diǎn)中樣本數(shù)小于min_samples_split時(shí)化成葉結(jié)點(diǎn)時(shí)該預(yù)測(cè)路徑才停止生長(zhǎng);

min_samples_split:該參數(shù)控制當(dāng)結(jié)點(diǎn)中樣本數(shù)量小于某個(gè)整數(shù)k時(shí)將某個(gè)結(jié)點(diǎn)標(biāo)記為葉結(jié)點(diǎn)(即停止該預(yù)測(cè)路徑的生長(zhǎng)),傳入?yún)?shù)即控制k,當(dāng)傳入?yún)?shù)為整數(shù)時(shí),該參數(shù)即為k;當(dāng)傳入?yún)?shù)屬于0.0~1.0之間時(shí),k=傳入?yún)?shù)*n_samples;默認(rèn)值為2;

max_leaf_nodes:控制每棵樹(shù)的最大葉結(jié)點(diǎn)數(shù)量,默認(rèn)為None,即無(wú)限制;

min_impurity_decrease:控制過(guò)擬合的一種措施,傳入一個(gè)浮點(diǎn)型的數(shù),則在每棵樹(shù)的生長(zhǎng)過(guò)程中,若下一個(gè)節(jié)點(diǎn)中的信息純度與上一個(gè)結(jié)點(diǎn)中的節(jié)點(diǎn)純度差距小于這個(gè)值,則這一次劃分被剪去;

booststrap:bool型變量,控制是否采取自助法來(lái)劃分每棵樹(shù)的訓(xùn)練數(shù)據(jù)(即每棵樹(shù)的訓(xùn)練數(shù)據(jù)間是否存在相交的可能),默認(rèn)為T(mén)rue;

oob_score:bool型變量,控制是否用包外誤差來(lái)近似學(xué)習(xí)器的泛化誤差;

n_jobs:控制并行運(yùn)算時(shí)的核心數(shù),默認(rèn)為單核即1,特別的,設(shè)置為-1時(shí)開(kāi)啟所有核心;

random_rate:設(shè)置隨機(jī)數(shù)種子,目的是控制算法中隨機(jī)的部分,默認(rèn)為None,即每次運(yùn)行都是隨機(jī)地(偽隨機(jī));

class_weight:用于處理類(lèi)別不平衡問(wèn)題,即為每一個(gè)類(lèi)別賦權(quán),默認(rèn)為None,即每個(gè)類(lèi)別權(quán)重都為1;'balanced'則自動(dòng)根據(jù)樣本集中的類(lèi)別比例為算法賦權(quán);

函數(shù)輸出項(xiàng):

estimators_:包含所有訓(xùn)練好的基決策樹(shù)細(xì)節(jié)的列表;

classes:顯示所有類(lèi)別;

n_classes_:顯示類(lèi)別總數(shù);

n_features_:顯示特征數(shù)量(訓(xùn)練之后才有這個(gè)輸出項(xiàng));

feature_importances_:顯示訓(xùn)練中所有特征的重要程度,越大越重要;

oob_score_:學(xué)習(xí)器的包外估計(jì)得分;

下面我們以sklearn.datasets自帶的威斯康辛州乳腺癌數(shù)據(jù)作為演示數(shù)據(jù),具體過(guò)程如下:

from sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import f1_score as f1from sklearn.metrics import confusion_matrix as confrom sklearn import datasets###載入威斯康辛州乳腺癌數(shù)據(jù)X,y = datasets.load_breast_cancer(return_X_y=True)###分割訓(xùn)練集與測(cè)試集X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3)###初始化隨機(jī)森林分類(lèi)器,這里為類(lèi)別做平衡處理clf = RandomForestClassifier(class_weight='balanced',random_state=1)###返回由訓(xùn)練集訓(xùn)練成的模型對(duì)驗(yàn)證集預(yù)測(cè)的結(jié)果result = clf.fit(X_train,y_train).predict(X_test)###打印混淆矩陣print('\n'+'混淆矩陣:')print(con(y_test,result))###打印F1得分print('\n'+'F1 Score:')print(f1(y_test,result))###打印測(cè)試準(zhǔn)確率print('\n'+'Accuracy:')print(clf.score(X_test,y_test))

運(yùn)行結(jié)果如下:

可以看出,隨機(jī)森林的性能十分優(yōu)越。

六、R實(shí)現(xiàn)

  在R語(yǔ)言中我們使用randomForest包中的randomForest()函數(shù)來(lái)進(jìn)行隨機(jī)森林模型的訓(xùn)練,其主要參數(shù)如下:

formula:一種 因變量~自變量 的公式格式;

data:用于指定訓(xùn)練數(shù)據(jù)所在的數(shù)據(jù)框;

xtest:randomForest提供了一種很舒服的(我竊認(rèn)為)將訓(xùn)練與驗(yàn)證一步到位的體制,這里xtest傳入的就是驗(yàn)證集中的自變量;

ytest:對(duì)應(yīng)xtest的驗(yàn)證集的label列,缺省時(shí)則xtest視為無(wú)標(biāo)簽的待預(yù)測(cè)數(shù)據(jù),這時(shí)可以使用test$predicted來(lái)調(diào)出對(duì)應(yīng)的預(yù)測(cè)值(實(shí)在是太舒服了);

ntree:基決策樹(shù)的數(shù)量,默認(rèn)是500(R相當(dāng)實(shí)在),我建議設(shè)定為一個(gè)大小比較適合的奇數(shù);

classwt:用于處理類(lèi)別不平衡問(wèn)題,即傳入一個(gè)包含因變量各類(lèi)別比例的向量;

nodesize:生成葉結(jié)點(diǎn)的最小樣本數(shù),即當(dāng)某個(gè)結(jié)點(diǎn)中樣本數(shù)量小于這個(gè)值時(shí)自動(dòng)將該結(jié)點(diǎn)標(biāo)記為葉結(jié)點(diǎn)并計(jì)算輸出概率,好處是可以盡量避免生長(zhǎng)出太過(guò)于龐大的樹(shù),也就減少了過(guò)擬合的可能,也在一定程度上縮短了訓(xùn)練時(shí)間;

maxnodes:每顆基決策樹(shù)允許產(chǎn)生的最大的葉結(jié)點(diǎn)數(shù)量,缺省時(shí)則每棵樹(shù)無(wú)限制生長(zhǎng);

importance:邏輯型變量,控制是否計(jì)算每個(gè)變量的重要程度;

proxi:邏輯型變量,控制是否計(jì)算每顆基決策樹(shù)的復(fù)雜度;

函數(shù)輸出項(xiàng):

call:訓(xùn)練好的隨機(jī)森林模型的預(yù)設(shè)參數(shù)情況;

type:輸出模型對(duì)應(yīng)的問(wèn)題類(lèi)型,有'regression','classification','unsupervised';

importance:輸出所有特征在模型中的貢獻(xiàn)程度;

ntree:輸出基決策樹(shù)的顆數(shù);

test$predicted:輸出在ytest缺省,xtest給出的情況下,其對(duì)應(yīng)的預(yù)測(cè)值;

test$confusion:輸出在xtest,ytest均給出的條件下,xtest的預(yù)測(cè)值與ytest代表的正確標(biāo)記之間的混淆矩陣;

test$votes:輸出隨機(jī)森林模型中每一棵樹(shù)對(duì)xtest每一個(gè)樣本的投票情況;

下面我們以鳶尾花數(shù)據(jù)為例,進(jìn)行演示,具體過(guò)程如下:

> rm(list=ls())> library(randomForest)> > #load data> data(iris)> > #split data> sam = sample(1:150,120)> train = iris[sam,]> test = iris[-sam,]> > #訓(xùn)練隨機(jī)森林分類(lèi)器> rf = randomForest(Species~.,data=train,+                   classwt=table(train$Species)/dim(train)[1],+                   ntree=11,+                   xtest=test[,1:4],+                   importance=T,+                   proximity=T)> > #打印混淆矩陣> rf$test$confusionNULL> > #打印正確率> sum(diag(prop.table(table(test$Species,rf$test$predicted))))[1] 1> > #打印特征的重要性程度> importance(rf,type=2)             MeanDecreaseGiniSepal.Length         8.149513Sepal.Width          1.485798Petal.Length        38.623601Petal.Width         31.085027> > #可視化特征的重要性程度> varImpPlot(rf)

特征重要程度可視化:

上圖每個(gè)點(diǎn)表示將對(duì)應(yīng)的特征移除后平均減少了正確率,所以點(diǎn)在圖中位置越高就越重要;

輸出每個(gè)樣本接受基決策樹(shù)投票的具體情況:

> #vote results of base decision tree> rf$test$votes       setosa versicolor virginica2   1.0000000 0.00000000 0.00000008   1.0000000 0.00000000 0.000000013  1.0000000 0.00000000 0.000000014  1.0000000 0.00000000 0.000000015  0.9090909 0.09090909 0.000000018  1.0000000 0.00000000 0.000000020  1.0000000 0.00000000 0.000000025  1.0000000 0.00000000 0.000000026  1.0000000 0.00000000 0.000000027  1.0000000 0.00000000 0.000000032  1.0000000 0.00000000 0.000000036  1.0000000 0.00000000 0.000000037  1.0000000 0.00000000 0.000000039  1.0000000 0.00000000 0.000000061  0.0000000 1.00000000 0.000000062  0.0000000 1.00000000 0.000000087  0.0000000 1.00000000 0.000000091  0.0000000 1.00000000 0.000000096  0.0000000 1.00000000 0.000000097  0.0000000 1.00000000 0.0000000104 0.0000000 0.00000000 1.0000000108 0.0000000 0.00000000 1.0000000110 0.0000000 0.00000000 1.0000000111 0.0000000 0.00000000 1.0000000113 0.0000000 0.00000000 1.0000000122 0.0000000 0.09090909 0.9090909126 0.0000000 0.00000000 1.0000000128 0.0000000 0.00000000 1.0000000140 0.0000000 0.00000000 1.0000000143 0.0000000 0.09090909 0.9090909attr(,"class")[1] "matrix" "votes"

  以上就是關(guān)于隨機(jī)森林的基本內(nèi)容,本篇今后會(huì)陸續(xù)補(bǔ)充更深層次的知識(shí),如有筆誤,望指出。 

作者: 費(fèi)弗里

出處:https://www.cnblogs.com/feffery/p/8810506.html

版權(quán):本文采用「署名-非商業(yè)性使用-相同方式共享 4.0 國(guó)際」知識(shí)共享許可協(xié)議進(jìn)行許可。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
聊聊機(jī)器學(xué)習(xí)中的那些樹(shù)
一文讀懂“隨機(jī)森林”在微生態(tài)中的應(yīng)用
隨機(jī)森林
機(jī)器學(xué)習(xí)超詳細(xì)實(shí)踐攻略(10):隨機(jī)森林算法詳解及小白都能看懂的調(diào)參指南
R語(yǔ)言之Random Forest隨機(jī)森林
原理 代碼|深入淺出Python隨機(jī)森林預(yù)測(cè)實(shí)戰(zhàn)
更多類(lèi)似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服