當前位置:首頁 » 操作系統 » stacking集成演算法

stacking集成演算法

發布時間: 2023-05-17 22:25:34

Ⅰ 機器學習故事匯-集成演算法

機器學習故事匯-集成演算法
【咱們的目標】系列演算法講解旨在用最簡單易懂的故事情節幫助大家掌握晦澀無趣的機器學習,適合對數學很頭疼的同學們,小板凳走起!

今天咱們就來討論一下傳說中的集成演算法,之前咱們講的演算法都是單兵作戰的(單個模型得到結果),但是回過頭來想一想現在是不是幹啥都講究個合作共贏,所以咱們的模型也是如此。單個演算法確實勢單力薄,假如我們可以把它們組合起來會不會得到更好的效果呢?(演算法們要揭竿起義了,今亡亦死舉大計亦死。。。編不下去了)
在集成演算法中,有三個核心模塊,咱們就一一道來,先來概述一下:
Bagging集成:並行的構造多個基礎模型(隨機森林),每一個基礎模型都各自為政,然後把它們的結果求一個平均就好!
Boosting集成:串列的構造多個基礎模型(Xgboost),每一個基礎模型都要嚴格篩選,在前面的基礎上加進來的新模型後,它們整體的效果起碼得沒加這個新的基礎模型前要強吧!
Stacking集成:多種演算法群毆一起上!選擇多個機器學習演算法做同一件事,最後把它們的結果合並就OK啦!

先來看看第一個傢伙Bagging模型,其典型代表就是隨機森立了,簡單來說就是並行的訓練一堆樹模型,然後求其平均結果,在這里我們要討論一個問題,就是每個樹模型該怎麼構造呢?如果不加入任何限制,那每個樹模型不都差不多嘛,那最後的平均結果又會有什麼變化呢?所以為了結果的泛化能力更強,必須要使得每個樹模型表現出多樣性,也就是盡可能的讓每個樹模型都不一樣!

這該怎麼做呢?什麼影響模型呢?數據絕對是最大的影響因子,這里的森林很好理解了,就是把樹放在一起,那麼隨機又是什麼呢?為了保證每個樹的多樣性,在構建模型時,我們做了二重隨機(我自創的詞。。。)第一重就是對樣本的選擇,每次隨機的有放回的選擇部分樣本作為一棵樹的訓練樣本(比如選擇百分之八十作為訓練集)。第二重還要考慮特徵了,既然樣本數據能隨機,那麼特徵也是一樣的,每棵樹選擇的特徵也是不一樣的隨機選擇部分特徵來建模!

隨機的意義非常重要,這是隨機森林的精神所在!

隨機森林作為灰常經典的機器學習演算法,優勢自然少不了,當我們建模完之後,還可以對特徵進行重要性評估,其實簡單來說一個特徵的重要與否可以取決於建模的時候如果把這個特徵換成噪音特徵再去看看結果的錯誤率是不是顯著上升,如果顯著上升,那麼這個特徵自然很重要,如果沒變化,那這個特徵就沒啥用了,因為它和噪音沒啥區別!

隨機森林中樹的個數是不是越多越好呢?理論上越多的樹效果應該會更好吧,但是實際上我們把樹的個數增加到一定的時候比如100棵了已經,再往上增加樹的個數結果也只會發生小范圍的浮動,基本也就穩定了!

Boosting集成中典型的代表就屬Xgboost啦,一個大殺器,這個演算法由於涉及的數學比較多,咱們後續來一個專題去講Xgboost,我們先來看看簡單些的Adaboost。

Adaboost演算法概述來說就是,首選我有一個非常簡單的模型,比如深度為1的樹模型,然後我去預測一下結果,在結果中我發現某些樣本預測錯了,這個時候第二個簡單的樹模型就來了,還是同樣的任務只不過數據的權重發生了變換,一開始所有的數據都是相同的權重,但是第二次會把前面那次預測錯的數據的權重增大,相對來說預測對的數據的權重就會減小。說白了就是讓後面的模型更注重我之前哪些數據分錯了,這回好能分對它!(好比我們在考試前都會復習之前做錯的題)

最後來看一下堆疊模型吧,社會我Stacking,人狠話不多,不需要多解釋,做了一堆演算法,然後把它們的結果堆疊起來,每個演算法都有自己的預測結果,這些結果組合在一起那不相當於一個新的特徵嘛,再把它們結果組成的特徵去做一個分類或者回歸,又得到了一個唯一的結果。

Ⅱ 模型集成(Ensemble)

集成學習的基本思想是「將多個模型組合在一起通常可以產生更強大的模型」,它通過構建多個個體學習器,再用某種策略將其結合起來完成學習任務。

為了將多個個體學習器集成起來,獲得比單一個體學習器更好的性能, 個體學習器的性能不能太差,而且個體學習器間要有差異。如何產生有差異的模型,是集成學習的關鍵
根據集成的模型可分為同質集成和異質集成。同質集成學習中的模型是同類型的,如都是神經網路或者都是決策樹;異質集成學習中的模型包含不同類型的模型,如可以包含神經網路和決策樹。

Boosting先基於初始訓練集得到一個弱學習器,再根據當前弱學習器的表現對訓練樣本分布進行調整,使得較難的樣本(即弱學習器學的不好的樣本)得到更多關注,基於調整後的樣本訓練新的弱學習器。如此重復進行,直到訓練了所需數目的弱學習器,將他們加權集成,得到最終模型。
Boosting更關注模型偏差,Adaboost是該類演算法的典型代表。

個體學習器無強依賴關系的集成演算法,對訓練集進行采樣,虛凱得到若干個不同的子集,由每個數據子集訓練得到不同的個體學習器。為保證每個弱學習器都可被較好的訓練,可採用有交疊的數據子集以避免無交疊數據子集過小。

給定數據集,從數據集D中隨機取出樣本a放到子集A中,再友頌將a放回D,這樣在下次取樣時仍有可能被取到。如此重復采樣,得到T個大小為m的子集,分別在每個子集上訓練得到T個弱學習器。
Bagging通常用投票法或平均法來得到最終輸出。

隨機森林是Bagging的變體,它以決策樹為基學習器來構建模型集成好譽鄭,在決策樹訓練過程中引入了隨機集成。

上述提到的主要是同質集成,Stacking可實現異質集成,可參考 常用的模型集成方法介紹:bagging、boosting、stacking

Ⅲ 集成演算法

集成學習包括Bagging方法和Boosting方法,下面詳細分析這兩種方法。

下面是決策樹與這些演算法框架進行結合所得到的新的演算法:
1) Bagging + 決策樹 = 隨機森林
2)AdaBoost + 決策樹 = 提升樹
3)Gradient Boosting + 決策樹 = GBDT

Bagging法假設訓練樣本集服從均勻分布,即1/N。

(1) 從訓練樣本集中 隨機可放回抽樣(Bootstrapping )N次 ,得到與訓練集相同大小的訓練集,重復抽樣K次, 得到K個訓練集 。
(2) 每個訓練集得到一個最優模型, K個訓練集得到K個最優廳彎模型。
(3) 分類問題:對K個模型採用 投票的方式得到分類結果 ;回歸問題:對K個模型的值 求平均得到分 類結果。

每一個樣本數據是有權重的,每一個學習器是有先後順序的。在PAC(概率近似正確)的學習框架下,一定可以將弱分類器組裝成一個強分類器。

(1)每一輪如何改變訓練數據的權值和概率分布?

(2)通過什麼方式來組合弱學習器?

其尺氏中,學習器性能越好,對應的權值也越大。樣本權值1初始化為1/N,即初始樣本集服從均勻分布,後面隨著前一個學習器的結果更新樣本權值。

集成學習得到多個學習器後,結合策略得到最終的結果。通常用到最多的是平均法,投票法和學習法。

適用范圍:

規模大的集成,學習的權重較多 加權平均法易導致過擬合

個體學習器性能相差較大時宜使用加權平均法,相近用簡單平均法

絕對多數投票法:某標記 超過半數 ,也就是我們常說的要票過半數,否則就當會拒絕預測;

相對多數投票法:預測為得票 最多 的標記,若同時有多個標記的票最高,則從中隨機選取一個,也就是所謂的「少數服從多數」。

加權投票法:提供了預測結果,與加權平均法類似。

對於學習法,代表方法是stacking,當使用stacking的結合策略時, 我們不是對弱學習器的結果做簡單的邏輯處理,而是再加上一層學習器,也就是說,我們 將訓練集弱學習器的學習結果作為輸入, 將訓練集的輸出作為輸出,重新訓練一個學習器來得到最終結果。
在這種情況下,我們將弱學習器稱為初級學習器,將用於結合的學習器稱為次級學習器。對於測試集,我們首先用初級學習器預測一次,得到次級學習器的輸入樣本,再用次級學習器預測一次,得到最終的預測結果。

1)訓練樣本集
Bagging:訓練集是有放回抽樣,從原始集中選出的K組訓練集是相互獨立的。
Boosting:每一次迭代的訓練集不變。
2)訓練樣本權扮困悶重
Bagging:每個訓練樣本的權重相等,即1/N。
Boosting:根據學習器的錯誤率不斷調整樣例的權值,錯誤率越大,權值越大。
3)預測函數的權重:
Bagging:K組學習器的權重相等,即1/K。
Boosting:學習器性能好的分配較大的權重,學習器性能差的分配較小的權重。
4)並行計算
Bagging:K組學習器模型可以並行生成。
Boosting:K組學習器只能順序生成,因為後一個模型的樣本權值需要前一個學習器模型的結果。

Bagging和Boosting方法都是把若干個學習器整合為一個學習器的方法,Bagging方法可以降低模型的方差,Boosting方法可以降低模型的偏差,在實際工作中,因情況需要選擇集成方法。

Ⅳ 集成模型

1.1概述

    集成學習(ensemble learning)本身不是一個單獨的機器學習演算法,而是通過在數據上構建多個模型,集成所有模型的建模結果。集成演算法會考慮多個評估器的建模結果,匯總之後得到一個綜合的結果,以此來獲得比單個模型更好的回歸模鎮或分類表現。

    多個模型集成的模型叫集成評估器,組成集成評估器的每個模型都叫基評估器(base estimator),通常有三類集成演算法:裝袋法(Bagging),提升法(Boosting)和stacking.

    裝袋法的核心兆源思想是構建多個相互獨立的評估器,然後對其預測進行平均或是多數表決原則來決定集成評估器的結果,裝袋法的代表模型就是隨機森林旦猜粗。

    提升法中,基評估器是相關的,是按順序一一構建的,其核心思想是結合弱評估器的力量一次次對難以評估的樣本進行預測,從而構成一個強評估器,提升法的代表模型:Adaboost和梯度提升樹。

    stacking,就是當初始訓練數據學出若干個基學習器後,將這幾個學習器的預測結果作為新的訓練集,來學習一個新的學習器。

Ⅳ Stacking演算法

大枯慶家都是只關注stacking的操作是什麼,叢敗前雖然這很重要,但是卻沒有說明白為何有效。這一直是困惑我的點,我想通過論文搞清這些東西。貌似沒找到,找到再貼。
  我們將假設訓練數據:train.csv有1000行;測試數據:test.csv有200行。然後按照下圖所示訓練:

最後,我想貼一些現成的stacking的框架的鏈接:
https://github.com/liyi19950329/stacking
https://github.com/liyi19950329/vecstack
https://github.com/liyi19950329/mlens
https://github.com/rasbt/mlxtend
https://github.com/mpearmain/gestalt
https://github.com/reiinakano/xcessiv
https://github.com/kaz-Anova/StackNet
這些框架都集成好了,學會使用就能實現stacking,不過我還是滲清建議看看源碼
如果源碼看不下去,可以看看kaggle的教程: https://www.kaggle.com/arthurtok/introction-to-ensembling-stacking-in-python

Blending:用不相交的數據訓練不同的 Base Model,將它們的輸出取(加權)平均。實現簡單,但對訓練數據利用少了。

Ⅵ 隨機森林原理與Sklearn參數詳解

目錄

1、集成演算法概述

2 、 Sklearn中RandomForestClassifier重要參數詳解

3、Sklearn中RandomForestRegressor重要參數詳解

4、附錄

5、總結

1、集成演算法概述: 集成演算法的目標是多個評估器建模的結果,匯總後得到一個綜合結果,以此來獲取比單個模型更好的回歸或分類表現。多個模型集成成為的模型叫集成評估器,單個模型叫基評估器。通常說有三種集成演算法:裝袋法(Bagging)、提升法(Boosting)和stacking。裝袋法的基本思想是構建多個相互獨立的基評估器,然後通過預測平均或多數表決原則來決定集成評估器的結果。裝袋法的典型代表就是隨機森林(RandomForest)。

2、RandomForestClassifier重要參數:

n_estimators: integer, optional (default=100), 森林中基評估器的數量,即樹的數量。n_estimators越大模型效果越好,但達到一定程度時,精確性趨於穩定。n_estimators越大模型的計算量越大,需要的內存也越大。

random_state: int, RandomState instance or None, optional (default=None), 控制樹的生成模式。在DecisionTreeClassifier中random_state生成隨機的一棵樹,這里的參數控制的是隨機生成一片森林模式。 用袋裝法集成時,基分類器應當是相互獨立的,是不同的。

bootstrap: boolean, optional (default=True), 要讓基分類器盡量都不一樣,一種方式是使用不同的訓練數據集來訓練不同的樹。而裝袋法採用的是有放回採樣法,來確保每棵樹的隨機性。booststrap就是用來控制抽樣技術的參數。

oob_score: bool (default=False), 是否啟用袋外數據做測試。有放回採樣策略中,自助數據集平均包含63%的原始數據被抽中(每個樣本從原始數據抽中到自助集的概率為: =63%左右),也就是說袋外數據(out of bag data  簡稱oob數據)大致佔37%。在使用隨機森林時,我們可以不劃分測試和訓練集,只要開啟袋外數據支持,就可以用袋外數據測試我們的模型。然後這並不絕對,如果n足夠大,則沒有數據落入袋外,自然無法使用oob數據來測試模型了。如果需要用袋外數據做測試,則設置該參數為True,實例化並訓練模型完成後,可以通過oob_score_來查看真是落入袋外的數據量。

重要屬性與介面:

除了estimators_和oob_socre_這兩個屬性外,作為樹模型也有feature_importances這個屬性。

常用的介面主要有:apply,fit,predict和score。除此之外,還需要注意隨機森林的predict_proba介面,該介面返回預測數據的被分到每一類標簽的概率。如果是二分類,則predict_proba返回的數值大於0.5時被劃分為1,否則為0。(在sklearn的隨機森林中predict_proba返回每棵樹的概率,然後取平均概率,從而根據概率值是否大於0.5劃分為1,否則為0,來決定樣本分類的)

Bagging要求基分類器相互獨立,袋裝法另一個必要條件是:基分類器的誤差率要小於0.5,即准確率大於0.5,集成效果才好於基分類器。所以使用隨機森林前,先要觀察各基分類器是否都有至少50%的預測正確率。

3、RandomForestRegressor重要參數:

criterion:string, optional (default=」mse」)

1、輸入「mse」使用均方誤差mean squared err(MSE),父節點和子節點之間的均方誤差的差額將被用來作為特徵選擇的標准,這種方法通過使用葉子節點的均值來最小化L2損失。

2、輸入「friedman_mse」使用費爾德曼均方誤差,這種指標使用費爾德曼針對潛在分枝中的問題改進後的均方誤差。

3、輸入「mae」使用絕對平均誤差MAE(mean absolute error),這種指標使用葉節點的中值來最小化L1損失。



其中N是樣本數量,i是每一個數據樣本,fi是模型回歸出的數值,yi是樣本點i實際的數值標簽。因此MSE的本質是回歸值與真實值的差異。 在回歸樹中,MSE不僅是最優的分枝指標,也是最常用的衡量回歸樹回歸質量的指標。

回歸樹介面:

score: 返回的是R平方,並不是MSE。R平方定義如下:

, , ,

其中u是殘差平方和(MSE*N),v是總平方和,N是樣本數量,i是每個樣本,fi是模型回歸出的值,yi是樣本點i的實際數值標簽。y帽是真實數值標簽的平均數。

R2可以為正也可以為負,當殘差平方和遠遠大於模型總平方和時,模型非常糟糕,R2為負;但MSE永遠為正。但Sklearn當中使用均方誤差作為評判標准時,卻是計算「負均方誤差」(neg_mean_squared_error)以負數表示。其實就是MSE前加了個負號。

4、附錄

參數列表

屬性列表

介面列表

5、總結: 本文詳細介紹了集成學習中Bagging的典型代表隨機森林的工作原理,同時對sklearn中RandomForestClassifier和RandomForestRegressor核心參數、屬性、介面進行了介紹。

Ⅶ stacking集成演算法能有幾層

不限,但是很多情況下,兩層的效果是相對比較好的,多層反而不好。在不同的數據集上多做實驗試一下。

Ⅷ 隨機森林演算法梳理

全稱Bootstrap Aggregation的集成演算法。每個基學習器都會對訓練集進行 有放回抽樣得到子訓練集 ,比較著名的采樣法為 0.632 自助法。每個基學習器 基於不同子訓練集進行訓練,並綜合所有基學習器的預測值得到最終的預測結果 。 Bagging 常用的綜合方法是投票法,票數最多伍鍵物的類別為預測類別 。

Boosting 訓練過程為階梯狀, 基模型的訓練是有順序的,每個基模型都會在前一個基模型學習的基礎上進行學習,最終綜合所有基模型的預測值產生最終的預測結果,用的比較多的綜合方式為加權法 。

Stacking 是 先用全部數據訓練好基模型,然後每個基模型都對每個訓練樣本進行的預測,其預腔液測值將作為訓練樣本的特徵值,最終會得到新的訓練樣本,然後基於新的訓練樣本進行訓練得到模型,然後得到最終預測結果。

那麼,為什麼集成學習會好於單個學習器呢?原因可能有三:

訓練樣本可能無法選擇出最好的單個學習器,由於沒法選擇出最好的學習器,所以乾脆結合起來一起用;
假設能找到最好的學習器,但由於演算法運算的限制無法找到最優解,只能找到次優解,採用集成學習可以彌補演算法的不足;
可能演算法無法得到最優解,而集成學習能夠得到近似解。比如說最優解是一條對角線,而單個決策樹得到的結果只能是平行於坐標軸的,但是集成學習可以去擬合這條對角線。

不是所有集成學習框架中的基模型都是弱模型。Bagging 和 Stacking 中的基模型為強模型(偏差低,方差高),而Boosting 中的基模型為弱模型(偏差高,方差低)。

對於 Bagging 來說,每個基模型的權重等於 1/m 且期望近似相等,故我們可以得到:

通過上式我們可以看到:

在此我們知道了為什麼 Bagging 中的基模型一定要為強模型,如果 Bagging 使用弱模型則會導致整體模型的偏差提高,而准確度降低。Random Forest 是經典的基於 Bagging 框架的模型,並在此基礎上通過引入特徵采樣和樣本采樣來降低基模型間的相關性,在公式中顯著降低方差公式中的第二項,略微升高第一項,從而使得整體降低模型整體方差。

對於 Boosting 來說,由於基模型共用同一套訓練集,所以基模型間具有強相關性,故模型間的相關系數近似等於 1,針對 Boosting 化簡公式為:

通過觀察整體方差的表達式我們容易發現:

基於 Boosting 框架的 Gradient Boosting Decision Tree 模型中基模型也為樹模型,同 Random Forrest,我們也可以對特徵進行隨機抽樣來使基模型間的相關性降低,從而達到減少方差的效果。

️那麼這里有一個小小的疑問,Bagging 和 Boosting 到底用的是什麼模型呢?

隨機森林就是通過集成學習的思想將多棵樹集成的一種演算法,它的基本單元是決策樹,而它的本質屬於集成學習方法。隨機森林的名稱中有兩個關鍵詞,一個是「隨機」,一個就是「森林」。「森林」我們很好理解,一棵叫做樹,那麼成百上千棵就可以叫做森林了,這也是隨機森林的主要思想--集成思想的體現。然而,bagging的代價是不用單棵決策樹來做預測,具體哪個變數起到重要作用變得未知,所以bagging改進了預測准確率但亮喊損失了解釋性。

「森林」容易理解,就是由很多「樹」組成,那麼「隨機」體現在什麼方面呢?

(1)訓練集隨機的選取:如果訓練集大小為N,對於每棵樹而言,隨機且有放回地從訓練集中的抽取N個訓練樣本(這種采樣方式稱為bootstrap sample方法),作為該樹的訓練集;這樣保證了每顆樹的訓練集都不同,從而構建的樹也不同

(2)特徵的隨機選取:從M個特徵中選取m個特徵,這樣可以避免某個特徵與分類結果具有強相關性,如果所有特徵都選取,那麼所有的樹都會很相似,那樣就不夠「隨機」了

另外還有一點,隨機森林法構建樹的時候不需要做額外的剪枝操作。個人理解:因為前兩個「隨機」操作,以及多顆樹的建立,已經避免了過擬合現象,所以這種情況下,我們只需要讓每棵樹在它自己的領域內做到最好就可以了。

隨機森林演算法的預測性能與兩個因素有關:

(1)森林中任意兩棵樹的相關性,相關性越強,則總體性能越容易差

(2)森林中每棵樹的預測性能,每棵樹越好,則總體性能越好

其實可以理解為要求「好而不同」。然而特徵數m的選擇越大,則相關性與個體性能都比較好,特徵數m選擇越小,則相關性與個體性能都更小,所以m的選擇影響著隨機森林的預測性能。

在包括N個樣本的數據集中,採用有放回的抽樣方式選擇N個樣本,構成中間數據集,然後在這個中間數據集的所有特徵中隨機選擇幾個特徵,作為最終的數據集。以上述方式構建多個數據集;一般回歸問題選用全部特徵,分類問題選擇全部特徵個數的平方根個特徵

利用CART為每個數據集建立一個完全分裂、沒有經過剪枝的決策樹,最終得到多棵CART決策樹;

根據得到的每一個決策樹的結果來計算新數據的預測值。

由於RF在實際應用中的良好特性,基於RF,有很多變種演算法,應用也很廣泛,不光可以用於分類回歸,還可以用於特徵轉換,異常點檢測等。下面對於這些RF家族的演算法中有代表性的做一個總結。

extra trees是RF的一個變種, 原理幾乎和RF一模一樣,有區別有:

對於每個決策樹的訓練集,RF採用的是 隨機采樣bootstrap來選擇采樣集作為每個決策樹的訓練集 ,而extra trees一般不採用隨機采樣,即 每個決策樹採用原始訓練集。

在選定了劃分特徵後,RF的決策樹會基於基尼系數,均方差之類的原則,選擇一個最優的特徵值劃分點,這和傳統的決策樹相同。但是extra trees比較的激進,他會隨機的選擇一個特徵值來劃分決策樹。

從第二點可以看出, 由於隨機選擇了特徵值的劃分點位,而不是最優點位,這樣會導致生成的決策樹的規模一般會大於RF所生成的決策樹。 也就是說,模型的方差相對於RF進一步減少,但是偏倚相對於RF進一步增大。在某些時候,extra trees的泛化能力比RF更好。

Totally Random Trees Embedding(以下簡稱 TRTE)是一種 非監督學習的數據轉化方法。它將低維的數據集映射到高維 ,從而讓映射到高維的數據更好的運用於分類回歸模型。我們知道,在支持向量機中運用了核方法來將低維的數據集映射到高維,此處TRTE提供了另外一種方法。

TRTE在數據轉化的過程也使用了類似於RF的方法,建立T個決策樹來擬合數據。當決策樹建立完畢以後,數據集里的每個數據在T個決策樹中葉子節點的位置也定下來了。比如我們有3顆決策樹,每個決策樹有5個葉子節點,某個數據特徵x劃分到第一個決策樹的第2個葉子節點,第二個決策樹的第3個葉子節點,第三個決策樹的第5個葉子節點。則x映射後的特徵編碼為(0,1,0,0,0, 0,0,1,0,0, 0,0,0,0,1), 有15維的高維特徵。這里特徵維度之間加上空格是為了強調三顆決策樹各自的子編碼。

映射到高維特徵後,可以繼續使用監督學習的各種分類回歸演算法了。

Isolation Forest(以下簡稱IForest)是一種 異常點檢測的方法。 它也使用了類似於RF的方法來檢測異常點。

對於在T個決策樹的樣本集,IForest也會對訓練集進行隨機采樣,但是采樣個數不需要和RF一樣,對於RF,需要采樣到采樣集樣本個數等於訓練集個數。但是IForest不需要采樣這么多,一般來說,采樣個數要遠遠小於訓練集個數?為什麼呢?因為我們的目的是異常點檢測,只需要部分的樣本我們一般就可以將異常點區別出來了。

對於每一個決策樹的建立, IForest採用隨機選擇一個劃分特徵,對劃分特徵隨機選擇一個劃分閾值。這點也和RF不同。

另外,IForest一般會選擇一個比較小的最大決策樹深度max_depth,原因同樣本採集,用少量的異常點檢測一般不需要這么大規模的決策樹。

對於異常點的判斷,則是將測試樣本點x擬合到T顆決策樹。計算在每顆決策樹上該樣本的葉子節點的深度ht(x),從而可以計算出平均高度h(x)。此時我們用下面的公式計算樣本點x的異常概率:

其中,m為樣本個數。c(m)的表達式為:

s(x,m)的取值范圍是[0,1],取值越接近於1,則是異常點的概率也越大。

RF的主要優點有:
訓練可以 高度並行化 ,對於大數據時代的大樣本訓練速度有優勢。

由於可以隨機選擇決策樹節點劃分特徵,這樣在 樣本特徵維度很高的時候,仍然能高效的訓練模型。

在訓練後,可以給出各個特徵對於輸出的重要性

由於採用了隨機采樣,訓練出的模型的 方差小,泛化能力強。

相對於Boosting系列的Adaboost和GBDT, RF實現比較簡單

對部分特徵缺失不敏感。

缺點:
在某些噪音比較大的樣本集上, RF模型容易陷入過擬合。

取值劃分比較多的特徵容易對RF的決策產生更大的影響,從而影響擬合的模型的效果。

數據維度相對低(幾十維),同時對准確性有較高要求時。
因為不需要很多參數調整就可以達到不錯的效果,基本上不知道用什麼方法的時候都可以先試一下隨機森林。

sklearn.ensemble.RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)

Ⅸ GBDT —— 梯度提升決策樹

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹演算法,該演算法由多棵決策樹組成,所有樹的結論累加起來做最終答案。它在被提出之初就和SVM一起被認為是泛化能力較強的演算法。
GBDT中的樹是回歸樹(不是分類樹),GBDT用來做回歸預測,調整後也可以用於分類。
GBDT主要由三個概念組成:Regression Decistion Tree(即DT),Gradient Boosting(即GB),Shrinkage (演算法的一個重要演進分枝,目前大部分源碼都按該版本實現)。搞定這三個概念後就能明白GBDT是如何工作的。

提起決策樹(DT, Decision Tree) 絕大部分人首先想到的就是C4.5分類決策樹。但如果一開始就把GBDT中的樹想成分類樹,那就錯了。千萬不要以為GBDT是很多棵分類樹。決策樹分為兩大類,回歸樹和分類樹。前者用於預測實數值,如明天的溫度、用戶的年齡、網頁的相關程度;後者用於分類標簽值,如晴天/陰天/霧/雨、用戶性別、網頁是否是垃圾頁面。這里要強調游談做的是,前者的結果加減是有意義的,如10歲+5歲-3歲=12歲,後者則無意義,如男+男+女=到底是男是女?GBDT的核心在於累加所有樹的結果作為最終結果,就像前面對年齡的累加(-3是加負3),而分類樹的結果顯然是沒辦法累加的,所以 GBDT中的樹都是回歸樹,不是分類樹 ,這點對理解GBDT相當重要(盡管GBDT調整後也可用於分類但不代表GBDT的樹是分類樹)。

回歸樹總體流程類似於分類樹,區別在於,回歸樹的每一個節點都會得一個預測值,以年齡為例,該預測值等於屬於這個節點的所有人年齡的平均值。分枝時窮舉每一個feature的每個閾值找最好的分割點,但神衡衡量最好的標准不再是最大熵,而是最小化平方誤差。也就是被預測出錯的人數越多,錯侍瞎的越離譜,平方誤差就越大,通過最小化平方誤差能夠找到最可靠的分枝依據。分枝直到每個葉子節點上人的年齡都唯一或者達到預設的終止條件(如葉子個數上限), 若最終葉子節點上人的年齡不唯一,則以該節點上所有人的平均年齡做為該葉子節點的預測年齡。

回歸樹演算法如下圖(截圖來自《統計學習方法》5.5.1 CART生成):

梯度提升(Gradient boosting)是一種用於回歸、分類和排序任務的機器學習技術 [1] ,屬於Boosting演算法族的一部分。Boosting是一族可將弱學習器提升為強學習器的演算法,屬於集成學習(ensemble learning)的范疇。Boosting方法基於這樣一種思想:對於一個復雜任務來說,將多個專家的判斷進行適當的綜合所得出的判斷,要比其中任何一個專家單獨的判斷要好。通俗地說,就是「三個臭皮匠頂個諸葛亮」的道理。梯度提升同其他boosting方法一樣,通過集成(ensemble)多個弱學習器,通常是決策樹,來構建最終的預測模型。

Boosting、bagging和stacking是集成學習的三種主要方法。不同於bagging方法,boosting方法通過分步迭代(stage-wise)的方式來構建模型,在迭代的每一步構建的弱學習器都是為了彌補已有模型的不足。Boosting族演算法的著名代表是AdaBoost,AdaBoost演算法通過給已有模型預測錯誤的樣本更高的權重,使得先前的學習器做錯的訓練樣本在後續受到更多的關注的方式來彌補已有模型的不足。與AdaBoost演算法不同,梯度提升方法在迭代的每一步構建一個能夠沿著梯度最陡的方向降低損失(steepest-descent)的學習器來彌補已有模型的不足。經典的AdaBoost演算法只能處理採用指數損失函數的二分類學習任務 [2] ,而梯度提升方法通過設置不同的可微損失函數可以處理各類學習任務(多分類、回歸、Ranking等),應用范圍大大擴展。另一方面,AdaBoost演算法對異常點(outlier)比較敏感,而梯度提升演算法通過引入bagging思想、加入正則項等方法能夠有效地抵禦訓練數據中的噪音,具有更好的健壯性。這也是為什麼梯度提升演算法(尤其是採用決策樹作為弱學習器的GBDT演算法)如此流行的原因,

提升樹是迭代多棵回歸樹來共同決策。當採用平方誤差損失函數時,每一棵回歸樹學習的是之前所有樹的結論和殘差,擬合得到一個當前的殘差回歸樹,殘差的意義如公式:殘差 = 真實值 - 預測值 。提升樹即是整個迭代過程生成的回歸樹的累加。 GBDT的核心就在於,每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是一個加預測值後能得真實值的累加量。

提升樹利用 加法模型和前向分步演算法 實現學習的優化過程。當損失函數時平方損失和指數損失函數時,每一步的優化很簡單,如平方損失函數學習殘差回歸樹。

提升方法其實是一個比adaboost概念更大的演算法,因為adaboost可以表示為boosting的前向分布演算法(Forward stagewise additive modeling)的一個特例,boosting最終可以表示為:

其中的w是權重,Φ是弱分類器(回歸器)的集合,其實就是一個加法模型(即基函數的線性組合)

前向分布演算法 實際上是一個貪心的演算法,也就是在每一步求解弱分類器Φ(m)和其參數w(m)的時候不去修改之前已經求好的分類器和參數:

OK,這也就是提升方法(之前向分布演算法)的大致結構了,可以看到其中存在變數的部分其實就是極小化損失函數 這關鍵的一步了,如何選擇損失函數決定了演算法的最終效果(名字)……這一步你可以看出演算法的「趨勢」,以後再單獨把「趨勢」拿出來說吧,因為我感覺理解演算法的關鍵之一就是理解演算法公式的「趨勢」

不同的損失函數和極小化損失函數方法決定了boosting的最終效果,我們現在來說幾個常見的boosting:

廣義上來講,所謂的Gradient Boosting 其實就是在更新的時候選擇梯度下降的方向來保證最後的結果最好,一些書上講的「殘差」 方法其實就是L2Boosting吧,因為它所定義的殘差其實就是L2Boosting的Derivative,接下來我們著重講一下弱回歸器(不知道叫啥了,自己編的)是決策樹的情況,也就是GBDT。

GBDT演算法可以看成是由K棵樹組成的加法模型:

解這一優化問題,可以用前向分布演算法(forward stagewise algorithm)。因為學習的是加法模型,如果能夠從前往後,每一步只學習一個基函數及其系數(結構),逐步逼近優化目標函數,那麼就可以簡化復雜度。這一學習過程稱之為Boosting。具體地,我們從一個常量預測開始,每次學習一個新的函數,過程如下:

舉個例子,參考自一篇博客, 該博客舉出的例子較直觀地展現出多棵決策樹線性求和過程以及殘差的意義。
還是年齡預測,簡單起見訓練集只有4個人,A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業生和工作兩年的員工。如果是用一棵傳統的回歸決策樹來訓練,會得到如下圖1所示結果:

現在我們使用GBDT來做這件事,由於數據太少,我們限定葉子節點做多有兩個,即每棵樹都只有一個分枝,並且限定只學兩棵樹。我們會得到如下圖2所示結果:

在第一棵樹分枝和圖1一樣,由於A,B年齡較為相近,C,D年齡較為相近,他們被分為兩撥,每撥用平均年齡作為預測值。此時計算殘差 (殘差的意思就是: A的預測值 + A的殘差 = A的實際值) ,所以A的殘差就是16-15=1(注意,A的預測值是指前面所有樹累加的和,這里前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作為A的預測值)。進而得到A,B,C,D的殘差分別為-1,1,-1,1。然後我們拿殘差替代A,B,C,D的原值,到第二棵樹去學習,如果我們的預測值和它們的殘差相等,則只需把第二棵樹的結論累加到第一棵樹上就能得到真實年齡了。這里的數據顯然是我可以做的,第二棵樹只有兩個值1和-1,直接分成兩個節點。此時所有人的殘差都是0,即每個人都得到了真實的預測值。

換句話說,現在A,B,C,D的預測值都和真實年齡一致了。Perfect!:
A: 14歲高一學生,購物較少,經常問學長問題;預測年齡A = 15 – 1 = 14
B: 16歲高三學生;購物較少,經常被學弟問問題;預測年齡B = 15 + 1 = 16
C: 24歲應屆畢業生;購物較多,經常問師兄問題;預測年齡C = 25 – 1 = 24
D: 26歲工作兩年員工;購物較多,經常被師弟問問題;預測年齡D = 25 + 1 = 26

那麼哪裡體現了Gradient呢?其實回到第一棵樹結束時想一想,無論此時的cost function是什麼,是均方差還是均差,只要它以誤差作為衡量標准,殘差向量(-1, 1, -1, 1)都是它的全局最優方向,這就是Gradient。

講到這里我們已經把GBDT最核心的概念、運算過程講完了!沒錯就是這么簡單。

該例子很直觀的能看到,預測值等於所有樹值得累加,如A的預測值 = 樹1左節點 值 15 + 樹2左節點 -1 = 14。
因此,給定當前模型 fm-1(x),只需要簡單的擬合當前模型的殘差。現將回歸問題的提升樹演算法敘述如下:

答案是過擬合。過擬合是指為了讓訓練集精度更高,學到了很多」僅在訓練集上成立的規律「,導致換一個數據集當前規律就不適用了。其實只要允許一棵樹的葉子節點足夠多,訓練集總是能訓練到100%准確率的(大不了最後一個葉子上只有一個instance)。在訓練精度和實際精度(或測試精度)之間,後者才是我們想要真正得到的。
我們發現圖1為了達到100%精度使用了3個feature(上網時長、時段、網購金額),其中分枝「上網時長>1.1h」 很顯然已經過擬合了,這個數據集上A,B也許恰好A每天上網1.09h, B上網1.05小時,但用上網時間是不是>1.1小時來判斷所有人的年齡很顯然是有悖常識的;
相對來說圖2的boosting雖然用了兩棵樹 ,但其實只用了2個feature就搞定了,後一個feature是問答比例,顯然圖2的依據更靠譜。(當然,這里是LZ故意做的數據,所以才能靠譜得如此狗血。實際中靠譜不靠譜總是相對的) Boosting的最大好處在於,每一步的殘差計算其實變相地增大了分錯instance的權重,而已經分對的instance則都趨向於0。這樣後面的樹就能越來越專注那些前面被分錯的instance。就像我們做互聯網,總是先解決60%用戶的需求湊合著,再解決35%用戶的需求,最後才關注那5%人的需求,這樣就能逐漸把產品做好,因為不同類型用戶需求可能完全不同,需要分別獨立分析。如果反過來做,或者剛上來就一定要做到盡善盡美,往往最終會竹籃打水一場空。

Shrinkage(縮減)的思想認為,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易避免過擬合。即它不完全信任每一個棵殘差樹,它認為每棵樹只學到了真理的一小部分,累加的時候只累加一小部分,通過多學幾棵樹彌補不足。用方程來看更清晰,即
沒用Shrinkage時:(yi表示第i棵樹上y的預測值, y(1~i)表示前i棵樹y的綜合預測值)
y(i+1) = 殘差(y1~yi), 其中: 殘差(y1~yi) = y真實值 - y(1 ~ i)
y(1 ~ i) = SUM(y1, ..., yi)
Shrinkage不改變第一個方程,只把第二個方程改為:
y(1 ~ i) = y(1 ~ i-1) + step * yi

即Shrinkage仍然以殘差作為學習目標,但對於殘差學習出來的結果,只累加一小部分(step 殘差)逐步逼近目標,step一般都比較小,如0.01~0.001(注意該step非gradient的step),導致各個樹的殘差是漸變的而不是陡變的。直覺上這也很好理解,不像直接用殘差一步修復誤差,而是只修復一點點,其實就是把大步切成了很多小步。 本質上,Shrinkage為每棵樹設置了一個weight,累加時要乘以這個weight,但和Gradient並沒有關系 *。 這個weight就是step。就像Adaboost一樣,Shrinkage能減少過擬合發生也是經驗證明的,目前還沒有看到從理論的證明。

該版本GBDT幾乎可用於所有回歸問題(線性/非線性),相對logistic regression僅能用於線性回歸,GBDT的適用面非常廣。亦可用於二分類問題(設定閾值,大於閾值為正例,反之為負例)。

參考資料:
http://blog.csdn.net/w28971023/article/details/8240756
http://blog.csdn.net/dark_scope/article/details/24863289
https://www.jianshu.com/p/005a4e6ac775
https://www.zybuluo.com/yxd/note/611571

Ⅹ Multi-Sample Dropout

1. 模型結構

orginal dropout  : 對單個樣本,進行單次drop out。

2. 思想

    stacking方法中的子模型 。事實證明,用 多個子模型 做模型改則空 融合 可以提高模型的性能。

    訓練時,對原始數據進行變換,創建出多個分身。分身可能是帶噪音,可能是不完整(此方法)。從而提高泛化能力。

3. 實現方法

    訓練階段,每次dropout首先會隨機的選取50%(這個比例可以自己設置)的神經元,其他50%被丟棄。

    通過多次的dropout,從特徵中選擇了不同的 特徵子集 進行訓練,相當於重采樣。

    再通過共享的全連接層和loss層。

    loss:每條樣本,多個分身,得到的多個loss的平均值最小。

4. 優點

    加快收斂,性能提升。dropout只使用在最後的幾層,而全連接層的訓練時間較快。因此,對比更大的 mini-batch,雖然可以達到相同的效果,但是實際上會增加計算的耗時。

    實現簡單:在 dropout 層後復制部分訓練網路,並在這些復制的全連接層之盯中間共享權重就可以了,無需新運算符。

5. 發散

    傳統的機器學習演算法,如排序中常用的樹模型。stack思想下,得到了不同的樹。如果就用一棵樹呢??泛化能力能變強嗎?

    Stacking是通過 一個 元分類器或者元回歸器來 整合多個 分類模型或回歸模型的集成學習技術。基礎模型利用整個訓練集做訓練,元模型將基礎模型的特徵作為特徵進行訓練核瞎。(N->1) 。基礎模型通常包含不同的學習演算法,因此stacking通常是異質集成。

6. 缺點

    1)模型的設計,存在訓練和預測 不一致問題 。訓練時,Dropout 往(某些層的)輸入加上了乘性雜訊。而預測時,理論上,應該是對同一個輸入多次傳入模型中(模型不關閉Dropout),然後把多次的預測結果平均值作為最終的預測結果。實際上,預測的時候用的是關閉Dropout的單模型,兩者未必等價,這就是Dropout的訓練預測不一致問題。

    2)損失函數的設計,只有交叉熵。如果只有交叉熵這一項,模型的訓練結果是「不同的Dropout下,目標類的得分都大於非目標類的得分」。

鏈接:https://kexue.fm/archives/8496

熱點內容
存摺每天可以輸錯多少次密碼 發布:2025-05-14 23:22:06 瀏覽:907
安卓手機怎麼找微信隱藏對話 發布:2025-05-14 23:07:47 瀏覽:336
怎麼查看泰拉伺服器ip 發布:2025-05-14 23:03:29 瀏覽:72
c語言學生成績查詢系統 發布:2025-05-14 22:58:30 瀏覽:4
怎麼進別人的伺服器 發布:2025-05-14 22:45:55 瀏覽:772
用編程寫音樂 發布:2025-05-14 22:45:08 瀏覽:782
如何識別電腦的網路配置 發布:2025-05-14 22:38:46 瀏覽:847
pipforpython3 發布:2025-05-14 22:38:34 瀏覽:350
如何把迷你世界的伺服器搞崩 發布:2025-05-14 22:37:15 瀏覽:94
如何讓安卓卡死機 發布:2025-05-14 22:36:27 瀏覽:634