決策樹經(jīng)常會對訓(xùn)練數(shù)據(jù)進(jìn)行過擬合,也就是訓(xùn)練數(shù)據(jù)精度高柠硕,而預(yù)測結(jié)果很低工禾。隨機(jī)森林就是許多決策樹的集合,每一棵決策樹跟其他決策樹都不同,每棵樹都會不同方式的過擬合闻葵,那么對這些樹的結(jié)果取平均值糙捺,就可以降低過擬合。
隨機(jī)森林的隨機(jī)方法有兩種:
1笙隙、通過選擇用于構(gòu)造樹的數(shù)據(jù)點(diǎn)洪灯;
2、通過選擇每次劃分測試的特征竟痰。
一签钩、構(gòu)造隨機(jī)森林
構(gòu)造一個隨機(jī)森林模型,需要先確定用于構(gòu)造的樹的個數(shù) (RandomForestRegressor 或 RandomForestClassifier 的 n_estimators 參數(shù))坏快。這些樹在構(gòu)造時彼此完全獨(dú)立铅檩,算法對每棵樹進(jìn)行不同的隨機(jī)選擇,以確保樹和樹之間是有區(qū)別的莽鸿。首先要對數(shù)據(jù)進(jìn)行自助采樣昧旨。也就是說,從 n_samples 個數(shù)據(jù)點(diǎn)中有放回地(即同一樣本可以被多次抽取)重復(fù)隨機(jī)抽取一個樣本祥得,共抽取 n_samples 次兔沃。這樣會創(chuàng)建一個與原數(shù)據(jù)集大小相同的數(shù)據(jù)
集,但有些數(shù)據(jù)點(diǎn)會缺失级及,有些會重復(fù)乒疏。
接下來,基于這個新創(chuàng)建的數(shù)據(jù)集來構(gòu)造決策樹饮焦。在每個結(jié)點(diǎn)處怕吴,算法隨機(jī)選擇特征的一個子集,并對其中一個特征尋找最佳測試县踢,而不是對每個結(jié)點(diǎn)都尋找最佳測試转绷。選擇的特征個數(shù)由 max_features 參數(shù)來控制。每個結(jié)點(diǎn)中特征子集的選擇是相互獨(dú)立的硼啤,這樣樹的每個結(jié)點(diǎn)可以使用特征的不同子集來做出決策议经。
由于采用了自助采樣,隨機(jī)森林中構(gòu)造每棵決策樹的數(shù)據(jù)集都是略有不同丙曙。由于每個節(jié)點(diǎn)的特征選擇爸业,每棵樹的每次劃分都是基于特征的不同子集,這兩種方法共同保證隨機(jī)森林中所有樹都有所不同亏镰。
在構(gòu)造過程中扯旷,有一個關(guān)鍵參數(shù)是 max_features。
max_features:單個決策樹使用的最大特征個數(shù)
n_features:數(shù)據(jù)的特征個數(shù)
如果我們設(shè)置 max_features 等于 n_features索抓,那么每次劃分都要考慮數(shù)據(jù)集的所有特征钧忽,在特征選擇的過程中沒有添加隨機(jī)性(不過自助采樣依然存在隨機(jī)性)毯炮。如果設(shè)置 max_features 等于 1,那么在劃分時將無法選擇對哪個特征進(jìn)行測試耸黑,只能對隨機(jī)選擇的某個特征搜索不同的閾值桃煎。因此,如果 max_features 較大大刊,那么隨機(jī)森林中的樹將會十分相似为迈,利用最獨(dú)特的特征可以輕松擬合數(shù)據(jù)。如果 max_features 較小缺菌,那么隨機(jī)森林中的樹將會差異很大葫辐,為了很好地擬合數(shù)據(jù),每棵樹的深度都要很大伴郁。
二耿战、預(yù)測原理
先是利用森林中的每棵樹進(jìn)行預(yù)測。
對于回歸問題焊傅,我們可以對這些結(jié)果取平均值作為最終預(yù)測剂陡。
對于分類問題,則用到了“軟投票”策略狐胎。也就是說鸭栖,每個算法做出“軟”預(yù)測,給出每個可能的輸出標(biāo)簽的概率顽爹。對所有樹的預(yù)測概率取平均值纤泵,然后將概率最大的類別作為預(yù)測結(jié)果。
例子
import mglearn
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
X, y = make_moons(n_samples=100, noise=0.25, random_state=3)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
# 創(chuàng)建由5棵樹組成的隨機(jī)森林
forest = RandomForestClassifier(n_estimators=5, random_state=2)
forest.fit(X_train, y_train)
fig, axes = plt.subplots(2, 3, figsize=(20, 10))
# 將這5棵樹每棵樹的決策邊界可視化镜粤,然后將這個森林的總預(yù)測也可視化
for i, (ax, tree) in enumerate(zip(axes.ravel(), forest.estimators_)):
ax.set_title("Tree {}".format(i))
mglearn.plots.plot_tree_partition(X_train, y_train, tree, ax=ax)
mglearn.plots.plot_2d_separator(forest, X_train, fill=True, ax=axes[-1, -1], alpha=.4)
axes[-1, -1].set_title("Random Forest")
mglearn.discrete_scatter(X_train[:, 0], X_train[:, 1], y_train)
plt.show()
可視化的圖片
由上面的圖,我們可以看出來玻褪,在前5張圖中肉渴,這5棵樹學(xué)到的決策邊界大不相同。每棵樹都犯了一些錯誤带射,由于自助采樣的原因同规,導(dǎo)致一些訓(xùn)練點(diǎn)不在整個樹的訓(xùn)練集找那個。
隨機(jī)森林比單獨(dú)每一棵樹的過擬合都要小窟社,給出的決策邊界也更符合直覺券勺。在任何實際應(yīng)用中,我們會用到更多棵樹(通常是幾百或上千)灿里,從而得到更平滑的邊界关炼。
三、優(yōu)點(diǎn)匣吊、缺點(diǎn)和參數(shù)
用于回歸和分類的隨機(jī)森林是目前應(yīng)用最廣泛的機(jī)器學(xué)習(xí)方法之一儒拂。 這種方法非常強(qiáng)大寸潦,通常不需要反復(fù)調(diào)節(jié)參數(shù)就可以給出很好的結(jié)果,也不需要對數(shù)據(jù)進(jìn)行縮放社痛。
從本質(zhì)上看见转,隨機(jī)森林擁有決策樹的所有優(yōu)點(diǎn),同時彌補(bǔ)了決策樹的一些缺陷蒜哀。在大型數(shù)據(jù)集上構(gòu)建隨機(jī)森林可能比較費(fèi)時間斩箫,但是可以在多個 CPU上并行計算。通過使用 n_jobs 參數(shù)來調(diào)節(jié)使用的CPU個數(shù)撵儿。但設(shè)置 n_jobs 大于CPU個數(shù)是沒有用的校焦。可以設(shè)置 n_jobs=-1 來使用計算機(jī)的所有內(nèi)核统倒。
隨機(jī)森林本質(zhì)上是隨機(jī)的寨典,設(shè)置不同的隨機(jī)狀態(tài)(或者不設(shè)置 random_state 參數(shù))可以徹底改變構(gòu)建的模型。森林中的樹越多房匆,它對隨機(jī)狀態(tài)選擇的魯棒性就越好耸成。
對于維度非常高的稀疏數(shù)據(jù)(比如文本數(shù)據(jù)),隨機(jī)森林的表現(xiàn)往往不是很好浴鸿。對于這種數(shù)據(jù)井氢,使用線性模型可能更合適。即使是非常大的數(shù)據(jù)集岳链,隨機(jī)森林的表現(xiàn)通常也很好花竞。不過,隨機(jī)森林需要更大的內(nèi)存掸哑,訓(xùn)練和預(yù)測的速度也比線性模型要慢约急。對一個應(yīng)用來說,如果時間和內(nèi)存很重要的話苗分,那么換用線性模型可能更為明智厌蔽。
需要調(diào)節(jié)的重要參數(shù)有 n_estimators 和 max_features,可能還包括預(yù)剪枝選項(如 max_ depth)摔癣。n_estimators 總是越大越好奴饮。對更多的樹取平均可以降低過擬合,從而得到魯棒性更好的集成择浊。不過收益是遞減的戴卜,而且樹越多需要的內(nèi)存也越多,訓(xùn)練時間也越長琢岩。常用的經(jīng)驗法則就是“在時間和內(nèi)存允許的情況下盡量多”投剥。
max_features 決定每棵樹的隨機(jī)性大小,較小的 max_features 可以降低過擬合粘捎。一般使用默認(rèn)值: 對于分類薇缅,默認(rèn)值是 max_features=sqrt(n_ features); 對于回歸危彩,默認(rèn)值是 max_features=n_features。 增 大 max_features 或 max_ leaf_nodes 有時也可以提高性能泳桦。它還可以大大降低用于訓(xùn)練和預(yù)測的時間和空間要求汤徽。