參考資料(要是對於本文的理解不夠透徹,必須將如下博客認知閱讀):面試
1. https://zhuanlan.zhihu.com/p/86263786算法
2.https://blog.csdn.net/liuy9803/article/details/80598652bootstrap
3.http://www.javashuo.com/article/p-tozojgjb-gh.html框架
4.GBDT算法原理以及實例理解(!!)dom
5.Adaboost算法原理分析和實例+代碼(簡明易懂)(!!)機器學習
1.集成學習概念函數
2.Bagging性能
3.Random Forest(RF)學習
4.Boosting測試
5.Adaboost
6.Boosting tree(提高樹)
7.GBDT
8.從誤差和方差的角度理解集成學習
1. 集成學習(Ensemble learning)是使用一系列學習器進行學習,並使用某種規則把各個學習結果進行整合,從而得到比單個學習器顯著優越的泛化性能。它不是一種單獨的機器學習算法,而更像是一種優化策略,其目的在於使得集成模型達到減少方差(bagging)、減少誤差(boosting)或改進預測(stacking)的效果。
2. 根據集成學習的概念以及通常結構,咱們能都發現集成學習的兩個核心問題:
2. 集成學習的通常結構是,先產生一組個體學習器,再用某種結合策略將它們結合起來。
3. 集成學習的成功在於保證個體學習器的多樣性(好而不一樣),且集成不穩定的算法也可以獲得一個比較明顯的性能提高。
4. 根據個體學習器的生成方式,目前的集成學習方法大體能夠分爲兩類:(也有人把集成學習方法分爲3類[Bagging、Boosting、stacking],stacking其實能夠當作是一種集成學習方法,也能夠當作是一種特殊的結合策略)
5. 集成學習優點在於:
自助採樣法:對 m 個樣本的訓練集,有放回的採樣 m 次;此時,樣本在 m 次採樣中始終沒被採樣的機率約爲 0.368,即每次自助採樣只能採樣到所有樣本的 63% 左右。
(1)給定包含m個樣本的數據集,隨機取出一個樣本放入採樣集中,再把它放回到原始數據集中,重複m次,獲得含m個樣本的採樣集。
(2)進行一樣的操做進行T次獲得T個每一個含m個樣本的採樣集,基於每一個採樣集訓練一個基學習器。
(3)再將基學習器進行組合,通常使用多數投票或求均值的方式來統計最終的分類結果。
(1)Boosting是一簇可將弱學習器提高爲強學習器的算法,其基於串行策略:基學習器之間存在依賴關係,新的學習器須要根據上一個學習器生成,每次學習都會使用所有訓練樣本。
(2)其工做機制爲:先從初始訓練集訓練出一個基學習器,再根據基學習器的表現對樣本分佈進行調整,使得先前的基學習器作錯的訓練樣本在後續收到更多的關注,而後基於調整後的樣本分佈來訓練下一個基學習器;如此重複進行,直至基學習器數目達到實現指定的值T,或整個集成結果達到退出條件,而後將這些學習器進行加權結合。正確率越高的基學習器的得到的權重越大。Boosting能夠用於分類和迴歸問題。
(3)常見的基於Boosting模型的算法有:AdaBoost、Boosting Tree、GBDT、XGBoost。
(1)從方差-誤差分解的角度看,Boosting主要關注下降誤差,所以Boosting能基於泛化性能至關弱的學習器構建出很強的集成。
(2)Boosting對樣本分佈進行調整主要有兩種方法:
(1) 樣本選擇上:
Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。
Boosting:每一輪的訓練集不變,只是訓練集中每一個樣例在分類器中的權重發生變化。而權值是根據上一輪的分類結果進行調整。
(2) 樣例權重:
Bagging:使用均勻取樣,每一個樣例的權重相等
Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大。
(3) 預測函數:
Bagging:全部預測函數的權重相等。
Boosting:每一個弱分類器都有相應的權重,對於分類偏差小的分類器會有更大的權重。
(4) 並行計算:
Bagging:各個預測函數能夠並行生成
Boosting:各個預測函數只能順序生成,由於後一個模型參數須要前一輪模型的結果。
(5) 爲何說bagging是減小variance,而boosting是減小bias(高頻面試)
Bagging中每一個基學習器都是強學習器,主要關注的問題是下降方差;Boosting中每一個基學習器都是弱學習器,主要關注的問題是下降誤差。具體解答分析見7.從誤差和方差的角度理解集成學習
(1)AdaBoost [ adaptive boosting(自適應boosting) ] 是Boosting中的經典算法,其主要應用於二分類問題,也能夠用於多分類以及迴歸問題。
(2)AdaBoost算法思路:如何改變每一輪訓練數據的權重?Adaboost 算法採用調整樣本權重的方式來對樣本分佈進行調整,即提升前一輪個體學習器錯誤分類的樣本的權重,而下降那些正確分類的樣本的權重,這樣就能使得錯誤分類的樣本能夠受到更多的關注,從而在下一輪中能夠正確分類,使得分類問題被一系列的弱分類器「分而治之」。如何將弱分類器組合成一個強分類器?對於組合方式,AdaBoost採用加權多數表決的方法,具體地,加大分類偏差率小的若分類器的權值,減少分類偏差率大的若分類器的權值,從而調整他們在表決中的做用。
AdaBoost算法是模型爲加法模型、損失函數爲指數函數、學習算法爲前向分步算法的二分類算法。AdaBoost算法中最重要的應該就是樣本權重更新公式的推導。
加法模型:最終的強分類器是由若干個弱分類器加權平均獲得的。
前向分佈學習算法:算法是經過一輪輪的弱學習器學習,利用前一個弱學習器的結果來更新後一個弱學習器的訓練集權重。第 k 輪的強學習器爲:
定義損失函數爲 n 個樣本的指數損失函數:
利用前向分佈學習算法的關係能夠獲得:
由於 已知,因此令
,隨着每一輪迭代而將這個式子帶入損失函數,損失函數轉化爲:
咱們求 ,能夠獲得:
將 帶入損失函數,並對
求導,使其等於 0,則就獲得了:
其中, 即爲咱們前面的分類偏差率。
最後看樣本權重的更新。利用 和
,便可得:
這樣就獲得了樣本權重更新公式。
其中,表示決策樹;
爲決策樹的參數;
爲決策樹的個數。
提高樹對不一樣問題有不一樣的提高樹學習算法,其主要區別在於使用的損失函數不一樣。
(1)用平方偏差損失函數的迴歸問題。
(2)用指數損失函數的分類問題。
(3)通常損失函數的通常決策問題。(引出了GB[Gradient Boosting 梯度提高]算法,GB+決策樹(迴歸樹)就獲得了GBDT)
對於二分類問題,Boosting Tree算法只須要將AdaBoost算法中的基分類器限制爲CART二分類樹便可。
從這個角度能夠反應出,在二分類問題中 Boosting Tree = AdaBoost + Tree(二分類樹)
(1)把輸入空間X劃分爲J個互不相交的區域,而且在每一個區域上肯定的輸出常量,那麼樹能夠表示爲以下:
其中,參數表示樹的區域劃分和各個區域上的常數。J是迴歸樹的複雜度即葉子結點個數。
(2)迴歸問題提高樹使用如下前向分佈算法:
在第m步,給定當前模型,須要求解
獲得,即第m棵樹的參數。
(3)由於爲迴歸問題,因此採用平方偏差損失函數,因此
由上式容易知道,爲使損失函數最小,則須要
即須要擬合r,其中,
爲當前模型擬合數據的殘差(residual),因此對於迴歸問題的提高樹算法來講,只須要簡單的擬合當前模型的殘差。
算法流程以下圖所示:(摘自統計學習方法)
李航的《統計學習方法》中也給出了相應的例子來講明整個解決迴歸問題提高樹的算法流程。因爲題目太長,在這我就不粘貼出來了,有須要本身去看!
GBDT = GB + DT + Shringkage(一個重要演變),在瞭解GBDT以前,首先讓我瞭解一下GB(Gradient Boosting,梯度提高)算法以及DT(Decision Tree)。
Cart迴歸樹生成算法(用於迴歸問題的Boosting Tree也須要用到Cart迴歸樹生成算法)(有關Cart迴歸樹以及分類樹的詳細知識可查看博主的上一篇博客)
梯度提高樹(Grandient Boosting)是提高樹(Boosting Tree)的一種改進算法。
提高樹利用加法模型與前向分步算法實現學習的優化過程,當損失函數是平方損失和指數損失函數時,梯度提高樹每一步優化是很簡單的,可是對於通常損失函數而言,每每每一步優化起來不那麼容易,針對這一問題,Friedman提出了梯度提高樹算法,這是利用最速降低的近似方法,其關鍵是利用損失函數的負梯度做爲提高樹算法中的殘差的近似值。那麼負梯度長什麼樣呢?第t輪的第i個樣本的損失函數的負梯度爲:
此時不一樣的損失函數將會獲得不一樣的負梯度,若是選擇平方損失
則負梯度爲
從上述推導過程當中,能夠看出當損失函數爲平方損失函數時,損失函數的負梯度 = 殘差。可是在GBDT中,損失函數通常不會選擇平方損失函數,因此咱們利用損失函數的負梯度做爲提高樹算法中的殘差的近似值。
介紹完了GB和DT,將二者結合起來就獲得GBDT算法。GBDT(Gradient Boosting Decision Tree)是一種迭代的決策樹算法,該算法由多棵決策樹組成,從名字中咱們能夠看出來它是屬於 Boosting 策略。GBDT 是被公認的泛化能力較強的算法。
首先必須明確一點 ,GBDT 使用的是絕對損失或者 Huber 損失函數,而不是平方損失函數(網上不少博客把GBDT的損失函數看成平方損失函數,這是錯誤的)
GBDT算法的整個流程:
一般在2(d)步驟時,GBDT會引入縮減(Shrinkage)思想
Shrinkage 的思想認爲,每走一小步逐漸逼近結果的效果要比每次邁一大步很快逼近結果的方式更容易避免過擬合。即它並非徹底信任每一棵殘差樹。
Shrinkage 不直接用殘差修復偏差,而是隻修復一點點,把大步切成小步。本質上 Shrinkage 爲每棵樹設置了一個 weight,累加時要乘以這個 weight,當 weight 下降時,基模型數會配合增大。
在梯度提高決策樹GBDT中,經過定義不一樣的損失函數,能夠完成不一樣的學習任務,二分類是機器學習中一類比較重要的分類算法,對於分類問題,通常將損失函數改成指數損失(二分類)或者對數似然損失(多分類)。在二分類中,其損失函數爲:
其他過程見:深刻理解GBDT二分類算法(此篇博客的博主是個大牛!@!!!!!!!)
相同點:
不一樣點:
誤差(Bias)描述的是預測值和真實值之差;方差(Variance)描述的是預測值做爲隨機變量的離散程度。放一場很經典的圖:
模型的誤差與方差
咱們常說集成學習中的基模型是弱模型,一般來講弱模型是誤差高(在訓練集上準確度低)方差小(防止過擬合能力強)的模型,但並非全部集成學習框架中的基模型都是弱模型。Bagging 和 Stacking 中的基模型爲強模型(誤差低,方差高),而Boosting 中的基模型爲弱模型(誤差高,方差低)。
在 Bagging 和 Boosting 框架中,經過計算基模型的指望和方差咱們能夠獲得模型總體的指望和方差。爲了簡化模型,咱們假設基模型的指望爲 ,方差
,模型的權重爲
,兩兩模型間的相關係數
相等。因爲 Bagging 和 Boosting 的基模型都是線性組成的,那麼有:
模型整體指望:
模型整體方差(公式推導參考協方差的性質,協方差與方差的關係):
模型的準確度可由誤差和方差共同決定:
對於 Bagging 來講,每一個基模型的權重等於 1/m 且指望近似相等,故咱們能夠獲得:
經過上式咱們能夠看到:
在此咱們知道了爲何 Bagging 中的基模型必定要爲強模型,若是 Bagging 使用弱模型則會致使總體模型的誤差提升,而準確度下降。
Random Forest 是經典的基於 Bagging 框架的模型,並在此基礎上經過引入特徵採樣和樣本採樣來下降基模型間的相關性,在公式中顯著下降方差公式中的第二項,略微升高第一項,從而使得總體下降模型總體方差。
對於 Boosting 來講,因爲基模型共用同一套訓練集,因此基模型間具備強相關性,故模型間的相關係數近似等於 1,針對 Boosting 化簡公式爲:
經過觀察總體方差的表達式咱們容易發現:
基於 Boosting 框架的 Gradient Boosting Decision Tree 模型中基模型也爲樹模型,同 Random Forrest,咱們也能夠對特徵進行隨機抽樣來使基模型間的相關性下降,從而達到減小方差的效果。