您好,登錄后才能下訂單哦!
這篇文章給大家介紹隨機(jī)森林的原理及Python代碼實(shí)現(xiàn)是怎樣的,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
最近在做kaggle的時(shí)候,發(fā)現(xiàn)隨機(jī)森林這個(gè)算法在分類問題上效果十分的好,大多數(shù)情況下效果遠(yuǎn)要比svm,log回歸,knn等算法效果好。因此想琢磨琢磨這個(gè)算法的原理。
要學(xué)隨機(jī)森林,首先先簡單介紹一下集成學(xué)習(xí)方法和決策樹算法。
Bagging和Boosting都是將已有的分類或回歸算法通過一定方式組合起來,形成一個(gè)性能更加強(qiáng)大的分類器,更準(zhǔn)確的說這是一種分類算法的組裝方法。即將弱分類器組裝成強(qiáng)分類器的方法。
首先介紹Bootstraping,即自助法:它是一種有放回的抽樣方法(可能抽到重復(fù)的樣本)。
1、Bagging (bootstrap aggregating)
Bagging即套袋法,其算法過程如下:
A)從原始樣本集中抽取訓(xùn)練集。每輪從原始樣本集中使用Bootstraping的方法抽取n個(gè)訓(xùn)練樣本(在訓(xùn)練集中,有些樣本可能被多次抽取到,而有些樣本可能一次都沒有被抽中)。共進(jìn)行k輪抽取,得到k個(gè)訓(xùn)練集。(k個(gè)訓(xùn)練集之間是相互獨(dú)立的)
B)每次使用一個(gè)訓(xùn)練集得到一個(gè)模型,k個(gè)訓(xùn)練集共得到k個(gè)模型。(注:這里并沒有具體的分類算法或回歸方法,我們可以根據(jù)具體問題采用不同的分類或回歸方法,如決策樹、感知器等)
C)對(duì)分類問題:將上步得到的k個(gè)模型采用投票的方式得到分類結(jié)果;對(duì)回歸問題,計(jì)算上述模型的均值作為最后的結(jié)果。(所有模型的重要性相同)
2、Boosting
其主要思想是將弱分類器組裝成一個(gè)強(qiáng)分類器。在PAC(概率近似正確)學(xué)習(xí)框架下,則一定可以將弱分類器組裝成一個(gè)強(qiáng)分類器。
關(guān)于Boosting的兩個(gè)核心問題:
1)在每一輪如何改變訓(xùn)練數(shù)據(jù)的權(quán)值或概率分布?
通過提高那些在前一輪被弱分類器分錯(cuò)樣例的權(quán)值,減小前一輪分對(duì)樣例的權(quán)值,來使得分類器對(duì)誤分的數(shù)據(jù)有較好的效果。
2)通過什么方式來組合弱分類器?
通過加法模型將弱分類器進(jìn)行線性組合,比如AdaBoost通過加權(quán)多數(shù)表決的方式,即增大錯(cuò)誤率小的分類器的權(quán)值,同時(shí)減小錯(cuò)誤率較大的分類器的權(quán)值。
而提升樹通過擬合殘差的方式逐步減小殘差,將每一步生成的模型疊加得到最終模型。
3、Bagging,Boosting二者之間的區(qū)別
Bagging和Boosting的區(qū)別:
1)樣本選擇上:
Bagging:訓(xùn)練集是在原始集中有放回選取的,從原始集中選出的各輪訓(xùn)練集之間是獨(dú)立的。
Boosting:每一輪的訓(xùn)練集不變,只是訓(xùn)練集中每個(gè)樣例在分類器中的權(quán)重發(fā)生變化。而權(quán)值是根據(jù)上一輪的分類結(jié)果進(jìn)行調(diào)整。
2)樣例權(quán)重:
Bagging:使用均勻取樣,每個(gè)樣例的權(quán)重相等
Boosting:根據(jù)錯(cuò)誤率不斷調(diào)整樣例的權(quán)值,錯(cuò)誤率越大則權(quán)重越大。
3)預(yù)測函數(shù):
Bagging:所有預(yù)測函數(shù)的權(quán)重相等。
Boosting:每個(gè)弱分類器都有相應(yīng)的權(quán)重,對(duì)于分類誤差小的分類器會(huì)有更大的權(quán)重。
4)并行計(jì)算:
Bagging:各個(gè)預(yù)測函數(shù)可以并行生成
Boosting:各個(gè)預(yù)測函數(shù)只能順序生成,因?yàn)楹笠粋€(gè)模型參數(shù)需要前一輪模型的結(jié)果。
4、總結(jié)
這兩種方法都是把若干個(gè)分類器整合為一個(gè)分類器的方法,只是整合的方式不一樣,最終得到不一樣的效果,將不同的分類算法套入到此類算法框架中一定程度上會(huì)提高了原單一分類器的分類效果,但是也增大了計(jì)算量。
下面是將決策樹與這些算法框架進(jìn)行結(jié)合所得到的新的算法:
1)Bagging + 決策樹 = 隨機(jī)森林
2)AdaBoost + 決策樹 = 提升樹
3)Gradient Boosting + 決策樹 = GBDT
集成學(xué)習(xí)通過構(gòu)建并結(jié)合多個(gè)分類器來完成學(xué)習(xí)任務(wù)。集成學(xué)習(xí)通過將多個(gè)學(xué)習(xí)器進(jìn)行結(jié)合,??色@得比單一學(xué)習(xí)器更好的泛化性能。
考慮一個(gè)簡單例子:在二分類任務(wù)中,假定三個(gè)分類器在三個(gè)測試樣本上的表現(xiàn)如下圖,其中√表示分類正確,×表示分類錯(cuò)誤,集成學(xué)習(xí)的結(jié)果通過投票法產(chǎn)生,即“少數(shù)服從多數(shù)”。如下圖,在(a)中,每個(gè)分類器都只有66.6%的精度,但集成學(xué)習(xí)卻達(dá)到了100%;在(b)中,三個(gè)分類器沒有差別,集成之后性能沒有提高;在(c)中,每個(gè)分類器的精度都只有33.3%,集成學(xué)習(xí)的結(jié)果變得更糟。這個(gè)簡單地例子顯示出:要獲得好的集成,個(gè)體學(xué)習(xí)器應(yīng)“好而不同”,即個(gè)體學(xué)習(xí)器要有一定的“準(zhǔn)確性”,即學(xué)習(xí)器不能太差,并且要有“多樣性”,即學(xué)習(xí)器間具有差異。
根據(jù)個(gè)體學(xué)習(xí)器的生成方式,目前的集成學(xué)習(xí)方法大致可分為兩大類,即個(gè)體學(xué)習(xí)器之間存在強(qiáng)依賴關(guān)系,必須串行生成的序列化方法,以及個(gè)體學(xué)習(xí)器間不存在強(qiáng)依賴關(guān)系,可同時(shí)生成的并行化方法;前者的代表是Boosting,后者的代表是Bagging和“隨機(jī)森林”(Random Forest)
Bagging與隨機(jī)森林
要得到泛化性能強(qiáng)的集成,集成中的個(gè)體學(xué)習(xí)器應(yīng)盡可能相互獨(dú)立,雖然這在現(xiàn)實(shí)任務(wù)中很難做到,但我們可以設(shè)法使基學(xué)習(xí)器盡可能具有較大的差異。
在我的實(shí)驗(yàn)中,使用“自助采樣法”:給定包含m個(gè)樣本的數(shù)據(jù)集,我們先隨機(jī)取出一個(gè)樣本放入采樣集中,再把該樣本放回初始數(shù)據(jù)集,使得下次采樣時(shí)該樣本仍有可能被選中,這樣,經(jīng)過m次隨機(jī)操作,我們得到含m個(gè)樣本的采樣集,初始訓(xùn)練集中有的樣本在采樣集里多次出現(xiàn),有的則從未出現(xiàn)。
按照這種方法,我們可以采樣出T個(gè)含m個(gè)訓(xùn)練樣本的采樣集,然后基于每個(gè)采樣集訓(xùn)練處一個(gè)基學(xué)習(xí)器,再將這些基學(xué)習(xí)器進(jìn)行結(jié)合,這就是Bagging的基本流程。在對(duì)預(yù)測輸出進(jìn)行結(jié)合時(shí),Bagging通常對(duì)分類任務(wù)使用簡單投票法,對(duì)回歸任務(wù)使用簡單平均法。
隨機(jī)森林是Bagging的一個(gè)擴(kuò)展。隨機(jī)森林在以決策樹為基學(xué)習(xí)器構(gòu)建Bagging集成的基礎(chǔ)上,進(jìn)一步在決策樹的訓(xùn)練過程中引入了隨機(jī)屬性選擇(即引入隨機(jī)特征選擇)。傳統(tǒng)決策樹在選擇劃分屬性時(shí)時(shí)在當(dāng)前節(jié)點(diǎn)的屬性集合(假定有d個(gè)屬性)中選擇一個(gè)最優(yōu)屬性;而在隨機(jī)森林中,對(duì)基決策樹的每個(gè)節(jié)點(diǎn),先從該節(jié)點(diǎn)的屬性集合中隨機(jī)選擇一個(gè)包含k個(gè)屬性的子集,然后再從這個(gè)子集中選擇一個(gè)最優(yōu)屬性用于劃分。這里的參數(shù)k控制了隨機(jī)性的引入程度:若令k=d,則基決策樹的構(gòu)建與傳統(tǒng)決策樹相同;若令k=1,則是隨機(jī)選擇一個(gè)屬性進(jìn)行劃分。
在這篇文章中,我們只講隨機(jī)森林的分類部分。隨機(jī)森林用于分類時(shí),即采用n個(gè)決策樹分類,將分類結(jié)果用簡單投票法得到最終分類,提高分類準(zhǔn)確率。
對(duì)于決策樹不太了解的童鞋,可以看上一篇:
python機(jī)器學(xué)習(xí):決策樹ID3、C4.5
簡單來說,隨機(jī)森林就是對(duì)決策樹的集成,但有兩點(diǎn)不同:
(1)采樣的差異性:從含m個(gè)樣本的數(shù)據(jù)集中有放回的采樣,得到含m個(gè)樣本的采樣集,用于訓(xùn)練。這樣能保證每個(gè)決策樹的訓(xùn)練樣本不完全一樣。
(2)特征選取的差異性:每個(gè)決策樹的n個(gè)分類特征是在所有特征中隨機(jī)選擇的(n是一個(gè)需要我們自己調(diào)整的參數(shù))
隨機(jī)森林需要調(diào)整的參數(shù)有:
(1) 決策樹的個(gè)數(shù)
(2) 特征屬性的個(gè)數(shù)
(3) 遞歸次數(shù)(即決策樹的深度)
下面,講一下如何用代碼實(shí)現(xiàn)隨機(jī)森林。
代碼實(shí)現(xiàn)流程:
(1) 導(dǎo)入文件并將所有特征轉(zhuǎn)換為float形式
(2) 將數(shù)據(jù)集分成n份,方便交叉驗(yàn)證
(3) 構(gòu)造數(shù)據(jù)子集(隨機(jī)采樣),并在指定特征個(gè)數(shù)(假設(shè)m個(gè),手動(dòng)調(diào)參)下選取最優(yōu)特征
(4) 構(gòu)造決策樹
(5) 創(chuàng)建隨機(jī)森林(多個(gè)決策樹的結(jié)合)
(6) 輸入測試集并進(jìn)行測試,輸出預(yù)測結(jié)果
(1) 導(dǎo)入文件并將所有特征轉(zhuǎn)換為float形式
(2) 將數(shù)據(jù)集分成n份,方便交叉驗(yàn)證
(3) 構(gòu)造數(shù)據(jù)子集(隨機(jī)采樣),并在指定特征個(gè)數(shù)(假設(shè)m個(gè),手動(dòng)調(diào)參)下選取最優(yōu)特征
(4) 構(gòu)造決策樹
(5) 創(chuàng)建隨機(jī)森林(多個(gè)決策樹的結(jié)合)
(6) 輸入測試集并進(jìn)行測試,輸出預(yù)測結(jié)果
對(duì)以上代碼的一點(diǎn)總結(jié):
訓(xùn)練部分:假設(shè)我們?nèi)ataset中的m個(gè)feature來構(gòu)造決策樹,首先,我們遍歷m個(gè)feature中的每一個(gè)feature,再遍歷每一行,通過spilt_loss函數(shù)(計(jì)算分割代價(jià))來選取最優(yōu)的特征及特征值,根據(jù)是否大于這個(gè)特征值進(jìn)行分類(分成left,right兩類),循環(huán)執(zhí)行上述步驟,直至不可分或者達(dá)到遞歸限值(用來防止過擬合),最后得到一個(gè)決策樹tree。
測試部分:對(duì)測試集的每一行進(jìn)行判斷,決策樹tree是一個(gè)多層字典,每一層為一個(gè)二分類,將每一行按照決策樹tree中的分類索引index一步一步向里層探索,直至不出現(xiàn)字典時(shí)探索結(jié)束,得到的值即為我們的預(yù)測值。
關(guān)于隨機(jī)森林的原理及Python代碼實(shí)現(xiàn)是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。