随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...
一、什么是隨機(jī)森林
前面我們已經(jīng)介紹了決策樹(shù)的基本原理和使用。但是決策樹(shù)有一個(gè)很大的缺陷:因?yàn)闆Q策樹(shù)會(huì)非常細(xì)致地劃分樣本,如果決策樹(shù)分得太多細(xì)致,會(huì)導(dǎo)致其在訓(xùn)練集上出現(xiàn)過(guò)擬合,而如果決策樹(shù)粗略地劃分樣本,又不能很好地?cái)M合樣本。
為了解決這個(gè)兩難困境,聰明的專家們想出了這樣的思路:既然我增加單棵樹(shù)的深度會(huì)適得其反,那不如我不追求一個(gè)樹(shù)有多高的精確度,而是訓(xùn)練多棵這樣的樹(shù)來(lái)一塊預(yù)測(cè),一棵樹(shù)的力量再大,也是有限的,當(dāng)他們聚成一個(gè)集體,它的力量可能是難以想象的,也就是我們常說(shuō)的:“三個(gè)臭皮匠賽過(guò)諸葛亮”。這便是集成學(xué)習(xí)的思想。
這里多提一句,正是因?yàn)槊靠脴?shù)都能夠用比較簡(jiǎn)單的方法細(xì)致地?cái)M合樣本,我們可以多用幾棵樹(shù)來(lái)搭建準(zhǔn)確率更高的算法,后邊要說(shuō)到的一些工業(yè)級(jí)的算法,比如GBDT、XGBOOST、LGBM都是以決策樹(shù)為積木搭建出來(lái)的。
所以在學(xué)習(xí)這些算法的過(guò)程中,我們也要把決策樹(shù)算法看成一塊塊積木,學(xué)完了基本的積木算法之后,對(duì)于現(xiàn)在常用的那幾個(gè)工業(yè)級(jí)的算法,只需要理清兩個(gè)問(wèn)題:
1)這個(gè)算法利用了哪個(gè)集成學(xué)習(xí)思想
2)這個(gè)算法具體怎么把這個(gè)思想實(shí)現(xiàn)出來(lái)的。
隨機(jī)森林就是決策樹(shù)們基于bagging集成學(xué)習(xí)思想搭建起來(lái)的。
隨機(jī)森林的算法實(shí)現(xiàn)思路非常簡(jiǎn)單,只需要記住一句口訣:抽等量樣本,選幾個(gè)特征,構(gòu)建多棵樹(shù)。
下面,我們?cè)敿?xì)解釋這個(gè)口訣的含義:
1)抽等量樣本
隨機(jī)森林訓(xùn)練每棵樹(shù)之前,都會(huì)從訓(xùn)練集中隨機(jī)抽出一部分樣本來(lái)訓(xùn)練。所以說(shuō)訓(xùn)練每棵樹(shù)用到的樣本其實(shí)都是有差別的,這樣就保證了不同的樹(shù)可以重點(diǎn)學(xué)習(xí)不同的樣本。而為了達(dá)到抽等量樣本的目的,抽樣方式一般是有放回的抽樣,也就是說(shuō),在訓(xùn)練某棵樹(shù)的時(shí)候,這一次被抽到的樣本會(huì)被放回?cái)?shù)據(jù)集中,下一次還可能被抽到,因此,原訓(xùn)練集中有的樣本會(huì)多次被抽出用來(lái)訓(xùn)練,而有的樣本可能不會(huì)被使用到。
但是不用擔(dān)心有的樣本沒(méi)有用到,只要訓(xùn)練的樹(shù)的棵數(shù)足夠多,大多數(shù)訓(xùn)練樣本總會(huì)被取到的。有極少量的樣本成為漏網(wǎng)之魚也不用擔(dān)心,后邊我們會(huì)篩選他們出來(lái)用來(lái)測(cè)試模型。
2)選幾個(gè)特征
在訓(xùn)練某棵樹(shù)的時(shí)候,也不是將樣本的所有特征都用來(lái)訓(xùn)練,而是會(huì)隨機(jī)選擇一部分特征用來(lái)訓(xùn)練。這樣做的目的就是讓不同的樹(shù)重點(diǎn)關(guān)注不同的特征。在scikit-learn中,用“max_features”這個(gè)參數(shù)來(lái)控制訓(xùn)練每棵樹(shù)選取的樣本數(shù)。
3)構(gòu)建多棵樹(shù)。
通過(guò)1)、2)兩個(gè)步驟,訓(xùn)練多棵樹(shù)。魯迅曾經(jīng)說(shuō)過(guò):世界上本沒(méi)有森林,長(zhǎng)得樹(shù)多了,就成了森林。正是一棵棵決策樹(shù)構(gòu)成了整個(gè)隨機(jī)森林。具體構(gòu)建樹(shù)的數(shù)量,在scikit-learn中,用“n_estimators”這個(gè)參數(shù)來(lái)控制。
那最終的預(yù)測(cè)結(jié)果怎么得到呢?隨機(jī)森林是非常民主的算法,最終的結(jié)果由每棵決策樹(shù)綜合給出:如果是分類問(wèn)題,那么對(duì)于每個(gè)測(cè)試集,樹(shù)都會(huì)預(yù)測(cè)出一個(gè)類別進(jìn)行投票,最終統(tǒng)計(jì)票數(shù)多的那個(gè)類別為最終類別。看看,這算法儼然是一個(gè)遵循:“少數(shù)服從多數(shù)”的原則的小型民主社會(huì);如果是回歸問(wèn)題,那就更簡(jiǎn)單了,各個(gè)樹(shù)得到的結(jié)果相加求得一個(gè)平均值為最終回歸結(jié)果。
從上邊的流程中可以看出,隨機(jī)森林的隨機(jī)性主要體現(xiàn)在兩個(gè)方面:數(shù)據(jù)集的隨機(jī)選取、每棵樹(shù)所使用特征的隨機(jī)選取。以上兩個(gè)隨機(jī)性使得隨機(jī)森林中的決策樹(shù)都能夠彼此不同,提升系統(tǒng)的多樣性,從而提升分類性能。
二、隨機(jī)森林的特點(diǎn)
以上就是隨機(jī)森林的構(gòu)建原理,下面,我們說(shuō)說(shuō)隨機(jī)森林算法的優(yōu)缺點(diǎn):
1、優(yōu)點(diǎn):
1)實(shí)現(xiàn)簡(jiǎn)單,泛化能力強(qiáng),可以并行實(shí)現(xiàn),因?yàn)橛?xùn)練時(shí)樹(shù)與樹(shù)之間是相互獨(dú)立的;
2)相比單一決策樹(shù),能學(xué)習(xí)到特征之間的相互影響,且不容易過(guò)擬合;
3)能直接特征很多的高維數(shù)據(jù),因?yàn)樵谟?xùn)練過(guò)程中依舊會(huì)從這些特征中隨機(jī)選取部分特征用來(lái)訓(xùn)練;
4)相比SVM,不是很怕特征缺失,因?yàn)榇x特征也是隨機(jī)選取;
5)訓(xùn)練完成后可以給出特征重要性。當(dāng)然,這個(gè)優(yōu)點(diǎn)主要來(lái)源于決策樹(shù)。因?yàn)闆Q策樹(shù)在訓(xùn)練過(guò)程中會(huì)計(jì)算熵或者是基尼系數(shù),越往樹(shù)的根部,特征越重要。
2、缺點(diǎn)
1)在噪聲過(guò)大的分類和處理回歸問(wèn)題時(shí)還是容易過(guò)擬合;
2)相比于單一決策樹(shù),它的隨機(jī)性讓我們難以對(duì)模型進(jìn)行解釋。
三、隨機(jī)森林的使用
和決策樹(shù)類似,隨機(jī)森林同樣可以分為分類森林(RandomForestClassifier )和回歸森林(RandomForestRegressor),在scikit-lean中調(diào)用方式和決策樹(shù)相同。
讓我們?cè)谑謱懽R(shí)別數(shù)據(jù)集上實(shí)現(xiàn)一個(gè)分類森林。
#導(dǎo)入必要的包 from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_digits from sklearn.model_selection import train_test_split,GridSearchCV,cross_val_score from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt import numpy as np#導(dǎo)入數(shù)據(jù)集 data = load_digits() x = data.data y = data.target用隨機(jī)森林訓(xùn)練并進(jìn)行交叉驗(yàn)證:
RF = RandomForestClassifier(random_state = 66) score = cross_val_score(RF,x,y,cv=10).mean() print('交叉驗(yàn)證得分: %.4f'%score)輸出:
交叉驗(yàn)證得分: 0.9278四、隨機(jī)森林調(diào)參
一)隨機(jī)森林參數(shù)介紹
除了和決策樹(shù)有的參數(shù)之外,對(duì)于隨機(jī)森林,只需要掌握8個(gè)新增的參數(shù)即可,我將這8個(gè)參數(shù)分成三類:
1、用于調(diào)參的參數(shù):
- max_features(最大特征數(shù)): 這個(gè)參數(shù)用來(lái)訓(xùn)練每棵樹(shù)時(shí)需要考慮的最大特征個(gè)數(shù),超過(guò)限制個(gè)數(shù)的特征都會(huì)被舍棄,默認(rèn)為auto。可填入的值有:int值,float(特征總數(shù)目的百分比),“auto”/“sqrt”(總特征個(gè)數(shù)開(kāi)平方取整),“l(fā)og2”(總特征個(gè)數(shù)取對(duì)數(shù)取整)。默認(rèn)值為總特征個(gè)數(shù)開(kāi)平方取整。值得一提的是,這個(gè)參數(shù)在決策樹(shù)中也有但是不重要,因?yàn)槠淠J(rèn)為None,即有多少特征用多少特征。為什么要設(shè)置這樣一個(gè)參數(shù)呢?原因如下:考慮到訓(xùn)練模型會(huì)產(chǎn)生多棵樹(shù),如果在訓(xùn)練每棵樹(shù)的時(shí)候都用到所有特征,以來(lái)導(dǎo)致運(yùn)算量加大,二來(lái)每棵樹(shù)訓(xùn)練出來(lái)也可能千篇一律,沒(méi)有太多側(cè)重,所以,設(shè)置這個(gè)參數(shù),使訓(xùn)練每棵樹(shù)的時(shí)候只隨機(jī)用到部分特征,在減少整體運(yùn)算的同時(shí)還可以讓每棵樹(shù)更注重自己選到的特征。
 - n_estimators:隨機(jī)森林生成樹(shù)的個(gè)數(shù),默認(rèn)為100。
 
2、控制樣本抽樣參數(shù):
- bootstrap:每次構(gòu)建樹(shù)是不是采用有放回樣本的方式(bootstrap samples)抽取數(shù)據(jù)集。可選參數(shù):True和False,默認(rèn)為True。
 - oob_score:是否使用袋外數(shù)據(jù)來(lái)評(píng)估模型,默認(rèn)為False。
 
boostrap和 oob_score兩個(gè)參數(shù)一般要配合使用。如果boostrap是False,那么每次訓(xùn)練時(shí)都用整個(gè)數(shù)據(jù)集訓(xùn)練,如果boostrap是True,那么就會(huì)產(chǎn)生袋外數(shù)據(jù)。
先解釋一下袋外數(shù)據(jù)的概念:
在一個(gè)含有n個(gè)樣本的原始訓(xùn)練集中,我們每次隨機(jī)取出一個(gè)樣本并記錄,并在抽取下一個(gè)樣本之前將該樣本放回原始訓(xùn)練集,即下次采樣時(shí)這個(gè)樣本依然可能被采集到,這樣采集n次,最終得到一個(gè)和原始訓(xùn)練集一樣大的子數(shù)據(jù)集。
由于是隨機(jī)采樣,這樣每次的子數(shù)據(jù)集和原始數(shù)據(jù)集都不同,用這些子數(shù)據(jù)集來(lái)各自訓(xùn)練一棵樹(shù),這些樹(shù)的參數(shù)自然也就各不相同了。
然而有放回抽樣也會(huì)有自己的問(wèn)題。由于是有放回,一些樣本可能在同一個(gè)自助集中出現(xiàn)多次,而其他一些卻可能被忽略,一般來(lái)說(shuō),每一次抽樣,某個(gè)樣本被抽到的概率是 1/n ,所以不被抽到的概率就是 1-1/n ,所以n個(gè)樣本都不被抽到的概率就是:
用洛必達(dá)法則化簡(jiǎn),可以得到這個(gè)概率收斂于(1/e),約等于0.37。
因此,如果數(shù)據(jù)量足夠大的時(shí)候,會(huì)有約37%的訓(xùn)練數(shù)據(jù)被浪費(fèi)掉,沒(méi)有參與建模,這些數(shù)據(jù)被稱為袋外數(shù)據(jù)(out of bag data,簡(jiǎn)寫為oob)。
為了這些數(shù)據(jù)不被浪費(fèi),我們也可以把他們用來(lái)作為集成算法的測(cè)試集。也就是說(shuō),在使用隨機(jī)森林時(shí),我們可以不劃分測(cè)試集和訓(xùn)練集,只需要用袋外數(shù)據(jù)來(lái)測(cè)試我們的模型即可。
當(dāng)然,這需要樣本數(shù)據(jù)n和分類器個(gè)數(shù)n_estimators都很大,如果數(shù)據(jù)集過(guò)少,很可能就沒(méi)有數(shù)據(jù)掉落在袋外,自然也就無(wú)法使用oob數(shù)據(jù)來(lái)測(cè)試模型了。
當(dāng)bootstrap參數(shù)取默認(rèn)值True時(shí),表示抽取數(shù)據(jù)集時(shí)采用這種有放回的隨機(jī)抽樣技術(shù)。如果希望用袋外數(shù)據(jù)來(lái)測(cè)試,則需要在實(shí)例化時(shí)就將oob_score這個(gè)參數(shù)調(diào)整為True,訓(xùn)練完畢之后,我們可以用隨機(jī)森林的另一個(gè)重要屬性:oob_score_來(lái)查看我們的在袋外數(shù)據(jù)上測(cè)試的結(jié)果,代碼如下:
#訓(xùn)練一個(gè)模型,讓oob_score=True 輸出:0.9393433500278241這個(gè)就是沒(méi)有參與訓(xùn)練的數(shù)據(jù)集在模型上的測(cè)試得分。
3、不重要參數(shù)
- max_samples:構(gòu)建每棵樹(shù)需要抽取的最大樣本數(shù)據(jù)量,默認(rèn)為None,即每次抽取樣本數(shù)量和原數(shù)據(jù)量相同。
 - n_jobs::設(shè)定fit和predict階段并列執(zhí)行的CPU核數(shù),如果設(shè)置為-1表示并行執(zhí)行的任務(wù)數(shù)等于計(jì)算機(jī)核數(shù)。默認(rèn)為None,即采用單核計(jì)算。
 - verbose:控制構(gòu)建數(shù)過(guò)程的冗長(zhǎng)度,默認(rèn)為0。一般不需要管這個(gè)參數(shù)。
 - warm_start:當(dāng)設(shè)置為True,重新使用之前的結(jié)構(gòu)去擬合樣例并且加入更多的估計(jì)器(estimators,在這里就是隨機(jī)樹(shù))到組合器中。默認(rèn)為 False
 
以上這幾個(gè)參數(shù)只需要簡(jiǎn)單了解即可,大多數(shù)參數(shù)在使用過(guò)稱重不用調(diào)整,只是需要注意一點(diǎn),n_jobs默認(rèn)為None,為了加快速度,可以把n_jobs設(shè)置為-1。
二)隨機(jī)森林調(diào)參順序
介紹完了這些參數(shù),接下來(lái)就要介紹隨機(jī)森林的調(diào)參順序了,隨機(jī)森林的調(diào)參順序一般遵循先重要后次要、先粗放后精細(xì)的原則,即先確定需要多少棵樹(shù)參與建模,再對(duì)每棵樹(shù)做細(xì)致的調(diào)參,精益求精。
相對(duì)于xgboost等算法,隨機(jī)森林的調(diào)參還是相對(duì)比較簡(jiǎn)單,因?yàn)楦鱾€(gè)參數(shù)之間互相影響的程度很小,只需要按步驟調(diào)整即可。
結(jié)合我們決策樹(shù)文章中提到的參數(shù)以及今天所講的兩個(gè)參數(shù),隨機(jī)森林中主要用來(lái)調(diào)參的參數(shù)有6個(gè):
- n_estimators:
 - criterion
 - max_depth
 - min_samples_split
 - min_samples_leaf
 - max_features
 
調(diào)參順序如下:
1)選擇criterion參數(shù)(決策樹(shù)劃分標(biāo)準(zhǔn))
和決策樹(shù)一樣,這個(gè)參數(shù)只有兩個(gè)參數(shù) 'entropy'(熵) 和 'gini'(基尼系數(shù))可選,默認(rèn)為gini,這里簡(jiǎn)單測(cè)試一下就好
RF = RandomForestClassifier(random_state = 66) score = cross_val_score(RF,x,y,cv=10).mean() print('基尼系數(shù)得分: %.4f'%score) RF = RandomForestClassifier(criterion = 'entropy',random_state = 66) score = cross_val_score(RF,x,y,cv=10).mean() print('熵得分: %.4f'%score)輸出:
基尼系數(shù)得分: 0.9278熵得分: 0.9249
這里看到,依舊是選用gini系數(shù)模型效果更好。
2)探索n_estimators的最佳值。
接下來(lái)才是進(jìn)入真正的調(diào)參環(huán)節(jié)。根據(jù)上述調(diào)參原則,我們先看看用幾棵樹(shù)模型的表現(xiàn)最好。一般來(lái)說(shuō),樹(shù)的棵數(shù)越多,模型效果表現(xiàn)越好,但樹(shù)的棵數(shù)達(dá)到一定的數(shù)量之后,模型精確度不再上升,訓(xùn)練這個(gè)模型的計(jì)算量卻逐漸變大。這個(gè)時(shí)候,再加樹(shù)的數(shù)量就沒(méi)必要了。就好比你餓的時(shí)候每吃一個(gè)饅頭就特別頂飽,但是吃到一定數(shù)量的饅頭之后,再吃就要撐著了。
只要找到這個(gè)臨界值,這個(gè)參數(shù)就調(diào)好了。為了觀察得分隨著樹(shù)增多的變化,我們依然繪制決策樹(shù)調(diào)參時(shí)的學(xué)習(xí)曲線。
###調(diào)n_estimators參數(shù) ScoreAll = [] for i in range(10,200,10):DT = RandomForestClassifier(n_estimators = i,random_state = 66) #,criterion = 'entropy'score = cross_val_score(DT,data.data,data.target,cv=10).mean()ScoreAll.append([i,score]) ScoreAll = np.array(ScoreAll)max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] ##這句話看似很長(zhǎng)的,其實(shí)就是找出最高得分對(duì)應(yīng)的索引 print("最優(yōu)參數(shù)以及最高得分:",ScoreAll[max_score]) plt.figure(figsize=[20,5]) plt.plot(ScoreAll[:,0],ScoreAll[:,1]) plt.show()輸出:
最優(yōu)參數(shù)以及最高得分: [120. 0.95560035]調(diào)n_estimators參數(shù)根據(jù)曲線,我們進(jìn)一步縮小范圍,搜索100~130之間的得分。(這里可以根據(jù)經(jīng)驗(yàn)自己指定)
###進(jìn)一步縮小范圍,調(diào)n_estimators參數(shù) ScoreAll = [] for i in range(100,130):DT = RandomForestClassifier(n_estimators = i,random_state = 66) #criterion = 'entropy',score = cross_val_score(DT,data.data,data.target,cv=10).mean()ScoreAll.append([i,score]) ScoreAll = np.array(ScoreAll)max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] ##這句話看似很長(zhǎng)的,其實(shí)就是找出最高得分對(duì)應(yīng)的索引 print("最優(yōu)參數(shù)以及最高得分:",ScoreAll[max_score]) plt.figure(figsize=[20,5]) plt.plot(ScoreAll[:,0],ScoreAll[:,1]) plt.show()輸出:
最優(yōu)參數(shù)以及最高得分: [117. 0.95727946]調(diào)n_estimators參數(shù)
可以看到,117為得分最高點(diǎn),我們暫定n_estimators為117,接著調(diào)下邊的參數(shù)。
3)探索max_depth(樹(shù)的最大深度)最佳參數(shù)
###粗調(diào)max_depth參數(shù) ScoreAll = [] for i in range(10,30,3):DT = RandomForestClassifier(n_estimators = 117,random_state = 66,max_depth =i ) #,criterion = 'entropy'score = cross_val_score(DT,data.data,data.target,cv=10).mean()ScoreAll.append([i,score]) ScoreAll = np.array(ScoreAll)max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] ##這句話看似很長(zhǎng)的,其實(shí)就是找出最高得分對(duì)應(yīng)的索引 print("最優(yōu)參數(shù)以及最高得分:",ScoreAll[max_score]) plt.figure(figsize=[20,5]) plt.plot(ScoreAll[:,0],ScoreAll[:,1]) plt.show()輸出:
最優(yōu)參數(shù)以及最高得分: [16. 0.95727946]max_depth參數(shù)轉(zhuǎn)折點(diǎn)在16,但是16之后一直沒(méi)有變化,可以說(shuō)明就算不限制,所有樹(shù)的最大深度也就是16左右,因?yàn)槲覀円圆介L(zhǎng)為3搜索的,所以還需要進(jìn)一步搜索一下16附近的值。
精細(xì)搜索之后發(fā)現(xiàn),16這個(gè)值就是轉(zhuǎn)折點(diǎn),所以暫定max_depth = 16。
4)探索min_samples_split(分割內(nèi)部節(jié)點(diǎn)所需的最小樣本數(shù))最佳參數(shù)
min_samples_split最小值就是2,我們就從2開(kāi)始調(diào)起。
輸出:
最優(yōu)參數(shù)以及最高得分: [2. 0.95727946]min_samples_split參數(shù)
可以看到,隨著min_samples_split增大,模型得分下降,說(shuō)明沒(méi)有出現(xiàn)過(guò)擬合現(xiàn)象,min_samples_split暫定2。
5)探索min_samples_leaf(分割內(nèi)部節(jié)點(diǎn)所需的最小樣本數(shù))最佳參數(shù)
###調(diào)min_samples_leaf參數(shù) ScoreAll = [] for i in range(1,15,2):DT = RandomForestClassifier(n_estimators = 117,random_state = 66,max_depth =16,min_samples_leaf = i,min_samples_split = 2 ) score = cross_val_score(DT,data.data,data.target,cv=10).mean()ScoreAll.append([i,score]) ScoreAll = np.array(ScoreAll)max_score = np.where(ScoreAll==np.max(ScoreAll[:,1]))[0][0] ##這句話看似很長(zhǎng)的,其實(shí)就是找出最高得分對(duì)應(yīng)的索引 print("最優(yōu)參數(shù)以及最高得分:",ScoreAll[max_score]) plt.figure(figsize=[20,5]) plt.plot(ScoreAll[:,0],ScoreAll[:,1]) plt.show()輸出:
最優(yōu)參數(shù)以及最高得分: [1. 0.95727946]min_samples_leaf參數(shù)5)對(duì)每棵樹(shù)用到的最大特征數(shù)max_features調(diào)參:
正常來(lái)說(shuō),只要這個(gè)值不要設(shè)置得太小,所有特征都會(huì)被整個(gè)森林抽取到用來(lái)訓(xùn)練, 所以相對(duì)來(lái)說(shuō)這個(gè)值對(duì)整個(gè)模型的影響不是太大。但這個(gè)值越大,單棵樹(shù)需要考慮的特征越多,雖然模型的表現(xiàn)可能會(huì)更好,但是增加這個(gè)值會(huì)導(dǎo)致算法運(yùn)行速度變慢,所以需要我們考慮去找一個(gè)平衡值。
#調(diào)max_features參數(shù) param_grid = {'max_features':np.arange(0.1, 1)}rfc = RandomForestClassifier(random_state=66,n_estimators = 117,max_depth = 16,min_samples_leaf =1 ,min_samples_split =4 ) GS = GridSearchCV(rfc,param_grid,cv=10) GS.fit(data.data,data.target) print(GS.best_params_) print(GS.best_score_)輸出:
{'max_features': 0.1}0.9560335195530726
如果時(shí)間充裕,接下來(lái)也可以將min_samples_leaf和min_samples_split作為網(wǎng)格參數(shù)聯(lián)調(diào)一下,因?yàn)檫@兩個(gè)參數(shù)會(huì)相互影響,這里暫時(shí)省略這一步。
此時(shí),我們得到的參數(shù)如下:
參數(shù)值n_estimators117max_depth16min_samples_leaf1min_samples_split2max_features0.1
6)在得到的最優(yōu)參數(shù)附近進(jìn)行小范圍網(wǎng)格搜索
因?yàn)槭謩?dòng)調(diào)參時(shí),這些參數(shù)可能會(huì)相互影響,導(dǎo)致我們得到的參數(shù)還不是最優(yōu)的。所以在最優(yōu)參數(shù)附近進(jìn)行小范圍的網(wǎng)格搜索,排出相互影響的因素,尤其是在數(shù)據(jù)集量比較少時(shí),小范圍搜索一下可能會(huì)有意外收獲。
import time start = time.time()param_grid = {'n_estimators':np.arange(140, 150),'max_depth':np.arange(15, 18),'min_samples_leaf':np.arange(1, 8),'min_samples_split':np.arange(2, 5),'max_features':np.arange(0.1, 1) }rfc = RandomForestClassifier(random_state=66) GS = GridSearchCV(rfc,param_grid,cv=10) GS.fit(data.data,data.target) end = time.time() print("循環(huán)運(yùn)行時(shí)間:%.2f秒"%(end-start)) print(GS.best_params_) print(GS.best_score_)輸出如下:
循環(huán)運(yùn)行時(shí)間:3052.67秒{'max_depth': 16, 'max_features': 0.1, 'min_samples_leaf': 1, 'min_samples_split': 3, 'n_estimators': 143}
0.9599332220367279
可以看到,精確度又上升了一點(diǎn),此時(shí),我們得到的新舊參數(shù)對(duì)比如下:
參數(shù)舊值新值n_estimators117143max_depth1616min_samples_leaf11min_samples_split23max_features0.10.1
對(duì)比一下新舊參數(shù),可以看到參數(shù)變化還是比較大的,尤其是樹(shù)的棵數(shù)這個(gè)參數(shù)。當(dāng)然,這里主要原因是我們用來(lái)做示例的這個(gè)預(yù)置的數(shù)據(jù)集只有1797條數(shù)據(jù),導(dǎo)致參數(shù)的隨機(jī)性太大,在實(shí)際使用中數(shù)據(jù)集數(shù)量都是十萬(wàn)百萬(wàn)級(jí)的,不會(huì)出現(xiàn)我們手動(dòng)調(diào)整的參數(shù)和小范圍網(wǎng)格搜索參數(shù)差別這么大的情況。
最后需要說(shuō)明的一點(diǎn)是:隨機(jī)森林相對(duì)于決策樹(shù)來(lái)說(shuō)運(yùn)行較慢,在調(diào)參時(shí)可以將參數(shù)搜索范圍設(shè)置得小一些。
當(dāng)然,這只是我個(gè)人的調(diào)參順序,僅用來(lái)參考,沒(méi)必要這么固化。實(shí)際調(diào)參時(shí)可以根據(jù)實(shí)際情況做一些調(diào)整。還是那句話:正是調(diào)參過(guò)程充滿的各種不確定性,才是調(diào)參的真正魅力所在。
五、本系列相關(guān)文章
- 機(jī)器學(xué)習(xí)超詳細(xì)實(shí)踐攻略(1):盤點(diǎn)scikit-learn里那些有趣又有用的彩蛋級(jí)入門數(shù)據(jù)集
 - 機(jī)器學(xué)習(xí)超詳細(xì)實(shí)踐攻略(8):使用scikit-learn構(gòu)建模型的通用模板【萬(wàn)字長(zhǎng)文】
 - ?機(jī)器學(xué)習(xí)超詳細(xì)實(shí)踐攻略(9):決策樹(shù)算法詳解及小白都能看懂的調(diào)參指南
 - 機(jī)器學(xué)習(xí)超詳細(xì)實(shí)踐攻略(21):三板斧干掉樣本不均衡問(wèn)題之1——過(guò)(欠)采樣
 - 機(jī)器學(xué)習(xí)超詳細(xì)實(shí)踐攻略(22):三板斧干掉樣本不均衡問(wèn)題之2——對(duì)正負(fù)樣本設(shè)置不同權(quán)重
 - 機(jī)器學(xué)習(xí)超詳細(xì)實(shí)踐攻略(23):三板斧干掉樣本不均衡問(wèn)題之3——通過(guò)集成學(xué)習(xí)方法解決樣本不均衡
 
總結(jié)
以上是生活随笔為你收集整理的随机森林的特征 是放回抽样么_机器学习超详细实践攻略(10):随机森林算法详解及小白都能看懂的调参指南...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
                            
                        - 上一篇: 小爱音箱app如何多部手机登录(怎么扫不
 - 下一篇: 西瓜视频app怎么投屏(高清免费在线视频