Random Forest和Gradient Tree Boosting參數(shù)詳解(二)

使用sklearn進(jìn)行集成學(xué)習(xí)——實(shí)踐

系列

《使用sklearn進(jìn)行集成學(xué)習(xí)——理論》

《使用sklearn進(jìn)行集成學(xué)習(xí)——實(shí)踐》

目錄

1 Random Forest和Gradient Tree Boosting參數(shù)詳解

2 如何調(diào)參?

2.1 調(diào)參的目標(biāo):偏差和方差的協(xié)調(diào)

2.2 參數(shù)對整體模型性能的影響

2.3 一個(gè)樸實(shí)的方案:貪心的坐標(biāo)下降法

2.3.1 Random Forest調(diào)參案例:Digit Recognizer

2.3.1.1 調(diào)整過程影響類參數(shù)

2.3.1.2 調(diào)整子模型影響類參數(shù)

2.3.2 Gradient Tree Boosting調(diào)參案例:Hackathon3.x

2.3.2.1 調(diào)整過程影響類參數(shù)

2.3.2.2 調(diào)整子模型影響類參數(shù)

2.3.2.3 殺一記回馬槍

2.4 “局部最優(yōu)解”(溫馨提示:看到這里有彩蛋!)

2.5 類別不均衡的陷阱

3 總結(jié)

4 參考資料

1 Random Forest和Gradient Tree Boosting參數(shù)詳解

在sklearn.ensemble庫中,我們可以找到Random Forest分類和回歸的實(shí)現(xiàn):RandomForestClassifier和RandomForestRegression,Gradient Tree Boosting分類和回歸的實(shí)現(xiàn):GradientBoostingClassifier和GradientBoostingRegression。有了這些模型后,立馬上手操練起來?少俠請留步!且聽我說一說,使用這些模型時(shí)常遇到的問題:

明明模型調(diào)教得很好了,可是效果離我的想象總有些偏差?——模型訓(xùn)練的第一步就是要定好目標(biāo),往錯(cuò)誤的方向走太多也是后退。

憑直覺調(diào)了某個(gè)參數(shù),可是居然沒有任何作用,有時(shí)甚至起到反作用?——定好目標(biāo)后,接下來就是要確定哪些參數(shù)是影響目標(biāo)的,其對目標(biāo)是正影響還是負(fù)影響,影響的大小。

感覺訓(xùn)練結(jié)束遙遙無期,sklearn只是個(gè)在小數(shù)據(jù)上的玩具?——雖然sklearn并不是基于分布式計(jì)算環(huán)境而設(shè)計(jì)的,但我們還是可以通過某些策略提高訓(xùn)練的效率。

模型開始訓(xùn)練了,但是訓(xùn)練到哪一步了呢?——飽暖思淫欲啊,目標(biāo),性能和效率都得了滿足后,我們有時(shí)還需要有別的追求,例如訓(xùn)練過程的輸出,袋外得分計(jì)算等等。

通過總結(jié)這些常見的問題,我們可以把模型的參數(shù)分為4類:目標(biāo)類、性能類、效率類和附加類。下表詳細(xì)地展示了4個(gè)模型參數(shù)的意義:


# ★:默認(rèn)值

不難發(fā)現(xiàn),基于bagging的Random Forest模型和基于boosting的Gradient Tree Boosting模型有不少共同的參數(shù),然而某些參數(shù)的默認(rèn)值又相差甚遠(yuǎn)。在《使用sklearn進(jìn)行集成學(xué)習(xí)——理論》一文中,我們對bagging和boosting兩種集成學(xué)習(xí)技術(shù)有了初步的了解。Random Forest的子模型都擁有較低的偏差,整體模型的訓(xùn)練過程旨在降低方差,故其需要較少的子模型(n_estimators默認(rèn)值為10)且子模型不為弱模型(max_depth的默認(rèn)值為None),同時(shí),降低子模型間的相關(guān)度可以起到減少整體模型的方差的效果(max_features的默認(rèn)值為auto)。另一方面,Gradient Tree Boosting的子模型都擁有較低的方差,整體模型的訓(xùn)練過程旨在降低偏差,故其需要較多的子模型(n_estimators默認(rèn)值為100)且子模型為弱模型(max_depth的默認(rèn)值為3),但是降低子模型間的相關(guān)度不能顯著減少整體模型的方差(max_features的默認(rèn)值為None)。

2 如何調(diào)參?

聰明的讀者應(yīng)當(dāng)要發(fā)問了:”博主,就算你列出來每個(gè)參數(shù)的意義,然并卵啊!我還是不知道無從下手啊!”

參數(shù)分類的目的在于縮小調(diào)參的范圍,首先我們要明確訓(xùn)練的目標(biāo),把目標(biāo)類的參數(shù)定下來。接下來,我們需要根據(jù)數(shù)據(jù)集的大小,考慮是否采用一些提高訓(xùn)練效率的策略,否則一次訓(xùn)練就三天三夜,法國人孩子都生出來了。然后,我們終于進(jìn)入到了重中之重的環(huán)節(jié):調(diào)整那些影響整體模型性能的參數(shù)。

2.1 調(diào)參的目標(biāo):偏差和方差的協(xié)調(diào)

同樣在《使用sklearn進(jìn)行集成學(xué)習(xí)——理論》中,我們已討論過偏差和方差是怎樣影響著模型的性能——準(zhǔn)確度。調(diào)參的目標(biāo)就是為了達(dá)到整體模型的偏差和方差的大和諧!進(jìn)一步,這些參數(shù)又可分為兩類:過程影響類及子模型影響類。在子模型不變的前提下,某些參數(shù)可以通過改變訓(xùn)練的過程,從而影響模型的性能,諸如:“子模型數(shù)”(n_estimators)、“學(xué)習(xí)率”(learning_rate)等。另外,我們還可以通過改變子模型性能來影響整體模型的性能,諸如:“最大樹深度”(max_depth)、“分裂條件”(criterion)等。正由于bagging的訓(xùn)練過程旨在降低方差,而boosting的訓(xùn)練過程旨在降低偏差,過程影響類的參數(shù)能夠引起整體模型性能的大幅度變化。一般來說,在此前提下,我們繼續(xù)微調(diào)子模型影響類的參數(shù),從而進(jìn)一步提高模型的性能。

2.2 參數(shù)對整體模型性能的影響

假設(shè)模型是一個(gè)多元函數(shù)F,其輸出值為模型的準(zhǔn)確度。我們可以固定其他參數(shù),從而對某個(gè)參數(shù)對整體模型性能的影響進(jìn)行分析:是正影響還是負(fù)影響,影響的單調(diào)性?

對Random Forest來說,增加“子模型數(shù)”(n_estimators)可以明顯降低整體模型的方差,且不會(huì)對子模型的偏差和方差有任何影響。模型的準(zhǔn)確度會(huì)隨著“子模型數(shù)”的增加而提高。由于減少的是整體模型方差公式的第二項(xiàng),故準(zhǔn)確度的提高有一個(gè)上限。在不同的場景下,“分裂條件”(criterion)對模型的準(zhǔn)確度的影響也不一樣,該參數(shù)需要在實(shí)際運(yùn)用時(shí)靈活調(diào)整。調(diào)整“最大葉節(jié)點(diǎn)數(shù)”(max_leaf_nodes)以及“最大樹深度”(max_depth)之一,可以粗粒度地調(diào)整樹的結(jié)構(gòu):葉節(jié)點(diǎn)越多或者樹越深,意味著子模型的偏差越低,方差越高;同時(shí),調(diào)整“分裂所需最小樣本數(shù)”(min_samples_split)、“葉節(jié)點(diǎn)最小樣本數(shù)”(min_samples_leaf)及“葉節(jié)點(diǎn)最小權(quán)重總值”(min_weight_fraction_leaf),可以更細(xì)粒度地調(diào)整樹的結(jié)構(gòu):分裂所需樣本數(shù)越少或者葉節(jié)點(diǎn)所需樣本越少,也意味著子模型越復(fù)雜。一般來說,我們總采用bootstrap對樣本進(jìn)行子采樣來降低子模型之間的關(guān)聯(lián)度,從而降低整體模型的方差。適當(dāng)?shù)販p少“分裂時(shí)考慮的最大特征數(shù)”(max_features),給子模型注入了另外的隨機(jī)性,同樣也達(dá)到了降低子模型之間關(guān)聯(lián)度的效果。但是一味地降低該參數(shù)也是不行的,因?yàn)榉至褧r(shí)可選特征變少,模型的偏差會(huì)越來越大。在下圖中,我們可以看到這些參數(shù)對Random Forest整體模型性能的影響:

對Gradient Tree Boosting來說,“子模型數(shù)”(n_estimators)和“學(xué)習(xí)率”(learning_rate)需要聯(lián)合調(diào)整才能盡可能地提高模型的準(zhǔn)確度:想象一下,A方案是走4步,每步走3米,B方案是走5步,每步走2米,哪個(gè)方案可以更接近10米遠(yuǎn)的終點(diǎn)?同理,子模型越復(fù)雜,對應(yīng)整體模型偏差低,方差高,故“最大葉節(jié)點(diǎn)數(shù)”(max_leaf_nodes)、“最大樹深度”(max_depth)等控制子模型結(jié)構(gòu)的參數(shù)是與Random Forest一致的。類似“分裂時(shí)考慮的最大特征數(shù)”(max_features),降低“子采樣率”(subsample),也會(huì)造成子模型間的關(guān)聯(lián)度降低,整體模型的方差減小,但是當(dāng)子采樣率低到一定程度時(shí),子模型的偏差增大,將引起整體模型的準(zhǔn)確度降低。還記得“初始模型”(init)是什么嗎?不同的損失函數(shù)有不一樣的初始模型定義,通常,初始模型是一個(gè)更加弱的模型(以“平均”情況來預(yù)測),雖說支持自定義,大多數(shù)情況下保持默認(rèn)即可。在下圖中,我們可以看到這些參數(shù)對Gradient Tree Boosting整體模型性能的影響:

2.3 一個(gè)樸實(shí)的方案:貪心的坐標(biāo)下降法

到此為止,我們終于知道需要調(diào)整哪些參數(shù),對于單個(gè)參數(shù),我們也知道怎么調(diào)整才能提升性能。然而,表示模型的函數(shù)F并不是一元函數(shù),這些參數(shù)需要共同調(diào)整才能得到全局最優(yōu)解。也就是說,把這些參數(shù)丟給調(diào)參算法(諸如Grid Search)咯?對于小數(shù)據(jù)集,我們還能這么任性,但是參數(shù)組合爆炸,在大數(shù)據(jù)集上,或許我的子子孫孫能夠看到訓(xùn)練結(jié)果吧。實(shí)際上網(wǎng)格搜索也不一定能得到全局最優(yōu)解,而另一些研究者從解優(yōu)化問題的角度嘗試解決調(diào)參問題。

坐標(biāo)下降法是一類優(yōu)化算法,其最大的優(yōu)勢在于不用計(jì)算待優(yōu)化的目標(biāo)函數(shù)的梯度。我們最容易想到一種特別樸實(shí)的類似于坐標(biāo)下降法的方法,與坐標(biāo)下降法不同的是,其不是循環(huán)使用各個(gè)參數(shù)進(jìn)行調(diào)整,而是貪心地選取了對整體模型性能影響最大的參數(shù)。參數(shù)對整體模型性能的影響力是動(dòng)態(tài)變化的,故每一輪坐標(biāo)選取的過程中,這種方法在對每個(gè)坐標(biāo)的下降方向進(jìn)行一次直線搜索(line search)。首先,找到那些能夠提升整體模型性能的參數(shù),其次確保提升是單調(diào)或近似單調(diào)的。這意味著,我們篩選出來的參數(shù)是對整體模型性能有正影響的,且這種影響不是偶然性的,要知道,訓(xùn)練過程的隨機(jī)性也會(huì)導(dǎo)致整體模型性能的細(xì)微區(qū)別,而這種區(qū)別是不具有單調(diào)性的。最后,在這些篩選出來的參數(shù)中,選取影響最大的參數(shù)進(jìn)行調(diào)整即可。

無法對整體模型性能進(jìn)行量化,也就談不上去比較參數(shù)影響整體模型性能的程度。是的,我們還沒有一個(gè)準(zhǔn)確的方法來量化整體模型性能,只能通過交叉驗(yàn)證來近似計(jì)算整體模型性能。然而交叉驗(yàn)證也存在隨機(jī)性,假設(shè)我們以驗(yàn)證集上的平均準(zhǔn)確度作為整體模型的準(zhǔn)確度,我們還得關(guān)心在各個(gè)驗(yàn)證集上準(zhǔn)確度的變異系數(shù),如果變異系數(shù)過大,則平均值作為整體模型的準(zhǔn)確度也是不合適的。在接下來的案例分析中,我們所談及的整體模型性能均是指平均準(zhǔn)確度,請各位留心。

2.3.1 Random Forest調(diào)參案例:Digit Recognizer

在這里,我們選取Kaggle上101教學(xué)賽中的Digit Recognizer作為案例來演示對RandomForestClassifier調(diào)參的過程。當(dāng)然,我們也不要傻乎乎地手工去設(shè)定不同的參數(shù),然后訓(xùn)練模型。借助sklearn.grid_search庫中的GridSearchCV類,不僅可以自動(dòng)化調(diào)參,同時(shí)還可以對每一種參數(shù)組合進(jìn)行交叉驗(yàn)證計(jì)算平均準(zhǔn)確度。

2.3.1.1 調(diào)整過程影響類參數(shù)

首先,我們需要對過程影響類參數(shù)進(jìn)行調(diào)整,而Random Forest的過程影響類參數(shù)只有“子模型數(shù)”(n_estimators)。“子模型數(shù)”的默認(rèn)值為10,在此基礎(chǔ)上,我們以10為單位,考察取值范圍在1至201的調(diào)參情況:

# 左圖為模型在驗(yàn)證集上的平均準(zhǔn)確度,右圖為準(zhǔn)確度的變異系數(shù)。橫軸為參數(shù)的取值。

通過上圖我們可以看到,隨著“子模型數(shù)”的增加,整體模型的方差減少,其防止過擬合的能力增強(qiáng),故整體模型的準(zhǔn)確度提高。當(dāng)“子模型數(shù)”增加到40以上時(shí),準(zhǔn)確度的提升逐漸不明顯。考慮到訓(xùn)練的效率,最終我們選擇“子模型數(shù)”為200。此時(shí),在Kaggle上提交結(jié)果,得分為:0.96500,很湊合。

2.3.1.2 調(diào)整子模型影響類參數(shù)

在設(shè)定“子模型數(shù)”(n_estimators)為200的前提下,我們依次對子模型影響類的參數(shù)對整體模型性能的影響力進(jìn)行分析。

對“分裂條件”(criterion)分別取值gini和entropy,得到調(diào)參結(jié)果如下:

顯見,在此問題中,“分裂條件”保持默認(rèn)值gini更加合適。

對“分裂時(shí)參與判斷的最大特征數(shù)”(max_feature)以1為單位,設(shè)定取值范圍為28至47,得到調(diào)參結(jié)果如下:

“分裂時(shí)參與判斷的最大特征數(shù)”的默認(rèn)值auto,即總特征數(shù)(sqrt(784)=28)的開方。通過提升該參數(shù),整體模型的準(zhǔn)確度得到了提升。可見,該參數(shù)的默認(rèn)值過小,導(dǎo)致了子模型的偏差過大,從而整體模型的偏差過大。同時(shí),我們還注意到,該參數(shù)對整體模型性能的影響是近似單調(diào)的:從28到38,模型的準(zhǔn)確度逐步抖動(dòng)提升。所以,我們可考慮將該參數(shù)納入下一步的調(diào)參工作。

對“最大深度”(max_depth)以10為單位,設(shè)定取值范圍為10到100,得到調(diào)參結(jié)果如下:

隨著樹的深度加深,子模型的偏差減少,整體模型的準(zhǔn)確度得到提升。從理論上來說,子模型訓(xùn)練的后期,隨著方差增大,子模型的準(zhǔn)確度稍微降低,從而影響整體模型的準(zhǔn)確度降低。看圖中,似乎取值范圍從40到60的情況可以印證這一觀點(diǎn)。不妨以1為單位,設(shè)定取值范圍為40到59,更加細(xì)致地分析:

有點(diǎn)傻眼了,怎么跟預(yù)想的不太一樣?為什么模型準(zhǔn)確度的變化在40到59之間沒有鮮明的“規(guī)律”了?要分析這個(gè)問題,我們得先思考一下,少一層子節(jié)點(diǎn)對子模型意味著什么?若少的那一層給原子模型帶來的是方差增大,則新子模型會(huì)準(zhǔn)確度提高;若少的那一層給原子模型帶來的是偏差減小,則新子模型會(huì)準(zhǔn)確度降低。所以,細(xì)粒度的層次變化既可能使整體模型的準(zhǔn)確度提升,也可能使整體模型的準(zhǔn)確度降低。從而也說明了,該參數(shù)更適合進(jìn)行粗粒度的調(diào)整。在訓(xùn)練的現(xiàn)階段,“抖動(dòng)”現(xiàn)象的發(fā)生說明,此時(shí)對該參數(shù)的調(diào)整已不太合適了。

對“分裂所需的最小樣本數(shù)”(min_samples_split)以1為單位,設(shè)定取值范圍為2到11,得到調(diào)參的結(jié)果:

我們看到,隨著分裂所需的最小樣本數(shù)的增加,子模型的結(jié)構(gòu)變得越來越簡單,理論上來說,首先應(yīng)當(dāng)因方差減小導(dǎo)致整體模型的準(zhǔn)確度提升。但是,在訓(xùn)練的現(xiàn)階段,子模型的偏差增大的幅度比方差減小的幅度更大,所以整體模型的準(zhǔn)確度持續(xù)下降。該參數(shù)的默認(rèn)值為2,調(diào)參后,最優(yōu)解保持2不變。

對“葉節(jié)點(diǎn)最小樣本數(shù)”(min_samples_leaf)以1為單位,設(shè)定取值范圍為1到10,得到調(diào)參結(jié)果如下:

同“分裂所需的最小樣本數(shù)”,該參數(shù)也在調(diào)參后,保持最優(yōu)解1不變。

對“最大葉節(jié)點(diǎn)數(shù)”(max_leaf_nodes)以100為單位,設(shè)定取值范圍為2500到3400,得到調(diào)參結(jié)果如下:

類似于“最大深度”,該參數(shù)的增大會(huì)帶來模型準(zhǔn)確的提升,可是由于后期“不規(guī)律”的抖動(dòng),我們暫時(shí)不進(jìn)行處理。

通過對以上參數(shù)的調(diào)參情況,我們可以總結(jié)如下:

接下來,我們固定分裂時(shí)參與判斷的最大特征(max_features)為38,在Kaggle上提交一次結(jié)果:0.96671,比上一次調(diào)參好了0.00171,基本與我們預(yù)期的提升效果一致。

還需要繼續(xù)下一輪坐標(biāo)下降式調(diào)參嗎?一般來說沒有太大的必要,在本輪中出現(xiàn)了兩個(gè)發(fā)生抖動(dòng)現(xiàn)象的參數(shù),而其他參數(shù)的調(diào)整均沒有提升整體模型的性能。還是得老調(diào)重彈:數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法只是逼近這個(gè)上限而已。在DR競賽中,與其期待通過對RandomForestClassifier調(diào)參來進(jìn)一步提升整體模型的性能,不如挖掘出更有價(jià)值的特征,或者使用自帶特征挖掘技能的模型(正如此題,圖分類的問題更適合用神經(jīng)網(wǎng)絡(luò)來學(xué)習(xí))。但是,在這里,我們還是可以自信地說,通過貪心的坐標(biāo)下降法,比那些用網(wǎng)格搜索法窮舉所有參數(shù)組合,自以為得到最優(yōu)解的朋友們更進(jìn)了一步。

2.3.2 Gradient Tree Boosting調(diào)參案例:Hackathon3.x

在這里,我們選取Analytics Vidhya上的Hackathon3.x作為案例來演示對GradientBoostingClassifier調(diào)參的過程。

2.3.2.1 調(diào)整過程影響類參數(shù)

GradientBoostingClassifier的過程影響類參數(shù)有“子模型數(shù)”(n_estimators)和“學(xué)習(xí)率”(learning_rate),我們可以使用GridSearchCV找到關(guān)于這兩個(gè)參數(shù)的最優(yōu)解。慢著!這里留了一個(gè)很大的陷阱:“子模型數(shù)”和“學(xué)習(xí)率”帶來的性能提升是不均衡的,在前期會(huì)比較高,在后期會(huì)比較低,如果一開始我們將這兩個(gè)參數(shù)調(diào)成最優(yōu),這樣很容易陷入一個(gè)“局部最優(yōu)解”。在目標(biāo)函數(shù)都不確定的情況下(如是否凸?),談局部最優(yōu)解就是耍流氓,本文中“局部最優(yōu)解”指的是調(diào)整各參數(shù)都無明顯性能提升的一種狀態(tài),所以打了引號(hào)。下圖中展示了這個(gè)兩個(gè)參數(shù)的調(diào)參結(jié)果:

# 圖中顏色越深表示整體模型的性能越高

在此,我們先直覺地選擇“子模型數(shù)”為60,“學(xué)習(xí)率”為0.1,此時(shí)的整體模型性能(平均準(zhǔn)確度為0.8253)不是最好,但是也不差,良好水準(zhǔn)。

2.3.2.2 調(diào)整子模型影響類參數(shù)

對子模型影響類參數(shù)的調(diào)整與Random Forest類似。最終我們對參數(shù)的調(diào)整如下:

到此,整體模型性能為0.8313,與workbench(0.8253)相比,提升了約0.006。

2.3.2.3 殺一記回馬槍

還記得一開始我們對“子模型數(shù)”(n_estimators)和“學(xué)習(xí)率”(learning_rate)手下留情了嗎?現(xiàn)在我們可以回過頭來,調(diào)整這兩個(gè)參數(shù),調(diào)整的方法為成倍地放大“子模型數(shù)”,對應(yīng)成倍地縮小“學(xué)習(xí)率”(learning_rate)。通過該方法,本例中整體模型性能又提升了約0.002。

2.4 “局部最優(yōu)解”

目前來說,在調(diào)參工作中,廣泛使用的仍是一些經(jīng)驗(yàn)法則。Aarshay Jain對Gradient Tree Boosting總結(jié)了一套調(diào)參方法,其核心思想在于:對過程影響類參數(shù)進(jìn)行調(diào)整,畢竟它們對整體模型性能的影響最大,然后依據(jù)經(jīng)驗(yàn),在其他參數(shù)中選擇對整體模型性能影響最大的參數(shù),進(jìn)行下一步調(diào)參。這種方法的關(guān)鍵是依照對整體模型性能的影響力給參數(shù)排序,然后按照該順序?qū)Φ膮?shù)進(jìn)行調(diào)整。如何衡量參數(shù)對整體模型性能的影響力呢?基于經(jīng)驗(yàn),Aarshay提出他的見解:“最大葉節(jié)點(diǎn)數(shù)”(max_leaf_nodes)和“最大樹深度”(max_depth)對整體模型性能的影響大于“分裂所需最小樣本數(shù)”(min_samples_split)、“葉節(jié)點(diǎn)最小樣數(shù)”(min_samples_leaf)及“葉節(jié)點(diǎn)最小權(quán)重總值”(min_weight_fraction_leaf),而“分裂時(shí)考慮的最大特征數(shù)”(max_features)的影響力最小。

Aarshay提出的方法和貪心的坐標(biāo)下降法最大的區(qū)別在于前者在調(diào)參之前就依照對整體模型性能的影響力給參數(shù)排序,而后者是一種“很自然”的貪心過程。還記得2.3.2.1小節(jié)中我們討論過“子模型數(shù)”(n_estimators)和“學(xué)習(xí)率”(learning_rate)的調(diào)參問題嗎?同理,貪心的坐標(biāo)下降法容易陷入“局部最優(yōu)解”。對Random Forest調(diào)參時(shí)會(huì)稍微好一點(diǎn),因?yàn)楫?dāng)“子模型數(shù)”調(diào)到最佳狀態(tài)時(shí),有時(shí)就只剩下諸如““分裂時(shí)參與判斷的最大特征數(shù)”等Aarshay認(rèn)為影響力最小的參數(shù)可調(diào)了。但是,對Gradient Tree Boosting調(diào)參時(shí),遇到“局部最優(yōu)解”的可能性就大得多。

Aarshay同樣對Hackathon3.x進(jìn)行了調(diào)參試驗(yàn),由于特征提取方式的差異,參數(shù)賦值相同的情況下,本文的整體模型性能仍與其相差0.007左右(唉,不得不再說一次,特征工程真的很重要)。首先,在過程影響類參數(shù)的選擇上,Aarshay的方法與貪心的坐標(biāo)下降法均選擇了“子模型數(shù)”為60,“學(xué)習(xí)率”為0.1。接下來,Aarshay按照其定義的參數(shù)對整體模型性能的影響力,按序依次對參數(shù)進(jìn)行調(diào)整。當(dāng)子模型影響類參數(shù)確定完成后,Aarshay的方法提升了約0.008的整體模型性能,略勝于貪心的坐標(biāo)下降法的0.006。但是,回過頭來繼續(xù)調(diào)試“子模型數(shù)”和“學(xué)習(xí)率”之后,Aarshay的方法又提升了約0.01的整體模型性能,遠(yuǎn)勝于貪心的坐標(biāo)下降法的0.002。

誒!誒!誒!少俠請住手!你說我為什么要在這篇博文中介紹這種“無用”的貪心的坐標(biāo)下降法?首先,這種方法很容易憑直覺就想到。人們往往花了很多的時(shí)間去搞懂模型的參數(shù)是什么含義,對整體模型性能有什么影響,搞懂這些已經(jīng)不易了,所以接下來很多人選擇了最直觀的貪心的坐標(biāo)下降法。通過一個(gè)實(shí)例,我們更容易記住這種方法的局限性。除了作為反面教材,貪心的坐標(biāo)下降法就沒有意義了嗎?不難看到,Aarshay的方法仍有改進(jìn)的地方,在依次對參數(shù)進(jìn)行調(diào)整時(shí),還是需要像貪心的坐標(biāo)下降法中一樣對參數(shù)的“動(dòng)態(tài)”影響力進(jìn)行分析一下,如果這種影響力是“抖動(dòng)”的,可有可無的,那么我們就不需要對該參數(shù)進(jìn)行調(diào)整。

2.5 類別不均衡的陷阱

哈哈哈,這篇博文再次留了個(gè)陷阱,此段文字并不是跟全文一起發(fā)布!有人要說了,按照我的描述,Aarshay的調(diào)參試驗(yàn)不可再現(xiàn)啊!其實(shí),我故意沒說Aarshay的另一個(gè)關(guān)鍵處理:調(diào)參前的參數(shù)初始值。因?yàn)镠ackathon3.x是一個(gè)類別不均衡的問題,所以如果直接先調(diào)試“最大深度”(max_depth),會(huì)發(fā)現(xiàn)其會(huì)保持默認(rèn)值3作為最優(yōu)解,而后面的調(diào)參中,“分裂所需最小樣本數(shù)”(min_samples_split)、“葉節(jié)點(diǎn)最小樣本數(shù)”(min_samples_leaf)再怎么調(diào)都沒有很大作用。這是因?yàn)椋龢颖具h(yuǎn)遠(yuǎn)小于反例,所以在低深度時(shí),子模型就可能已經(jīng)對正例過擬合了。所以,在類別不均衡時(shí),只有先確定“葉節(jié)點(diǎn)最小樣本數(shù)”(min_samples_leaf),再確定“分裂所需最小樣本數(shù)”(min_samples_split),才能確定“最大深度”。而Aarshay設(shè)定的初始值,則以經(jīng)驗(yàn)和直覺避開了這個(gè)險(xiǎn)惡的陷阱。

如果實(shí)在覺得經(jīng)驗(yàn)和直覺不靠譜,我還嘗試了一種策略:首先,我們需要初步地調(diào)一次“子采樣率”(subsample)和“分裂時(shí)考慮的最大特征數(shù)”(max_features),在此基礎(chǔ)上依次調(diào)好“葉節(jié)點(diǎn)最小樣本數(shù)”(min_samples_leaf)、“分裂所需最小樣本數(shù)”(min_samples_split)以及“最大深度”(max_depth)。然后,按照Aarshay的方法,按影響力從大到小再調(diào)一次。通過這種方法,整體模型性能在未等比縮放過程影響類參數(shù)前,已達(dá)到約0.8352左右,比workbench相比,提升了約0.1,與Aarshay的調(diào)參試驗(yàn)差不多,甚至更好一點(diǎn)點(diǎn)。

回過頭來,我們再次看看貪心的坐標(biāo)下降法是怎么掉入這個(gè)陷阱的。在確定過程影響類參數(shù)后,貪心的坐標(biāo)下降法按照“動(dòng)態(tài)”的對整體模型性能的影響力大小,選擇了“葉節(jié)點(diǎn)最小樣本數(shù)”進(jìn)行調(diào)參。這一步看似和上一段的描述是一致的,但是,一般來說,含隨機(jī)性(“子采樣率”和“分裂時(shí)考慮的最大特征數(shù)”先初步調(diào)過)的“葉節(jié)點(diǎn)最小樣本數(shù)”要大于無隨機(jī)性。舉個(gè)例來說,因?yàn)樵黾恿穗S機(jī)性,導(dǎo)致了子采樣后,某子樣本中只有一個(gè)正例,且其可以通過唯一的特征將其分類,但是這個(gè)特征并不是所有正例的共性,所以此時(shí)就要求“葉節(jié)點(diǎn)最小樣本數(shù)”需要比無隨機(jī)性時(shí)大。對貪心的坐標(biāo)下降來說,“子采樣率”和“分裂時(shí)考慮的最大特征數(shù)”在當(dāng)下,對整體模型性能的影響比不上“葉節(jié)點(diǎn)最小樣本數(shù)”,所以栽了個(gè)大跟頭。

3 總結(jié)

在這篇博文中,我一反常態(tài),花了大部分時(shí)間去試驗(yàn)和說明一個(gè)有瑕疵的方案。數(shù)據(jù)挖掘的工作中的方法和技巧,有很大一部分暫時(shí)還未被嚴(yán)謹(jǐn)?shù)刈C明,所以有很大部分人,特別是剛?cè)腴T的小青年們(也包括曾經(jīng)的我),誤以為其是一門玄學(xué)。實(shí)際上,盡管沒有被嚴(yán)謹(jǐn)?shù)刈C明,我們還是可以通過試驗(yàn)、分析,特別是與現(xiàn)有方法進(jìn)行對比,得到一個(gè)近似的合理性論證。

另外,小伙伴們你們有什么獨(dú)到的調(diào)參方法嗎?請不要有絲毫吝嗇,狠狠地將你們的獨(dú)門絕技全釋放在我身上吧,請大膽留言,殘酷批評!

4 參考資料

1、《使用sklearn進(jìn)行集成學(xué)習(xí)——理論》

2、Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python

3坐標(biāo)下降法

4Digit Recognizer

5Hackathon3.x

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,362評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,013評論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,346評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,421評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,146評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,534評論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,585評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,767評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,318評論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,074評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,258評論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,828評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,486評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,916評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,156評論 1 290
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,993評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,234評論 2 375

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