Random Forest算法参数解释及调优
文章介紹了如何對(duì)隨機(jī)森林模型進(jìn)行參數(shù)調(diào)優(yōu)
原文來(lái)自:http://www.analyticsvidhya.com/blog/2015/06/tuning-random-forest-model/
為什么要調(diào)整機(jī)器學(xué)習(xí)算法?
一個(gè)月以前,我在kaggle上參加了一個(gè)名為TFI的比賽。 我第一次提交的結(jié)果在50%。 我不懈努力在特征工程上花了超過(guò)2周的時(shí)間,勉強(qiáng)達(dá)到20%。 出乎我意料的事是,在調(diào)整機(jī)器學(xué)習(xí)算法參數(shù)之后,我能夠達(dá)到前10%。
這是這就是機(jī)器學(xué)習(xí)算法參數(shù)調(diào)優(yōu)的重要性。 隨機(jī)森林是在工業(yè)界中使用的最簡(jiǎn)單的機(jī)器學(xué)習(xí)工具之一。 在我們以前的文章中,我們已經(jīng)向您介紹了隨機(jī)森林和和CART模型進(jìn)行了對(duì)比 。 機(jī)器學(xué)習(xí)工具包正由于這些算法的表現(xiàn)而被人所熟知。。
隨機(jī)森林是什么?
隨機(jī)森林是一個(gè)集成工具,它使用觀測(cè)數(shù)據(jù)的子集和變量的子集來(lái)建立一個(gè)決策樹。 它建立多個(gè)這樣的決策樹,然后將他們合并在一起以獲得更準(zhǔn)確和穩(wěn)定的預(yù)測(cè)。 這樣做最直接的事實(shí)是,在這一組獨(dú)立的預(yù)測(cè)結(jié)果中,用投票方式得到一個(gè)最高投票結(jié)果,這個(gè)比單獨(dú)使用最好模型預(yù)測(cè)的結(jié)果要好。
?我們通常將隨機(jī)森林作為一個(gè)黑盒子,輸入數(shù)據(jù)然后給出了預(yù)測(cè)結(jié)果,無(wú)需擔(dān)心模型是如何計(jì)算的。這個(gè)黑盒子本身有幾個(gè)我們可以擺弄的杠桿。 每個(gè)杠桿都能在一定程度上影響模型的性能或資源 -- 時(shí)間平衡。 在這篇文章中,我們將更多地討論我們可以調(diào)整的杠桿,同時(shí)建立一個(gè)隨機(jī)林模型。
調(diào)整隨機(jī)森林的參數(shù)/杠桿
隨機(jī)森林的參數(shù)即可以增加模型的預(yù)測(cè)能力,又可以使訓(xùn)練模型更加容易。 以下我們將更詳細(xì)地談?wù)摳鱾€(gè)參數(shù)(請(qǐng)注意,這些參數(shù),我使用的是Python常規(guī)的命名法):
1.使模型預(yù)測(cè)更好的特征
主要有3類特征可以被調(diào)整,以改善該模型的預(yù)測(cè)能力:
A. max_features:
隨機(jī)森林允許單個(gè)決策樹使用特征的最大數(shù)量。 Python為最大特征數(shù)提供了多個(gè)可選項(xiàng)。 下面是其中的幾個(gè):
Auto/None :簡(jiǎn)單地選取所有特征,每顆樹都可以利用他們。這種情況下,每顆樹都沒有任何的限制。
sqrt :此選項(xiàng)是每顆子樹可以利用總特征數(shù)的平方根個(gè)。 例如,如果變量(特征)的總數(shù)是100,所以每顆子樹只能取其中的10個(gè)。“l(fā)og2”是另一種相似類型的選項(xiàng)。
0.2:此選項(xiàng)允許每個(gè)隨機(jī)森林的子樹可以利用變量(特征)數(shù)的20%。如果想考察的特征x%的作用, 我們可以使用“0.X”的格式。
max_features如何影響性能和速度?
增加max_features一般能提高模型的性能,因?yàn)樵诿總€(gè)節(jié)點(diǎn)上,我們有更多的選擇可以考慮。 然而,這未必完全是對(duì)的,因?yàn)樗档土藛蝹€(gè)樹的多樣性,而這正是隨機(jī)森林獨(dú)特的優(yōu)點(diǎn)。 但是,可以肯定,你通過(guò)增加max_features會(huì)降低算法的速度。 因此,你需要適當(dāng)?shù)钠胶夂瓦x擇最佳max_features。
B. n_estimators:
在利用最大投票數(shù)或平均值來(lái)預(yù)測(cè)之前,你想要建立子樹的數(shù)量。 較多的子樹可以讓模型有更好的性能,但同時(shí)讓你的代碼變慢。 你應(yīng)該選擇盡可能高的值,只要你的處理器能夠承受的住,因?yàn)檫@使你的預(yù)測(cè)更好更穩(wěn)定。
C. min_sample_leaf:
如果您以前編寫過(guò)一個(gè)決策樹,你能體會(huì)到最小樣本葉片大小的重要性。 葉是決策樹的末端節(jié)點(diǎn)。 較小的葉子使模型更容易捕捉訓(xùn)練數(shù)據(jù)中的噪聲。 一般來(lái)說(shuō),我更偏向于將最小葉子節(jié)點(diǎn)數(shù)目設(shè)置為大于50。在你自己的情況中,你應(yīng)該盡量嘗試多種葉子大小種類,以找到最優(yōu)的那個(gè)。
2.使得模型訓(xùn)練更容易的特征
有幾個(gè)屬性對(duì)模型的訓(xùn)練速度有直接影響。 對(duì)于模型速度,下面是一些你可以調(diào)整的關(guān)鍵參數(shù):
A. n_jobs:
這個(gè)參數(shù)告訴引擎有多少處理器是它可以使用。 “-1”意味著沒有限制,而“1”值意味著它只能使用一個(gè)處理器。 下面是一個(gè)用Python做的簡(jiǎn)單實(shí)驗(yàn)用來(lái)檢查這個(gè)指標(biāo):
%timeit model = RandomForestRegressor(n_estimator = 100, oob_score = TRUE,n_jobs = 1,random_state =1) model.fit(X,y) Output ———- 1 loop best of 3 : 1.7 sec per loop%timeit model = RandomForestRegressor(n_estimator = 100,oob_score = TRUE,n_jobs = -1,random_state =1) model.fit(X,y) Output ———- 1 loop best of 3 : 1.1 sec per loop“%timeit”是一個(gè)非常好的功能,他能夠運(yùn)行函數(shù)多次并給出了最快循環(huán)的運(yùn)行時(shí)間。 這出來(lái)非常方便,同時(shí)將一個(gè)特殊的函數(shù)從原型擴(kuò)展到最終數(shù)據(jù)集中。
B. random_state:
此參數(shù)讓結(jié)果容易復(fù)現(xiàn)。 一個(gè)確定的隨機(jī)值將會(huì)產(chǎn)生相同的結(jié)果,在參數(shù)和訓(xùn)練數(shù)據(jù)不變的情況下。 我曾親自嘗試過(guò)將不同的隨機(jī)狀態(tài)的最優(yōu)參數(shù)模型集成,有時(shí)候這種方法比單獨(dú)的隨機(jī)狀態(tài)更好。
C. oob_score:
這是一個(gè)隨機(jī)森林交叉驗(yàn)證方法。 它和留一驗(yàn)證方法非常相似,但這快很多。 這種方法只是簡(jiǎn)單的標(biāo)記在每顆子樹中用的觀察數(shù)據(jù)。 然后對(duì)每一個(gè)觀察樣本找出一個(gè)最大投票得分,是由那些沒有使用該觀察樣本進(jìn)行訓(xùn)練的子樹投票得到。
下面函數(shù)中使用了所有這些參數(shù)的一個(gè)例子:
model = RandomForestRegressor(n_estimator = 100, oob_score = TRUE, n_jobs = -1,random_state =50,max_features = "auto", min_samples_leaf = 50)model.fit(x, y)通過(guò)案例研究學(xué)習(xí)
我們以在以前的文章中經(jīng)常提到泰坦尼克號(hào)為例。 讓我們?cè)俅螄L試同樣的問(wèn)題。 這種情況下的目標(biāo)是,了解調(diào)整隨機(jī)森林參數(shù)而不是找到最好的特征。 試試下面的代碼來(lái)構(gòu)建一個(gè)基本模型:
from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import roc_auc_score import pandas as pd x = pd.read_csv("train.csv") y = x.pop("Survived") model = RandomForestRegressor(n_estimator = 100 , oob_score = TRUE, random_state = 42) model.fit(x(numeric_variable,y) print "AUC - ROC : ", roc_auc_score(y,model.oob_prediction)AUC - ROC:0.7386這是一個(gè)非常簡(jiǎn)單沒有參數(shù)設(shè)定的模型。 現(xiàn)在讓我們做一些參數(shù)調(diào)整。 正如我們以前討論過(guò),我們有6個(gè)關(guān)鍵參數(shù)來(lái)調(diào)整。 我們有一些Python內(nèi)置的的網(wǎng)格搜索算法,它可以自動(dòng)調(diào)整所有參數(shù)。在這里讓我們自己動(dòng)手來(lái)實(shí)現(xiàn),以更好了解該機(jī)制。 下面的代碼將幫助您用不同的葉子大小來(lái)調(diào)整模型。
練習(xí):試試運(yùn)行下面的代碼,并在評(píng)論欄中找到最佳葉片大小。
sample_leaf_options = [1,5,10,50,100,200,500]for leaf_size in sample_leaf_options :model = RandomForestRegressor(n_estimator = 200, oob_score = TRUE, n_jobs = -1,random_state =50,max_features = "auto", min_samples_leaf = leaf_size)model.fit(x(numeric_variable,y)print "AUC - ROC : ", roc_auc_score(y,model.oob_prediction)備注
就像是隨機(jī)森林,支持向量機(jī),神經(jīng)網(wǎng)絡(luò)等機(jī)器學(xué)習(xí)工具都具有高性能。 他們有很高的性能,但用戶一般并不了解他們實(shí)際上是如何工作的。 不知道該模型的統(tǒng)計(jì)信息不是什么問(wèn)題,但是不知道如何調(diào)整模型來(lái)擬合訓(xùn)練數(shù)據(jù),這將會(huì)限制用戶使用該算法來(lái)充分發(fā)揮其潛力。 在一些后續(xù)的文章中,我們將討論其他機(jī)器學(xué)習(xí)算法,像支持向量機(jī),GBM和neaural networks。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Random Forest算法参数解释及调优的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Ubuntu下安装微信
- 下一篇: qt android glsl,基于Qt