集成學習中還有一個重要的類別是Boosting,這個是基學習器具備較強依賴串行而成的算法,目前主流的主要有三個算法:GBDT,Adaboost,XGBoosthtml
這個連接能夠看看:https://www.cnblogs.com/willnote/p/6801496.html算法
不一樣點:機器學習
一、adaboost使用的是指數損失(其實也可使用別的損失函數,不過指數損失比較好解釋),直接偏導數等於0(直接讓損失函數變最小)來求得樣本還有決策樹的權重,函數
而gbdt和xgboost用得都是梯度降低算法,其中gbdt在分類的模型上用得是對數損失,由於分類不可導,只能使用指數或者對數損失,若是使用指數損失,其實就有點變成adaboost了學習
二、gbdt實際上是泰勒一階展開,而xgboost是二階展開,因此收斂速度更快優化
boosting算法的原理以下:spa
一、GBDT
gbdt和xgboost其實都是迴歸樹!!!由於都用到了導數的性質,因此輸出值都不能是0,1 必需要機率形式,否則不可導。機率形式在轉成0,13d
1、原理
解釋:咱們機器學習的目的都是爲了讓損失函數取得最小,這裏損失函數能夠是不少種,好比平方和損失,絕對值損失,指數對數損失等等,htm
一、假定咱們如今已經知道了咱們的損失函數blog
二、假定咱們GBDT產生的最終的F分類器是有許多個f加權獲得的的
一、如今咱們給定初始的F0模型,這裏能夠直接給一個常數r讓這個損失函數取最小,好比若是損失函數是平方損失,那麼r就是均值,若是是絕對值損失函數,那麼r就是中位數,
若是是什麼別的損失函數,反正是有一個固定常數讓他最小
二、給定F0以後咱們想要推下一個F1,前面咱們假設了是由前m-1個模型在家第m個分類器以後成爲最終的F的,因此咱們這裏須要求得咱們選擇哪一個f可以使得咱們Fm-1與他相加後會使得損失函數最小呢
也就是咱們要取什麼讓損失函數最小,那這個f就是咱們要的,而後獲得這個f再加上前面的Fm-1就是咱們最終的模型(其實這裏沒什麼用,就是說一下思想)
一、如今問題來了,怎麼求這個f呢,咱們使用梯度降低算法來求,這裏的梯度算法是這樣的,縱座標是損失函數值,橫座標是tree,咱們要作的梯度是隨着樹的增長,損失函數變小
二、因此咱們就把當前截止已經造成的Fm-1模型沿着他的損失函數負梯度方面進行計算來獲得最終的Fm模型
2、步驟
1)迴歸算法
一、首先初始化第一個弱學習器:,這裏必定存在一個參數C使得這個損失函數最小,前面說過
二、從第t輪開始,t=1,2,3,4.。。t:
,這裏咱們須要計算每一個樣本應該如何沿着負梯度方向變化纔可以使得這個模型提高
這個意思其實就是:咱們拿到每一個樣本應該變化多少了,如今咱們創建一個樹來預測這個應該變化多少,預測值加入到前面t-1輪造成的模型中,獲得t輪的最終模型
三、這個時候再把t輪的模型拿來預測,預測值假設是f(t),再計算這個預測值與實際值的誤差(仍是按照損失函數負梯度公式來作),差值再作模型創建,再加上原來t輪造成的模型中,獲得ft+1輪
這裏解釋一下:咱們想要沿着損失函數負梯度方向發展,因此你就要知道想獲得這樣的損失函數,你每一個樣本應該怎麼樣變化,也就是每一個樣本還差多少纔可以讓損失是沿着負梯度方向發展的,因此咱們纔要把每一個樣本的偏差值拿來作預測,若是恰好預測全對,也就是須要誤差的量咱們預測全對,那麼原來的f0加上咱們這一輪預測的偏差量就會使得樣本預測所有正確。理解這段話很是關鍵!!!
2)分類算法
3、正則化
一、一種是跟adaboost同樣,對於弱學習器增長一個步長v
二、
第二種正則化的方式是經過子採樣比例(subsample)。取值爲(0,1]。注意這裏的子採樣和隨機森林不同,隨機森林使用的是放回抽樣,而這裏是不放回抽樣。若是取值爲1,則所有樣本都使用,等於沒有使用子採樣。若是取值小於1,則只有一部分樣本會去作GBDT的決策樹擬合。選擇小於1的比例能夠減小方差,即防止過擬合,可是會增長樣本擬合的誤差,所以取值不能過低。推薦在[0.5, 0.8]之間。
使用了子採樣的GBDT有時也稱做隨機梯度提高樹(Stochastic Gradient Boosting Tree, SGBT)。因爲使用了子採樣,程序能夠經過採樣分發到不一樣的任務去作boosting的迭代過程,最後造成新樹,從而減小弱學習器難以並行學習的弱點。
三、對於弱學習器即CART迴歸樹進行正則化剪枝。
二、XGBoost
XGBoost是GBDT的一個升級,gbdt使用泰勒一階展開,而xgboost使用二階
其中
三、Adaboost
Adaboost的基本思想是這樣的:
一、一開始全部的樣本權重所有相等,訓練處第一個基分類器,根據這個基分類器對樣本進行劃分
二、從第二輪開始針對前一輪的分類結果從新賦予樣本權重,對於分類錯誤的樣本權重加大,正確的樣本權重減小。
三、以後根據新獲得樣本的權重指導本輪中的基分類器訓練,即在考慮樣本不一樣權重的狀況下獲得本輪錯誤率最低的基分類器。重複以上步驟直至訓練到約定的輪數結束,每一輪訓練獲得一個基分類器。
能夠想象到,遠離邊界(超平面)的樣本點老是分類正確,而分類邊界附近的樣本點老是有大機率被弱分類器(基分類器)分錯,因此權值會變高,即邊界附近的樣本點會在分類時獲得更多的重視。
步驟說明:
1)分類問題
一、對於全部的樣本,咱們先賦予初始權重,分別都相等1/M
二、選擇一個基分類器對樣本進行分類,計算通過這個基分類器分類後的偏差率,其中w爲樣本權重,
這個函數表示若預測值與實際值不一致返回1,不然返回0
通過以上的計算,就會計算出全部分類錯的樣本的偏差率
三、計算這個基學習器的權重係數:,這個公式說明:若是偏差率ek越小,那麼
越大,那麼log以後也越大,所以這個係數ak也越大,這說明若是偏差率越小,學習期的係數權重越大(注意跟下面的樣本系數不同啊!!!)
四、更新樣本的權重,把錯分的權重加大,正確的權重減少其中ZK是規範化因子
這裏先解釋第一個公式,也就是權重公式:ex函數圖像能夠去百度一下,是一個過0,1點的遞增函數,也就是若是分類錯誤,那麼yi*Gk(xi)就不是同號就<0,那麼這個就會比較大,大於1,也就是原來的權重基礎上乘以一個比1大的數字,調大了這個權重,同理,若是分類正確就會調小,也就是,若是分錯了,偏差率變大了,樣本權重變大(記住跟係數權重不同啊!!!)
第二個公式是規範化因子,由於若是不除以這個因子,會致使權重總和不等於1,除掉這個因子以後全部權重加起來又等於1了
五、根據不一樣權重的樣本在作第二個基分類器,一樣計算權重,一直輪
六、最後經過訓練出來的K個分類器進行決策:
2)迴歸問題
迴歸問題不一樣的是偏差率的計算:
一、對於全部的樣本,咱們先賦予初始權重,分別都相等1/M
二、選擇一個基學習期進行學習,獲得第一個模型
首先計算最大偏差:,接着計算每一個樣本的相對偏差
,每一個樣本的相對偏差加權求和獲得這個基學習器的偏差率ek
注意:
一樣根據偏差率更新基學習器權重,再更新樣本權重:
其中Z也是規範化因子
這裏的公式這麼理解:若是這個樣本的偏差率比較大,那麼就會比較小,因爲ak是一個小於1的數,因此
這個就會比較大,同時樣本權重就加大了,
三、最後也是經過訓練出來的K個分類器進行決策:
損失函數優化:
前面咱們只是介紹了計算權重、係數的公式,沒有解釋緣由,如下推導這個公式產生的緣由
Adaboost是模型爲加法模型,學習算法爲前向分步學習算法,損失函數爲指數函數的分類問題。
加法模型很好理解:由於咱們最終決策是根據這K個決策樹相加來作決策的
前向分步學習也很好理解:由於t+1輪學習期是根據t輪學習期的結果進行的
損失函數爲指數函數:真是難理解這裏
定義損失函數爲:
這裏這樣理解:若是yi與預測值f(x)一致,那麼想成是>0,那麼指數就會比較小,比1小;若是yi與預測值f(x)不一致,那麼想成是<0,加個負號大於0,指數就變大大於1,把全部的樣本的這個指數值累加,若是可以取最小,說明都分類對了嘛,因此這個是他的損失函數,完美!!!
因爲咱們前面瞭解到了,,因此代入獲得
因此損失函數再變化成下面的樣子
而後下面重點來了:
這個能夠分紅yi=G(x)和yi不等於G(x)兩部分相加,覺得等因而1,不等因而-1,因此化簡成那樣
這裏從1到2,先把
這個看做是總的減去yi不等於G(I)的,而後再跟後面的合併
不等於那一部分提取出來,加上後面的這個是總的,接下來就能夠求導了,咱們對a求導獲得
而後代入
最後獲得a的計算公式
,這個就解釋了前面爲何用這個公式,
最後想說真是太他麼難了!!
Adaboost算法正則化:
對於Adaboost算法咱們也能夠加入正則化,其實就是加在每一個基分類器前面