轉:http://www.cnblogs.com/jasonfreak/p/5657196.htmlhtml
1 前言
2 集成學習是什麼?
3 誤差和方差
3.1 模型的誤差和方差是什麼?
3.2 bagging的誤差和方差
3.3 boosting的誤差和方差
3.4 模型的獨立性
3.5 小結
4 Gradient Boosting
4.1 擬合殘差
4.2 擬合反向梯度
4.2.1 契機:引入損失函數
4.2.2 難題一:任意損失函數的最優化
4.2.3 難題二:沒法對測試樣本計算反向梯度
4.3 常見的損失函數
4.4 步子太大容易扯着蛋:縮減
4.5 初始模型
4.5 Gradient Tree Boosting
4.6 小結
5 總結
6 參考資料git
不少人在競賽(Kaggle,天池等)或工程實踐中使用了集成學習(例如,RF、GTB等),確實也取得了不錯的效果,在保證準確度的同時也提高了模型防止過擬合的能力。可是,咱們真的用對了集成學習嗎?github
sklearn提供了sklearn.ensemble庫,支持衆多集成學習算法和模型。恐怕大多數人使用這些工具時,要麼使用默認參數,要麼根據模型在測試集上的性能試探性地進行調參(固然,徹底不懂的參數仍是不動算了),要麼將調參的工做丟給調參算法(網格搜索等)。這樣並不能真正地稱爲「會」用sklearn進行集成學習。算法
我認爲,學會調參是進行集成學習工做的前提。然而,第一次遇到這些算法和模型時,確定會被其豐富的參數所嚇到,要知道,教材上教的僞代碼可沒這麼多參數啊!!!不要緊,暫時,咱們只要記住一句話:參數可分爲兩種,一種是影響模型在訓練集上的準確度或影響防止過擬合能力的參數;另外一種不影響這二者的其餘參數。模型在樣本整體上的準確度(後簡稱準確度)由其在訓練集上的準確度及其防止過擬合的能力所共同決定,因此在調參時,咱們主要對第一種參數進行調整,最終達到的效果是:模型在訓練集上的準確度和防止過擬合能力的大和諧!spring
本篇博文將詳細闡述模型參數背後的理論知識,在下篇博文中,咱們將對最熱門的兩個模型Random Forrest和Gradient Tree Boosting(含分類和迴歸,因此共4個模型)進行具體的參數講解。若是你實在沒法靜下心來學習理論,你也能夠在下篇博文中找到最直接的調參指導,雖然我不贊同這麼作。框架
咱們仍是花一點時間來講明一下集成學習是什麼,若是對此有必定基礎的同窗能夠跳過本節。簡單來講,集成學習是一種技術框架,其按照不一樣的思路來組合基礎模型,從而達到其利斷金的目的。dom
目前,有三種常見的集成學習框架:bagging,boosting和stacking。國內,南京大學的周志華教授對集成學習有很深刻的研究,其在09年發表的一篇概述性論文《Ensemble Learning》對這三種集成學習框架有了明確的定義,歸納以下:wordpress
bagging:從訓練集從進行子抽樣組成每一個基模型所須要的子訓練集,對全部基模型預測的結果進行綜合產生最終的預測結果:函數
boosting:訓練過程爲階梯狀,基模型按次序一一進行訓練(實現上能夠作到並行),基模型的訓練集按照某種策略每次都進行必定的轉化。對全部基模型預測的結果進行線性綜合產生最終的預測結果:工具
stacking:將訓練好的全部基模型對訓練基進行預測,第j個基模型對第i個訓練樣本的預測值將做爲新的訓練集中第i個樣本的第j個特徵值,最後基於新的訓練集進行訓練。同理,預測的過程也要先通過全部基模型的預測造成新的測試集,最後再對測試集進行預測:
有了這些基本概念以後,直覺將告訴咱們,因爲再也不是單一的模型進行預測,因此模型有了「集思廣益」的能力,也就不容易產生過擬合現象。可是,直覺是不可靠的,接下來咱們將從模型的誤差和方差入手,完全搞清楚這一問題。
廣義的誤差(bias)描述的是預測值和真實值之間的差別,方差(variance)描述距的是預測值做爲隨機變量的離散程度。《Understanding the Bias-Variance Tradeoff》當中有一副圖形象地向咱們展現了誤差和方差的關係:
模型的誤差是一個相對來講簡單的概念:訓練出來的模型在訓練集上的準確度。
要解釋模型的方差,首先須要從新審視模型:模型是隨機變量。設樣本容量爲n的訓練集爲隨機變量的集合(X1, X2, ..., Xn),那麼模型是以這些隨機變量爲輸入的隨機變量函數(其自己仍然是隨機變量):F(X1, X2, ..., Xn)。抽樣的隨機性帶來了模型的隨機性。
定義隨機變量的值的差別是計算方差的前提條件,一般來講,咱們遇到的都是數值型的隨機變量,數值之間的差別再明顯不過(減法運算)。可是,模型的差別性呢?咱們能夠理解模型的差別性爲模型的結構差別,例如:線性模型中權值向量的差別,樹模型中樹的結構差別等。在研究模型方差的問題上,咱們並不須要對方差進行定量計算,只須要知道其概念便可。
研究模型的方差有什麼現實的意義呢?咱們認爲方差越大的模型越容易過擬合:假設有兩個訓練集A和B,通過A訓練的模型Fa與通過B訓練的模型Fb差別很大,這意味着Fa在類A的樣本集合上有更好的性能,而Fb反之,這即是咱們所說的過擬合現象。
咱們常說集成學習框架中的基模型是弱模型,一般來講弱模型是誤差高(在訓練集上準確度低)方差小(防止過擬合能力強)的模型。可是,並非全部集成學習框架中的基模型都是弱模型。bagging和stacking中的基模型爲強模型(誤差低方差高),boosting中的基模型爲弱模型。
在bagging和boosting框架中,經過計算基模型的指望和方差,咱們能夠獲得模型總體的指望和方差。爲了簡化模型,咱們假設基模型的權重、方差及兩兩間的相關係數相等。因爲bagging和boosting的基模型都是線性組成的,那麼有:
對於bagging來講,每一個基模型的權重等於1/m且指望近似相等(子訓練集都是從原訓練集中進行子抽樣),故咱們能夠進一步化簡獲得:
根據上式咱們能夠看到,總體模型的指望近似於基模型的指望,這也就意味着總體模型的誤差和基模型的誤差近似。同時,總體模型的方差小於等於基模型的方差(當相關性爲1時取等號),隨着基模型數(m)的增多,總體模型的方差減小,從而防止過擬合的能力加強,模型的準確度獲得提升。可是,模型的準確度必定會無限逼近於1嗎?並不必定,當基模型數增長到必定程度時,方差公式第二項的改變對總體方差的做用很小,防止過擬合的能力達到極限,這即是準確度的極限了。另外,在此咱們還知道了爲何bagging中的基模型必定要爲強模型,不然就會致使總體模型的誤差度低,即準確度低。
Random Forest是典型的基於bagging框架的模型,其在bagging的基礎上,進一步下降了模型的方差。Random Fores中基模型是樹模型,在樹的內部節點分裂過程當中,再也不是將全部特徵,而是隨機抽樣一部分特徵歸入分裂的候選項。這樣一來,基模型之間的相關性下降,從而在方差公式中,第一項顯著減小,第二項稍微增長,總體方差還是減小。
對於boosting來講,基模型的訓練集抽樣是強相關的,那麼模型的相關係數近似等於1,故咱們也能夠針對boosting化簡公式爲:
經過觀察總體方差的表達式,咱們容易發現,若基模型不是弱模型,其方差相對較大,這將致使總體模型的方差很大,即沒法達到防止過擬合的效果。所以,boosting框架中的基模型必須爲弱模型。
由於基模型爲弱模型,致使了每一個基模型的準確度都不是很高(由於其在訓練集上的準確度不高)。隨着基模型數的增多,總體模型的指望值增長,更接近真實值,所以,總體模型的準確度提升。可是準確度必定會無限逼近於1嗎?仍然並不必定,由於訓練過程當中準確度的提升的主要功臣是總體模型在訓練集上的準確度提升,而隨着訓練的進行,總體模型的方差變大,致使防止過擬合的能力變弱,最終致使了準確度反而有所降低。
基於boosting框架的Gradient Tree Boosting模型中基模型也爲樹模型,同Random Forrest,咱們也能夠對特徵進行隨機抽樣來使基模型間的相關性下降,從而達到減小方差的效果。
聰明的讀者這時確定要問了,如何衡量基模型的獨立性?咱們說過,抽樣的隨機性決定了模型的隨機性,若是兩個模型的訓練集抽樣過程不獨立,則兩個模型則不獨立。這時便有一個天大的陷阱在等着咱們:bagging中基模型的訓練樣本都是獨立的隨機抽樣,可是基模型卻不獨立呢?
咱們討論模型的隨機性時,抽樣是針對於樣本的總體。而bagging中的抽樣是針對於訓練集(總體的子集),因此並不能稱其爲對總體的獨立隨機抽樣。那麼到底bagging中基模型的相關性體如今哪呢?在知乎問答《爲何說bagging是減小variance,而boosting是減小bias?》中請教用戶「過擬合」後,我總結bagging的抽樣爲兩個過程:
倘若在子抽樣的過程當中,兩個基模型抽取的輸入隨機變量有必定的重合,那麼這兩個基模型對總體樣本的抽樣將再也不獨立,這時基模型之間便具備了相關性。
還記得調參的目標嗎:模型在訓練集上的準確度和防止過擬合能力的大和諧!爲此,咱們目前作了一些什麼工做呢?
這下總算有點開朗了,那些讓咱們抓狂的參數,如今能夠粗略地分爲兩類了:控制總體訓練過程的參數和基模型的參數,這兩類參數都在影響着模型在訓練集上的準確度以及防止過擬合的能力。
對基於Gradient Boosting框架的模型的進行調試時,咱們會遇到一個重要的概念:損失函數。在本節中,咱們將把損失函數的「此生來世」講個清楚!
基於boosting框架的總體模型能夠用線性組成式來描述,其中h[i](x)爲基模型與其權值的乘積:
根據上式,總體模型的訓練目標是使預測值F(x)逼近真實值y,也就是說要讓每個基模型的預測值逼近各自要預測的部分真實值。因爲要同時考慮全部基模型,致使了總體模型的訓練變成了一個很是複雜的問題。因此,研究者們想到了一個貪心的解決手段:每次只訓練一個基模型。那麼,如今改寫總體模型爲迭代式:
這樣一來,每一輪迭代中,只要集中解決一個基模型的訓練問題:使F[i](x)逼近真實值y。
使F[i](x)逼近真實值,其實就是使h[i](x)逼近真實值和上一輪迭代的預測值F[i-1](x)之差,即殘差(y-F[i-1](x))。最直接的作法是構建基模型來擬合殘差,在博文《GBDT(MART) 迭代決策樹入門教程 | 簡介》中,做者舉了一個生動的例子來講明經過基模型擬合殘差,最終達到總體模型F(x)逼近真實值。
研究者發現,殘差實際上是最小均方損失函數的關於預測值的反向梯度:
也就是說,若F[i-1](x)加上擬合了反向梯度的h[i](x)獲得F[i](x),該值可能將致使平方差損失函數下降,預測的準確度提升!這顯然不是巧合,可是研究者們野心更大,但願可以創造出一種對任意損失函數均可行的訓練方法,那麼僅僅擬合殘差是不恰當的了。
引入任意損失函數後,咱們能夠定義總體模型的迭代式以下:
在這裏,損失函數被定義爲泛函。
對任意損失函數(且是泛函)的最優化是困難的。咱們須要打破思惟的枷鎖,將總體損失函數L'定義爲n元普通函數(n爲樣本容量),損失函數L定義爲2元普通函數(記住!!!這裏的損失函數再也不是泛函!!!):
咱們不妨使用梯度最速降低法來解決總體損失函數L'最小化的問題,先求總體損失函數的反向梯度:
假設已知樣本x的當前預測值爲F[i-1](x),下一步將預測值按照反向梯度,依照步長爲r[i],進行更新:
步長r[i]不是固定值,而是設計爲:
問題又來了,因爲測試樣本中y是未知的,因此沒法求反向梯度。這正是Gradient Boosting框架中的基模型閃亮登場的時刻!在第i輪迭代中,咱們建立訓練集以下:
也就是說,讓基模型擬合反向梯度函數,這樣咱們就能夠作到只輸入x這一個參數,就可求出其對應的反向梯度了(固然,經過基模型預測出來的反向梯度並非準確的,這也提供了泛化總體模型的機會)。
綜上,假設第i輪迭代中,根據新訓練集訓練出來的基模型爲f[i](x),那麼最終的迭代公式爲:
ls:最小均方迴歸中用到的損失函數。在以前咱們已經談到,從擬合殘差的角度來講,殘差便是該損失函數的反向梯度值(因此又稱反向梯度爲僞殘差)。不一樣的是,從擬合殘差的角度來講,步長是無心義的。該損失函數是sklearn中Gradient Tree Boosting迴歸模型默認的損失函數。
deviance:邏輯迴歸中用到的損失函數。熟悉邏輯迴歸的讀者確定還記得,邏輯迴歸本質是求極大似然解,其認爲樣本服從幾何分佈,樣本屬於某類別的機率能夠logistic函數表達。因此,若是該損失函數可用在多類別的分類問題上,故其是sklearn中Gradient Tree Boosting分類模型默認的損失函數。
exponential:指數損失函數,表達式爲:
對該損失函數求反向梯度得:
這時,在第i輪迭代中,新訓練集以下:
腦殼裏有什麼東西浮出水面了吧?讓咱們看看Adaboost算法中,第i輪迭代中第j個樣本權值的更新公式:
樣本的權值何時會用到呢?計算第i輪損失函數的時候會用到:
讓咱們再回過頭來,看看使用指數損失函數的Gradient Boosting計算第i輪損失函數:
天吶,兩個公式就差了一個對權值的歸一項。這並非巧合,當損失函數是指數損失時,Gradient Boosting至關於二分類的Adaboost算法。是的,指數損失僅能用於二分類的狀況。
縮減也是一個相對顯見的概念,也就是說使用Gradient Boosting時,每次學習的步長縮減一點。這有什麼好處呢?縮減思想認爲每次走一小步,多走幾回,更容易逼近真實值。若是步子邁大了,使用最速降低法時,容易邁過最優勢。將縮減代入迭代公式:
縮減須要配合基模型數一塊兒使用,當縮減率v下降時,基模型數要配合增大,這樣才能提升模型的準確度。
還有一個不那麼起眼的問題,初始模型F[0](x)是什麼呢?若是沒有定義初始模型,總體模型的迭代式一刻都沒法進行!因此,咱們定義初始模型爲:
根據上式可知,對於不一樣的損失函數來講,初始模型也是不同的。對全部的樣原本說,根據初始模型預測出來的值都同樣。
終於到了備受歡迎的Gradient Tree Boosting模型了!可是,可講的卻已經很少了。咱們已經知道了該模型的基模型是樹模型,而且能夠經過對特徵的隨機抽樣進一步減小總體模型的方差。咱們能夠在維基百科的Gradient Boosting詞條中找到其僞代碼實現。
到此,讀者應當很清楚Gradient Boosting中的損失函數有什麼意義了。要說誤差描述了模型在訓練集準確度,則損失函數則是描述該準確度的間接量綱。也就是說,模型採用不一樣的損失函數,其訓練過程會朝着不一樣的方向進行!
磨刀不誤砍柴功,咱們花了這麼多時間來學習必要的理論,我強調一次:必要的理論!集成學習模型的調參工做的核心就是找到合適的參數,可以使總體模型在訓練集上的準確度和防止過擬合的能力達到協調,從而達到在樣本整體上的最佳準確度。有了本文的理論知識鋪墊,在下篇中,咱們將對Random Forest和Gradient Tree Boosting中的每一個參數進行詳細闡述,同時也有一些小試驗證實咱們的結論。