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