作者:chen_h
微信號(hào) & QQ:862251340
微信公眾號(hào):coderpai
(一)機(jī)器學(xué)習(xí)中的集成學(xué)習(xí)入門
(二)bagging 方法
(三)使用Python進(jìn)行交易的隨機(jī)森林算法
(四)Python中隨機(jī)森林的實(shí)現(xiàn)與解釋
通過從單個(gè)決策樹構(gòu)建來使用和理解隨機(jī)森林
幸運(yùn)的是,對(duì)于像Scikit-Learn這樣的庫(kù),現(xiàn)在很容易在Python中實(shí)現(xiàn)數(shù)百種機(jī)器學(xué)習(xí)算法。這很容易,我們通常不需要任何關(guān)于模型是如何工作的知識(shí)來使用它。雖然不需要知道所有細(xì)節(jié),但了解機(jī)器學(xué)習(xí)模型如何工作仍然是非常有幫助的。這使我們可以在模型表現(xiàn)不佳時(shí)進(jìn)行修改參數(shù),或解釋模型如何做出決策,如果我們想要說服別人相信我們的模型,這是至關(guān)重要的。
在本文中,我們將介紹如何在Python中構(gòu)建和使用Random Forest。除了查看代碼之外,我們還將嘗試了解此模型的工作原理。因?yàn)橛稍S多決策樹組成的隨機(jī)森林,我們首先要了解單個(gè)決策樹如何對(duì)一個(gè)簡(jiǎn)單的問題進(jìn)行分類。然后,我們將努力使用隨機(jī)森林來解決現(xiàn)實(shí)世界的數(shù)據(jù)科學(xué)問題。
理解決策樹
決策樹是隨機(jī)森林的構(gòu)建塊,是一種非常直觀的模型。我們可以將決策樹視為一系列對(duì)我們數(shù)據(jù)進(jìn)行是/否分類的問題。這是一個(gè)可解釋的模型,因?yàn)樗梢韵裎覀內(nèi)祟愐粯舆M(jìn)行分類:在我們做出決定之前(在理想世界中),我們會(huì)詢問有關(guān)可用數(shù)據(jù)的一系列查詢,或者一系列特征。
在CART算法中,通過確定特征(稱為節(jié)點(diǎn)的分裂)來構(gòu)建決策樹,這些特征在經(jīng)過節(jié)點(diǎn)的時(shí)候通過Gini指數(shù)來進(jìn)行判斷。我們稍后會(huì)詳細(xì)討論關(guān)于Gini 指數(shù)的細(xì)節(jié),但首先,讓我們構(gòu)建一個(gè)決策樹,以便我們能夠在高層次上理解它。
關(guān)于簡(jiǎn)單問題的決策樹
我們將從一個(gè)非常簡(jiǎn)單的二分類問題開始,如下所示:
我們的數(shù)據(jù)只有特征,x1 和 x2,圖中有 6 個(gè)數(shù)據(jù)樣本,分為兩個(gè)標(biāo)簽 0 和 1。雖然這個(gè)問題非常簡(jiǎn)單,但它是線性不可分的,這意味著我們不能通過數(shù)據(jù)繪制一條直線來對(duì)數(shù)據(jù)進(jìn)行分類。
然而,我們可以繪制一系列直線,將數(shù)據(jù)點(diǎn)分成多個(gè)框,我們稱之為節(jié)點(diǎn)。實(shí)際上,這就是決策樹在訓(xùn)練期間所進(jìn)行的操作。簡(jiǎn)單的說,決策樹就是通過構(gòu)造很多線性邊界來構(gòu)造的非線性模型。
為了創(chuàng)建決策樹并在數(shù)據(jù)上進(jìn)行訓(xùn)練,我們使用 sklearn 來進(jìn)行。
from
sklearn
.
tree
import
DecisionTreeClassifier
# Make a decision tree and train
tree
=
DecisionTreeClassifier
(
random_state
=
RSEED
)
tree
.
fit
(
X
,
y
)
在訓(xùn)練期間,我們?yōu)槟P吞峁┨卣骱蜆?biāo)簽,以便它可以根據(jù)特征進(jìn)行學(xué)習(xí),然后分類。然后,我們可以在訓(xùn)練數(shù)據(jù)上面對(duì)我們的模型進(jìn)行測(cè)試。PS:因?yàn)槲覀儧]有測(cè)試數(shù)據(jù)。
print
(
f
'Model Accuracy: {tree.score(X, y)}'
)
Model Accuracy
:
1.0
我們看到它獲得了100%的準(zhǔn)確性,這也正是我們所期望的,因?yàn)槲覀兘o了它訓(xùn)練的數(shù)據(jù),并且沒有限制樹的深度。 事實(shí)證明,完全學(xué)習(xí)訓(xùn)練數(shù)據(jù)的能力可能是決策樹的缺點(diǎn),因?yàn)樗赡軙?huì)導(dǎo)致過度擬合,這一點(diǎn)我們稍后會(huì)討論。
可視化決策樹
那么,當(dāng)我們訓(xùn)練決策樹時(shí),實(shí)際上是在發(fā)生一些什么變化呢?我們找到一種可視化方法來理解決策樹,我們可以通過 scikit-learn 中的函數(shù),如下:
除了葉子節(jié)點(diǎn),所有節(jié)點(diǎn)都有五個(gè)部分:
- 基于特征的查詢,每個(gè)分裂節(jié)點(diǎn)都會(huì)給出真或者假的答案,根據(jù)答案,數(shù)據(jù)點(diǎn)向下移動(dòng)到樹上;
- gini:節(jié)點(diǎn)的 gini 指數(shù)。當(dāng)我們向下移動(dòng)時(shí),平均加權(quán)的gini指數(shù)會(huì)減小;
- samples:節(jié)點(diǎn)中的觀察數(shù);
- value:每個(gè)類中的樣本數(shù)。例如,頂部節(jié)點(diǎn)在類 0 中有2個(gè)樣本,在類1中有4個(gè)樣本;
- class:節(jié)點(diǎn)中點(diǎn)的多數(shù)分類。在葉子節(jié)點(diǎn)中,這就是對(duì)節(jié)點(diǎn)中所有樣本的預(yù)測(cè)了;
對(duì)于葉子節(jié)點(diǎn)的理解肯定沒有問題,因?yàn)檫@些是最終預(yù)測(cè)的地方。要對(duì)新的數(shù)據(jù)點(diǎn)進(jìn)行分類,我們只需要將數(shù)據(jù)點(diǎn)進(jìn)行下移就行了,使用點(diǎn)的特征來回答問題,直到到達(dá)類是預(yù)測(cè)的葉節(jié)點(diǎn)。
為了以不同的方式查看樹,我們可以在原始數(shù)據(jù)上繪制決策樹構(gòu)建的分割。
每個(gè)拆分就是一條線,根據(jù)特征值將數(shù)據(jù)點(diǎn)劃分為節(jié)點(diǎn)。對(duì)于這個(gè)簡(jiǎn)單的問題,我們并沒有對(duì)最大深度進(jìn)行限制,分區(qū)將節(jié)點(diǎn)中的每個(gè)點(diǎn)僅放置在同一類的點(diǎn)上。稍后我們將看到訓(xùn)練數(shù)據(jù)的這種完美劃分可能不是我們想要的,因?yàn)樗赡軐?dǎo)致過度擬合。
gini 不純度
在這一節(jié)上,我們會(huì)深入了解基尼不純度的概念。節(jié)點(diǎn)的Gini不純度是指節(jié)點(diǎn)中隨機(jī)選擇的樣本如果被標(biāo)記錯(cuò)誤的概率,其實(shí)也就是節(jié)點(diǎn)中樣本的分布。例如,在頂部節(jié)點(diǎn)中,Gini不純度為 44.4% 。我們使用以下等式得出這個(gè)值:
節(jié)點(diǎn) n 的Gini不純度是 1 減去每個(gè)類概率平方的總和。這個(gè)聽起來可能會(huì)有點(diǎn)困惑,那么我們就以根節(jié)點(diǎn)來做一個(gè)例子:
在每個(gè)節(jié)點(diǎn)處,決策樹在特征中進(jìn)行拆解,從而最大限度的減少GIni不純度。
然后,它以貪婪的遞歸過程重復(fù)此拆分過程,直到達(dá)到最大深度,或者每個(gè)節(jié)點(diǎn)僅包含來自一個(gè)類的樣本。 每層樹木的加權(quán)總Gini不純度必須減少。 在樹的第二層,總加權(quán)基尼雜質(zhì)值為0.333:
最終,最后一層的加權(quán)總 Gini 不純度變?yōu)?0 ,意味著每個(gè)節(jié)點(diǎn)都是純粹的,并且從該節(jié)點(diǎn)隨機(jī)選擇的點(diǎn)不會(huì)被錯(cuò)誤分類。雖然這似乎是非常好的,但這意味著該模型可能過度擬合了,因?yàn)楣?jié)點(diǎn)僅適用訓(xùn)練數(shù)據(jù)構(gòu)建。
過度擬合:為什么森林比一棵樹好
您可能會(huì)想問為什么不使用一個(gè)決策樹?它似乎是完美的分類器,因?yàn)樗鼪]有犯任何錯(cuò)誤!沒有分錯(cuò)一個(gè)數(shù)據(jù)。但要記住的關(guān)鍵點(diǎn)是這個(gè)樹是在訓(xùn)練數(shù)據(jù)上沒有犯錯(cuò)。機(jī)器學(xué)習(xí)模型的目標(biāo)是很好地概括它以前從未見過的新數(shù)據(jù)。
當(dāng)我們具有非常靈活的模型(模型具有高容量)時(shí),就會(huì)發(fā)生過度擬合,因?yàn)樗旧暇褪峭ㄟ^緊密擬合訓(xùn)練數(shù)據(jù)來生成模型的。問題是模型不僅學(xué)習(xí)訓(xùn)練數(shù)據(jù)中的實(shí)際關(guān)系,還學(xué)習(xí)任何存在的噪聲。靈活模型具有高方差,因?yàn)閷W(xué)習(xí)參數(shù)(例如決策樹的結(jié)構(gòu))將隨著訓(xùn)練數(shù)據(jù)而顯著變化。
另一方面,一個(gè)不靈活的模型被認(rèn)為具有很高的偏差,因?yàn)樗鼘?duì)訓(xùn)練數(shù)據(jù)做出了假設(shè)(它偏向于預(yù)先設(shè)想的數(shù)據(jù)思想。)例如,線性分類器假設(shè)數(shù)據(jù)是線性的,不具備適應(yīng)非線性關(guān)系的靈活性。一個(gè)不靈活的模型可能無法適應(yīng)訓(xùn)練數(shù)據(jù),在這兩種情況下,高方差和高偏差,那么模型無法很好地推廣到新數(shù)據(jù)。
當(dāng)我們不限制最大深度時(shí),決策樹非常容易過度擬合的原因是因?yàn)樗哂袩o限的靈活性,這意味著它可以保持無限增長(zhǎng),直到它一個(gè)葉節(jié)點(diǎn)只有一個(gè)類別,完美地對(duì)所有這些進(jìn)行分類。 如果您返回到?jīng)Q策樹的圖像并將最大深度限制為2(僅進(jìn)行一次拆分),則分類不再100%正確。 我們減少了決策樹的方差,但代價(jià)是增加了偏差。
我們?yōu)榱讼拗茦涞纳疃龋覀兛梢詫⒃S多決策樹組合成稱為隨機(jī)森林的單個(gè)集合模型。那么就會(huì)減少方差(好)并增加偏差(差)。
隨機(jī)森林
隨機(jī)森林是由許多決策樹組成的模型。 這個(gè)模型不是簡(jiǎn)單地平均樹的預(yù)測(cè)(我們可以稱之為“森林”),而是使用兩個(gè)關(guān)鍵概念,使其名稱為隨機(jī):
- 在構(gòu)建樹時(shí)對(duì)訓(xùn)練數(shù)據(jù)點(diǎn)進(jìn)行隨機(jī)抽樣
- 分割節(jié)點(diǎn)時(shí)考慮的隨機(jī)特征子集
隨機(jī)抽樣訓(xùn)練數(shù)據(jù)
在訓(xùn)練時(shí),隨機(jī)森林中的每棵樹都會(huì)從數(shù)據(jù)點(diǎn)的隨機(jī)樣本中學(xué)習(xí)。 樣本用替換采樣,稱為自舉,這意味著一些樣本將在一棵樹中多次使用。 這個(gè)想法是通過對(duì)不同樣本的每棵樹進(jìn)行訓(xùn)練,盡管每棵樹相對(duì)于一組特定的訓(xùn)練數(shù)據(jù)可能具有很大的差異,但總體而言,整個(gè)森林的方差較小,但不會(huì)以增加偏差為代價(jià)。
在測(cè)試時(shí),通過平均每個(gè)決策樹的預(yù)測(cè)來進(jìn)行預(yù)測(cè)。 這種在不同的數(shù)據(jù)子集上訓(xùn)練每個(gè)學(xué)習(xí)器然后對(duì)預(yù)測(cè)求平均值的過程稱為bagging,是 bootstrap aggregating的縮寫。
用于拆分節(jié)點(diǎn)的隨機(jī)特征子集
隨機(jī)林中的另一個(gè)主要概念是,僅考慮所有特征的子集來分割每個(gè)決策樹中的每個(gè)節(jié)點(diǎn)。 通常,這被設(shè)置為sqrt(n_features)用于分類,這意味著如果有16個(gè)特征,則在每個(gè)樹中的每個(gè)節(jié)點(diǎn)處,將僅考慮4個(gè)隨機(jī)特征來分割節(jié)點(diǎn)。 (隨機(jī)林也可以考慮每個(gè)節(jié)點(diǎn)的所有特征,在回歸中比較常用。這些選項(xiàng)可以在Scikit-Learn Random Forest實(shí)現(xiàn)中控制)。
如果你能理解一個(gè)決策樹,bagging的想法,以及隨機(jī)的特征子集,那么你對(duì)隨機(jī)森林的工作方式有了很好的理解:
隨機(jī)森林將數(shù)百或數(shù)千個(gè)決策樹組合在一起,在略微不同的訓(xùn)練集上訓(xùn)練每個(gè)決策樹,考慮到有限數(shù)量的特征,在每棵樹中分割節(jié)點(diǎn)。 隨機(jī)森林的最終預(yù)測(cè)是通過平均每個(gè)樹的預(yù)測(cè)來做出的。
要理解為什么隨機(jī)森林優(yōu)于單一決策樹時(shí),請(qǐng)想象以下情況:您必須決定特斯拉股票是否會(huì)上漲,并且您可以訪問十幾位對(duì)該公司沒有先驗(yàn)知識(shí)的分析師。每個(gè)分析師都有較低的偏差,因?yàn)樗麄儧]有任何假設(shè),并且可以從新聞報(bào)道的數(shù)據(jù)集中學(xué)習(xí)。
這似乎是一個(gè)理想的情況,但問題是報(bào)告除了真實(shí)信號(hào)之外可能還包含噪聲。因?yàn)榉治鰩熗耆鶕?jù)數(shù)據(jù)做出預(yù)測(cè) - 他們具有很高的靈活性 - 他們可能會(huì)被無關(guān)的信息所左右。分析師可能會(huì)從同一數(shù)據(jù)集中得出不同的預(yù)測(cè)。此外,如果給出不同的報(bào)告訓(xùn)練集,每個(gè)單獨(dú)的分析師都有很大的差異,并會(huì)提出截然不同的預(yù)測(cè)。
解決方案是不依賴于任何一個(gè)人,而是匯集每個(gè)分析師的投票分析結(jié)果。此外,與隨機(jī)森林一樣,允許每個(gè)分析人員僅訪問報(bào)告的一部分,并希望通過采樣取消噪聲信息的影響。在現(xiàn)實(shí)生活中,我們依賴于多種來源(絕不相信亞馬遜的獨(dú)立評(píng)論),因此,決策樹不僅直觀,而且在隨機(jī)森林中將它們組合在一起的想法也是如此。
隨機(jī)森林實(shí)踐
接下來,我們將使用 Scikit-Learn 在 Python 中構(gòu)建一個(gè)隨機(jī)森林。 我們將使用分為訓(xùn)練和測(cè)試集的真實(shí)數(shù)據(jù)集,而不是學(xué)習(xí)一個(gè)簡(jiǎn)單的問題。 我們使用測(cè)試集作為模型對(duì)新數(shù)據(jù)的執(zhí)行方式的估計(jì),這也可以讓我們確定模型過度擬合的程度。
數(shù)據(jù)集
我們要解決的問題是二元分類任務(wù),其目標(biāo)是預(yù)測(cè)個(gè)人的健康狀況。 這些特征是個(gè)人的社會(huì)經(jīng)濟(jì)和生活方式特征,健康狀況不佳的標(biāo)簽為0,健康狀況為1。 該數(shù)據(jù)集由疾病控制和預(yù)防中心收集,可在此處獲取(https://www.kaggle.com/cdc/behavioral-risk-factor-surveillance-system)。
通常,數(shù)據(jù)科學(xué)項(xiàng)目的80%的時(shí)間用于清理,探索和制作數(shù)據(jù)中的特征。 但是,對(duì)于本文,我們將直接使用建模。 這是一個(gè)不平衡的分類問題,因此準(zhǔn)確性不是一個(gè)合適的指標(biāo)。 相反,我們利用 ROC AUC進(jìn)行評(píng)估,從0(最差)到1(最佳)的度量,隨機(jī)猜測(cè)得分為0.5。 我們還可以繪制ROC曲線以評(píng)估模型。
接下來我們開始學(xué)習(xí)隨機(jī)森林代碼,如下:
from
sklearn
.
ensemble
import
RandomForestClassifier
# Create the model with 100 trees
model
=
RandomForestClassifier
(
n_estimators
=
100
,
bootstrap
=
True
,
max_features
=
'sqrt'
)
# Fit on training data
model
.
fit
(
train
,
train_labels
)
在訓(xùn)練幾分鐘后,模型準(zhǔn)備好對(duì)測(cè)試數(shù)據(jù)進(jìn)行如下預(yù)測(cè):
# Actual class predictions
rf_predictions
=
model
.
predict
(
test
)
# Probabilities for each class
rf_probs
=
model
.
predict_proba
(
test
)
[
:
,
1
]
我們進(jìn)行類別預(yù)測(cè)以及預(yù)測(cè)概率(predict_proba)來計(jì)算ROC AUC。 一旦我們有了測(cè)試預(yù)測(cè),我們就可以計(jì)算出ROC AUC。
from sklearn.metrics import roc_auc_score
# Calculate roc auc
roc_value = roc_auc_score(test_labels, rf_probs)
結(jié)果
隨機(jī)森林的最終測(cè)試ROC AUC為0.87,而具有無限最大深度的單一決策樹的最終測(cè)試ROC AUC為0.67。 如果我們查看訓(xùn)練分?jǐn)?shù),兩個(gè)模型都達(dá)到了1.0 的 ROC AUC,這也是預(yù)期的,因?yàn)槲覀兘o這些模型提供了訓(xùn)練標(biāo)簽,并沒有限制每棵樹的最大深度。
雖然隨機(jī)森林過度擬合(在訓(xùn)練數(shù)據(jù)上比在測(cè)試數(shù)據(jù)上做得更好),但它能夠比單一決策樹更好地推廣測(cè)試數(shù)據(jù)。 隨機(jī)森林具有較低的方差(良好),同時(shí)保持決策樹的相同低偏差(也很好)。
我們還可以繪制單個(gè)決策樹(頂部)和隨機(jī)森林(底部)的ROC曲線。 頂部和左側(cè)的曲線是更好的模型:
上面是決策樹的 ROC
上圖是隨機(jī)森林的 ROC
我們可以采用模型的另一個(gè)評(píng)估方法,混淆矩陣:
這顯示模型在左上角和右下角正確的預(yù)測(cè)以及模型在左下角和右上角錯(cuò)誤的預(yù)測(cè)。 我們可以使用這些圖來診斷我們的模型,并確定它是否做得足夠好以投入生產(chǎn)。
特征重要性
隨機(jī)林中的特征重要性表示在該特征在拆分的所有節(jié)點(diǎn)上Gini不純度減少的總和。 我們可以使用這些來嘗試找出隨機(jī)森林認(rèn)為最重要的預(yù)測(cè)特征。 可以從訓(xùn)練好的隨機(jī)森林中提取重要的特征,并將其放入Pandas數(shù)據(jù)框中,如下所示:
import
pandas
as
pd
# Extract feature importances
fi
=
pd
.
DataFrame
(
{
'feature'
:
list
(
train
.
columns
)
,
'importance'
:
model
.
feature_importances_
}
)
.
\
sort_values
(
'importance'
,
ascending
=
False
)
# Display
fi
.
head
(
)
feature importance
DIFFWALK
0.036200
QLACTLM2
0.030694
EMPLOY1
0.024156
DIFFALON
0.022699
USEEQUIP
0.016922
特征重要性告訴我們哪些特征在類之間最具辨別力,可以讓我們深入了解問題。 例如,這里指示患者是否行走困難的 DIFFWALK 特征是最具有意義的特征。
通過構(gòu)建最重要的特征分析,我們可以通過刪除低重要性的特征,使用高重要性的特征來進(jìn)行學(xué)習(xí)。
可視化隨機(jī)森林
最后,我們可以在森林中可視化單個(gè)決策樹。 這次,我們必須限制樹的深度,否則它將太大而無法轉(zhuǎn)換為圖像。 為了得到下圖,我將最大深度限制為6.這仍然導(dǎo)致我們無法完全解析大樹! 然而,鑒于我們深入研究決策樹,我們掌握了模型的工作原理。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
