欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

(四)Python中隨機森林的實現(xiàn)與解釋

系統(tǒng) 1671 0

作者:chen_h
微信號 & QQ:862251340
微信公眾號:coderpai


(一)機器學(xué)習(xí)中的集成學(xué)習(xí)入門

(二)bagging 方法

(三)使用Python進(jìn)行交易的隨機森林算法

(四)Python中隨機森林的實現(xiàn)與解釋


通過從單個決策樹構(gòu)建來使用和理解隨機森林

幸運的是,對于像Scikit-Learn這樣的庫,現(xiàn)在很容易在Python中實現(xiàn)數(shù)百種機器學(xué)習(xí)算法。這很容易,我們通常不需要任何關(guān)于模型是如何工作的知識來使用它。雖然不需要知道所有細(xì)節(jié),但了解機器學(xué)習(xí)模型如何工作仍然是非常有幫助的。這使我們可以在模型表現(xiàn)不佳時進(jìn)行修改參數(shù),或解釋模型如何做出決策,如果我們想要說服別人相信我們的模型,這是至關(guān)重要的。

在本文中,我們將介紹如何在Python中構(gòu)建和使用Random Forest。除了查看代碼之外,我們還將嘗試了解此模型的工作原理。因為由許多決策樹組成的隨機森林,我們首先要了解單個決策樹如何對一個簡單的問題進(jìn)行分類。然后,我們將努力使用隨機森林來解決現(xiàn)實世界的數(shù)據(jù)科學(xué)問題。

理解決策樹

決策樹是隨機森林的構(gòu)建塊,是一種非常直觀的模型。我們可以將決策樹視為一系列對我們數(shù)據(jù)進(jìn)行是/否分類的問題。這是一個可解釋的模型,因為它可以像我們?nèi)祟愐粯舆M(jìn)行分類:在我們做出決定之前(在理想世界中),我們會詢問有關(guān)可用數(shù)據(jù)的一系列查詢,或者一系列特征。

在CART算法中,通過確定特征(稱為節(jié)點的分裂)來構(gòu)建決策樹,這些特征在經(jīng)過節(jié)點的時候通過Gini指數(shù)來進(jìn)行判斷。我們稍后會詳細(xì)討論關(guān)于Gini 指數(shù)的細(xì)節(jié),但首先,讓我們構(gòu)建一個決策樹,以便我們能夠在高層次上理解它。

關(guān)于簡單問題的決策樹

我們將從一個非常簡單的二分類問題開始,如下所示:

(四)Python中隨機森林的實現(xiàn)與解釋_第1張圖片

我們的數(shù)據(jù)只有特征,x1 和 x2,圖中有 6 個數(shù)據(jù)樣本,分為兩個標(biāo)簽 0 和 1。雖然這個問題非常簡單,但它是線性不可分的,這意味著我們不能通過數(shù)據(jù)繪制一條直線來對數(shù)據(jù)進(jìn)行分類。

然而,我們可以繪制一系列直線,將數(shù)據(jù)點分成多個框,我們稱之為節(jié)點。實際上,這就是決策樹在訓(xùn)練期間所進(jì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ù)上面對我們的模型進(jìn)行測試。PS:因為我們沒有測試數(shù)據(jù)。

            
              
                print
              
              
                (
              
              f
              
                'Model Accuracy: {tree.score(X, y)}'
              
              
                )
              
              

Model Accuracy
              
                :
              
              
                1.0
              
            
          

我們看到它獲得了100%的準(zhǔn)確性,這也正是我們所期望的,因為我們給了它訓(xùn)練的數(shù)據(jù),并且沒有限制樹的深度。 事實證明,完全學(xué)習(xí)訓(xùn)練數(shù)據(jù)的能力可能是決策樹的缺點,因為它可能會導(dǎo)致過度擬合,這一點我們稍后會討論。

可視化決策樹

那么,當(dāng)我們訓(xùn)練決策樹時,實際上是在發(fā)生一些什么變化呢?我們找到一種可視化方法來理解決策樹,我們可以通過 scikit-learn 中的函數(shù),如下:

(四)Python中隨機森林的實現(xiàn)與解釋_第2張圖片

除了葉子節(jié)點,所有節(jié)點都有五個部分:

  • 基于特征的查詢,每個分裂節(jié)點都會給出真或者假的答案,根據(jù)答案,數(shù)據(jù)點向下移動到樹上;
  • gini:節(jié)點的 gini 指數(shù)。當(dāng)我們向下移動時,平均加權(quán)的gini指數(shù)會減小;
  • samples:節(jié)點中的觀察數(shù);
  • value:每個類中的樣本數(shù)。例如,頂部節(jié)點在類 0 中有2個樣本,在類1中有4個樣本;
  • class:節(jié)點中點的多數(shù)分類。在葉子節(jié)點中,這就是對節(jié)點中所有樣本的預(yù)測了;

對于葉子節(jié)點的理解肯定沒有問題,因為這些是最終預(yù)測的地方。要對新的數(shù)據(jù)點進(jìn)行分類,我們只需要將數(shù)據(jù)點進(jìn)行下移就行了,使用點的特征來回答問題,直到到達(dá)類是預(yù)測的葉節(jié)點。

為了以不同的方式查看樹,我們可以在原始數(shù)據(jù)上繪制決策樹構(gòu)建的分割。

(四)Python中隨機森林的實現(xiàn)與解釋_第3張圖片

每個拆分就是一條線,根據(jù)特征值將數(shù)據(jù)點劃分為節(jié)點。對于這個簡單的問題,我們并沒有對最大深度進(jìn)行限制,分區(qū)將節(jié)點中的每個點僅放置在同一類的點上。稍后我們將看到訓(xùn)練數(shù)據(jù)的這種完美劃分可能不是我們想要的,因為它可能導(dǎo)致過度擬合。

gini 不純度

在這一節(jié)上,我們會深入了解基尼不純度的概念。節(jié)點的Gini不純度是指節(jié)點中隨機選擇的樣本如果被標(biāo)記錯誤的概率,其實也就是節(jié)點中樣本的分布。例如,在頂部節(jié)點中,Gini不純度為 44.4% 。我們使用以下等式得出這個值:

(四)Python中隨機森林的實現(xiàn)與解釋_第4張圖片

節(jié)點 n 的Gini不純度是 1 減去每個類概率平方的總和。這個聽起來可能會有點困惑,那么我們就以根節(jié)點來做一個例子:

在這里插入圖片描述

在每個節(jié)點處,決策樹在特征中進(jìn)行拆解,從而最大限度的減少GIni不純度。

然后,它以貪婪的遞歸過程重復(fù)此拆分過程,直到達(dá)到最大深度,或者每個節(jié)點僅包含來自一個類的樣本。 每層樹木的加權(quán)總Gini不純度必須減少。 在樹的第二層,總加權(quán)基尼雜質(zhì)值為0.333:

在這里插入圖片描述

最終,最后一層的加權(quán)總 Gini 不純度變?yōu)?0 ,意味著每個節(jié)點都是純粹的,并且從該節(jié)點隨機選擇的點不會被錯誤分類。雖然這似乎是非常好的,但這意味著該模型可能過度擬合了,因為節(jié)點僅適用訓(xùn)練數(shù)據(jù)構(gòu)建。

過度擬合:為什么森林比一棵樹好

您可能會想問為什么不使用一個決策樹?它似乎是完美的分類器,因為它沒有犯任何錯誤!沒有分錯一個數(shù)據(jù)。但要記住的關(guān)鍵點是這個樹是在訓(xùn)練數(shù)據(jù)上沒有犯錯。機器學(xué)習(xí)模型的目標(biāo)是很好地概括它以前從未見過的新數(shù)據(jù)。

當(dāng)我們具有非常靈活的模型(模型具有高容量)時,就會發(fā)生過度擬合,因為它基本上就是通過緊密擬合訓(xùn)練數(shù)據(jù)來生成模型的。問題是模型不僅學(xué)習(xí)訓(xùn)練數(shù)據(jù)中的實際關(guān)系,還學(xué)習(xí)任何存在的噪聲。靈活模型具有高方差,因為學(xué)習(xí)參數(shù)(例如決策樹的結(jié)構(gòu))將隨著訓(xùn)練數(shù)據(jù)而顯著變化。

另一方面,一個不靈活的模型被認(rèn)為具有很高的偏差,因為它對訓(xùn)練數(shù)據(jù)做出了假設(shè)(它偏向于預(yù)先設(shè)想的數(shù)據(jù)思想。)例如,線性分類器假設(shè)數(shù)據(jù)是線性的,不具備適應(yīng)非線性關(guān)系的靈活性。一個不靈活的模型可能無法適應(yīng)訓(xùn)練數(shù)據(jù),在這兩種情況下,高方差和高偏差,那么模型無法很好地推廣到新數(shù)據(jù)。

當(dāng)我們不限制最大深度時,決策樹非常容易過度擬合的原因是因為它具有無限的靈活性,這意味著它可以保持無限增長,直到它一個葉節(jié)點只有一個類別,完美地對所有這些進(jìn)行分類。 如果您返回到?jīng)Q策樹的圖像并將最大深度限制為2(僅進(jìn)行一次拆分),則分類不再100%正確。 我們減少了決策樹的方差,但代價是增加了偏差。

我們?yōu)榱讼拗茦涞纳疃龋覀兛梢詫⒃S多決策樹組合成稱為隨機森林的單個集合模型。那么就會減少方差(好)并增加偏差(差)。

隨機森林

隨機森林是由許多決策樹組成的模型。 這個模型不是簡單地平均樹的預(yù)測(我們可以稱之為“森林”),而是使用兩個關(guān)鍵概念,使其名稱為隨機:

  • 在構(gòu)建樹時對訓(xùn)練數(shù)據(jù)點進(jìn)行隨機抽樣
  • 分割節(jié)點時考慮的隨機特征子集
隨機抽樣訓(xùn)練數(shù)據(jù)

在訓(xùn)練時,隨機森林中的每棵樹都會從數(shù)據(jù)點的隨機樣本中學(xué)習(xí)。 樣本用替換采樣,稱為自舉,這意味著一些樣本將在一棵樹中多次使用。 這個想法是通過對不同樣本的每棵樹進(jìn)行訓(xùn)練,盡管每棵樹相對于一組特定的訓(xùn)練數(shù)據(jù)可能具有很大的差異,但總體而言,整個森林的方差較小,但不會以增加偏差為代價。

在測試時,通過平均每個決策樹的預(yù)測來進(jìn)行預(yù)測。 這種在不同的數(shù)據(jù)子集上訓(xùn)練每個學(xué)習(xí)器然后對預(yù)測求平均值的過程稱為bagging,是 bootstrap aggregating的縮寫。

用于拆分節(jié)點的隨機特征子集

隨機林中的另一個主要概念是,僅考慮所有特征的子集來分割每個決策樹中的每個節(jié)點。 通常,這被設(shè)置為sqrt(n_features)用于分類,這意味著如果有16個特征,則在每個樹中的每個節(jié)點處,將僅考慮4個隨機特征來分割節(jié)點。 (隨機林也可以考慮每個節(jié)點的所有特征,在回歸中比較常用。這些選項可以在Scikit-Learn Random Forest實現(xiàn)中控制)。

如果你能理解一個決策樹,bagging的想法,以及隨機的特征子集,那么你對隨機森林的工作方式有了很好的理解:

隨機森林將數(shù)百或數(shù)千個決策樹組合在一起,在略微不同的訓(xùn)練集上訓(xùn)練每個決策樹,考慮到有限數(shù)量的特征,在每棵樹中分割節(jié)點。 隨機森林的最終預(yù)測是通過平均每個樹的預(yù)測來做出的。

要理解為什么隨機森林優(yōu)于單一決策樹時,請想象以下情況:您必須決定特斯拉股票是否會上漲,并且您可以訪問十幾位對該公司沒有先驗知識的分析師。每個分析師都有較低的偏差,因為他們沒有任何假設(shè),并且可以從新聞報道的數(shù)據(jù)集中學(xué)習(xí)。

這似乎是一個理想的情況,但問題是報告除了真實信號之外可能還包含噪聲。因為分析師完全根據(jù)數(shù)據(jù)做出預(yù)測 - 他們具有很高的靈活性 - 他們可能會被無關(guān)的信息所左右。分析師可能會從同一數(shù)據(jù)集中得出不同的預(yù)測。此外,如果給出不同的報告訓(xùn)練集,每個單獨的分析師都有很大的差異,并會提出截然不同的預(yù)測。

解決方案是不依賴于任何一個人,而是匯集每個分析師的投票分析結(jié)果。此外,與隨機森林一樣,允許每個分析人員僅訪問報告的一部分,并希望通過采樣取消噪聲信息的影響。在現(xiàn)實生活中,我們依賴于多種來源(絕不相信亞馬遜的獨立評論),因此,決策樹不僅直觀,而且在隨機森林中將它們組合在一起的想法也是如此。

隨機森林實踐

接下來,我們將使用 Scikit-Learn 在 Python 中構(gòu)建一個隨機森林。 我們將使用分為訓(xùn)練和測試集的真實數(shù)據(jù)集,而不是學(xué)習(xí)一個簡單的問題。 我們使用測試集作為模型對新數(shù)據(jù)的執(zhí)行方式的估計,這也可以讓我們確定模型過度擬合的程度。

數(shù)據(jù)集

我們要解決的問題是二元分類任務(wù),其目標(biāo)是預(yù)測個人的健康狀況。 這些特征是個人的社會經(jīng)濟和生活方式特征,健康狀況不佳的標(biāo)簽為0,健康狀況為1。 該數(shù)據(jù)集由疾病控制和預(yù)防中心收集,可在此處獲取(https://www.kaggle.com/cdc/behavioral-risk-factor-surveillance-system)。

(四)Python中隨機森林的實現(xiàn)與解釋_第5張圖片

通常,數(shù)據(jù)科學(xué)項目的80%的時間用于清理,探索和制作數(shù)據(jù)中的特征。 但是,對于本文,我們將直接使用建模。 這是一個不平衡的分類問題,因此準(zhǔn)確性不是一個合適的指標(biāo)。 相反,我們利用 ROC AUC進(jìn)行評估,從0(最差)到1(最佳)的度量,隨機猜測得分為0.5。 我們還可以繪制ROC曲線以評估模型。

接下來我們開始學(xué)習(xí)隨機森林代碼,如下:

            
              
                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)備好對測試數(shù)據(jù)進(jìn)行如下預(yù)測:

            
              
                # Actual class predictions
              
              
rf_predictions 
              
                =
              
               model
              
                .
              
              predict
              
                (
              
              test
              
                )
              
              
                # Probabilities for each class
              
              
rf_probs 
              
                =
              
               model
              
                .
              
              predict_proba
              
                (
              
              test
              
                )
              
              
                [
              
              
                :
              
              
                ,
              
              
                1
              
              
                ]
              
            
          

我們進(jìn)行類別預(yù)測以及預(yù)測概率(predict_proba)來計算ROC AUC。 一旦我們有了測試預(yù)測,我們就可以計算出ROC AUC。

            
              from sklearn.metrics import roc_auc_score

# Calculate roc auc
roc_value = roc_auc_score(test_labels, rf_probs)

            
          

結(jié)果

隨機森林的最終測試ROC AUC為0.87,而具有無限最大深度的單一決策樹的最終測試ROC AUC為0.67。 如果我們查看訓(xùn)練分?jǐn)?shù),兩個模型都達(dá)到了1.0 的 ROC AUC,這也是預(yù)期的,因為我們給這些模型提供了訓(xùn)練標(biāo)簽,并沒有限制每棵樹的最大深度。

雖然隨機森林過度擬合(在訓(xùn)練數(shù)據(jù)上比在測試數(shù)據(jù)上做得更好),但它能夠比單一決策樹更好地推廣測試數(shù)據(jù)。 隨機森林具有較低的方差(良好),同時保持決策樹的相同低偏差(也很好)。

我們還可以繪制單個決策樹(頂部)和隨機森林(底部)的ROC曲線。 頂部和左側(cè)的曲線是更好的模型:

(四)Python中隨機森林的實現(xiàn)與解釋_第6張圖片

上面是決策樹的 ROC

(四)Python中隨機森林的實現(xiàn)與解釋_第7張圖片

上圖是隨機森林的 ROC

我們可以采用模型的另一個評估方法,混淆矩陣:

(四)Python中隨機森林的實現(xiàn)與解釋_第8張圖片

這顯示模型在左上角和右下角正確的預(yù)測以及模型在左下角和右上角錯誤的預(yù)測。 我們可以使用這些圖來診斷我們的模型,并確定它是否做得足夠好以投入生產(chǎn)。

特征重要性

隨機林中的特征重要性表示在該特征在拆分的所有節(jié)點上Gini不純度減少的總和。 我們可以使用這些來嘗試找出隨機森林認(rèn)為最重要的預(yù)測特征。 可以從訓(xùn)練好的隨機森林中提取重要的特征,并將其放入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í)。

可視化隨機森林

最后,我們可以在森林中可視化單個決策樹。 這次,我們必須限制樹的深度,否則它將太大而無法轉(zhuǎn)換為圖像。 為了得到下圖,我將最大深度限制為6.這仍然導(dǎo)致我們無法完全解析大樹! 然而,鑒于我們深入研究決策樹,我們掌握了模型的工作原理。

(四)Python中隨機森林的實現(xiàn)與解釋_第9張圖片


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 在线观看视频亚洲 | 亚洲人6666成人观看 | 亚洲免费视频一区 | 国产黄色一级毛片 | 欧美在线观看一区 | 韩国男女无遮挡高清性视频 | 天干夜天天夜天干天 | 黄色免费av| 伦理午夜电影免费观看 | 欧美无乱码久久久免费午夜一区 | 国产成人免费 | 欧美精品18videosex性俄罗斯 | 日本高清无遮挡 | 4hc44四虎www在线影院男同 | 午夜激情视频在线观看 | 成人做爰 | 一级毛片免费电影 | a高清免费毛片久久 | 九九九久久久久久久爱 | 在线中文一区 | 在线视频中文字幕乱人伦 | 日韩av在线不卡 | 欧美专区在线播放 | 免费黄色片网站 | 天干天夜啪天天碰 | 日本久久综合网 | 天天操一操| 色综合久久综合欧美综合 | 免费国产一区二区三区 | 国产精品久久久久无码人妻 | 大吊一区二区 | 久久精品草 | 欧美精品黄页在线观看大全 | 男女配种超爽免费视频 | 久久成人国产精品 | 精品国产一区在线观看 | 成人毛片观看 | 色综合五月色婷婷开心 | 伊人精品国产 | 久久亚洲欧美日韩精品专区 | 亚洲精品乱码8久久久久久日本 |