通常決定一個機(jī)器學(xué)習(xí)模型能不能取得好的效果,以下三個方面的因素缺一不可。
1.?理論模型?(站在?vc-dimension?的角度)
2.?實(shí)際數(shù)據(jù)
3.?系統(tǒng)的實(shí)現(xiàn)?(主要基于?xgboost:基于C++通過多線程實(shí)現(xiàn)了回歸樹的并行構(gòu)建)
--------------------------------------------------------------------------------
(1)站在理論模型的角度
我們可以假設(shè)有一個“上帝函數(shù)” hypothesis可以完美的擬合所有數(shù)據(jù)(包括訓(xùn)練數(shù)據(jù),以及未知的測試數(shù)據(jù))。但這個函數(shù)我們肯定是不知道的 (不然就不需要機(jī)器學(xué)習(xí)了)。我們只可能選擇一個 “假想函數(shù)” 來 逼近 這個 “上帝函數(shù)”
一個機(jī)器學(xué)習(xí)模型想要取得好的效果,這個模型需要滿足以下兩個條件:
1. 模型在我們的訓(xùn)練數(shù)據(jù)上的表現(xiàn)要不錯:也就是trainning error 要足夠小。
2. 模型的 vc-dimension 要低。換句話說,就是模型的自由度不能太大,以防overfit.(vc dimension的值越大,參數(shù)的個數(shù)越多,模型越復(fù)雜)
http://www.thebigdata.cn/JiShuBoKe/14027.html
那么這么多算法中,選擇依據(jù)是“模型的可控性”。
1.對于 LR 這樣的模型。如果 underfit,我們可以通過加 feature,或者通過高次的特征轉(zhuǎn)換來使得我們的模型在訓(xùn)練數(shù)據(jù)上取得足夠高的正確率。而對于 tree-enseble 來說,我們解決這一問題的方法是通過訓(xùn)練更多的 “弱弱” 的 tree. 所以,這兩類模型都可以把 training error 做的足夠低,也就是說模型的表達(dá)能力都是足夠的。
2.在 tree-ensemble 模型中,通過加 tree 的方式,對于模型的 vc-dimension 的改變是比較小的。而在 LR 中,初始的維數(shù)設(shè)定,或者說特征的高次轉(zhuǎn)換對于 vc-dimension 的影響都是更大的。所以,一不小心我們設(shè)定的多項(xiàng)式維數(shù)高了,模型就 “剎不住車了”。俗話說的好,步子大了,總會扯著蛋。這也就是我們之前說的,tree-ensemble 模型的可控性更好,也即更不容易 overfit.
----------------------------------------------------------------------------
(2)站在數(shù)據(jù)的角度
1.kaggle?比賽選擇的都是真實(shí)世界中的問題。所以數(shù)據(jù)多多少少都是有噪音的。而基于樹的算法通??乖肽芰Ω鼜?qiáng)。
2.除了數(shù)據(jù)噪音之外,feature?的多樣性也是?tree-ensemble?模型能夠取得更好效果的原因之一。特征的多樣性也正是為什么工業(yè)界很少去使用 svm 的一個重要原因之一(因?yàn)闀?過擬合overfitting),因?yàn)?svm 本質(zhì)上是屬于一個幾何模型,這個模型需要去定義 instance 之間的 kernel 或者 similarity。
噪聲問題:學(xué)習(xí)了天鵝的外形(全局特征)之后,你的例子都是白色的。計(jì)算機(jī)看見黑天鵝就認(rèn)為不是天鵝。(黑色只是局部特征)
過擬合:把學(xué)習(xí)太徹底了,所有樣本都學(xué)了,包括局部特征,所以識別新樣本沒有幾個是對的。
解決方法:不要那么徹底,降低機(jī)器學(xué)習(xí)局部特征和錯誤特征機(jī)率。收集多樣化樣本,簡化模型,交叉驗(yàn)證。

overfitting:http://www.qbiao.com/25555.html
--------------------------------------------------------------------------------------
(3)站在系統(tǒng)實(shí)現(xiàn)的角度
除了有合適的模型和數(shù)據(jù),一個良好的機(jī)器學(xué)習(xí)系統(tǒng)實(shí)現(xiàn)往往也是算法最終能否取得好的效果的關(guān)鍵。一個好的機(jī)器學(xué)習(xí)系統(tǒng)實(shí)現(xiàn)應(yīng)該具備以下特征:
1. 正確高效的實(shí)現(xiàn)某種模型。我真的見過有些機(jī)器學(xué)習(xí)的庫實(shí)現(xiàn)某種算法是錯誤的。而高效的實(shí)現(xiàn)意味著可以快速驗(yàn)證不同的模型和參數(shù)。
xgboost?高效的?c++?實(shí)現(xiàn)能夠通常能夠比其它機(jī)器學(xué)習(xí)庫更快的完成訓(xùn)練任務(wù)。
2. 系統(tǒng)具有靈活、深度的定制功能。
在靈活性方面,xgboost?可以深度定制每一個子分類器,并且可以靈活的選擇?loss?function(logistic,linear,softmax?等等)。
3. 系統(tǒng)簡單易用。
xgboost?提供了各種語言的封裝,使得不同語言的用戶都可以使用這個優(yōu)秀的系統(tǒng)。
4. 系統(tǒng)具有可擴(kuò)展性, 可以從容處理更大的數(shù)據(jù)。
xgboost?提供了分布式訓(xùn)練(底層采用?rabit?接口),并且其分布式版本可以跑在各種平臺之上,例如?mpi,?yarn,?spark?等等。
機(jī)器學(xué)習(xí)算法中GBDT和XGBOOST的區(qū)別有哪些?
xgboost能自動利用cpu的多線程,而且適當(dāng)改進(jìn)了gradient?boosting,加了剪枝,控制了模型的復(fù)雜程度
陳天奇大神的文章和slides
- 傳統(tǒng)GBDT以CART作為基分類器,xgboost還支持線性分類器,這個時候xgboost相當(dāng)于帶L1和L2正則化項(xiàng)的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)。
- 傳統(tǒng)GBDT在優(yōu)化時只用到一階導(dǎo)數(shù)信息,xgboost則對代價函數(shù)進(jìn)行了二階泰勒展開,同時用到了一階和二階導(dǎo)數(shù)。順便提一下,xgboost工具支持自定義代價函數(shù),只要函數(shù)可一階和二階求導(dǎo)。
- xgboost在代價函數(shù)里加入了正則項(xiàng),用于控制模型的復(fù)雜度。正則項(xiàng)里包含了樹的葉子節(jié)點(diǎn)個數(shù)、每個葉子節(jié)點(diǎn)上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項(xiàng)降低了模型的variance,使學(xué)習(xí)出來的模型更加簡單,防止過擬合,這也是xgboost優(yōu)于傳統(tǒng)GBDT的一個特性。
- Shrinkage(縮減),相當(dāng)于學(xué)習(xí)速率(xgboost中的eta)。xgboost在進(jìn)行完一次迭代后,會將葉子節(jié)點(diǎn)的權(quán)重乘上該系數(shù),主要是為了削弱每棵樹的影響,讓后面有更大的學(xué)習(xí)空間。實(shí)際應(yīng)用中,一般把eta設(shè)置得小一點(diǎn),然后迭代次數(shù)設(shè)置得大一點(diǎn)。(補(bǔ)充:傳統(tǒng)GBDT的實(shí)現(xiàn)也有學(xué)習(xí)速率)
- 列抽樣(column subsampling)。xgboost借鑒了隨機(jī)森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計(jì)算,這也是xgboost異于傳統(tǒng)gbdt的一個特性。
- 對缺失值的處理。對于特征的值有缺失的樣本,xgboost可以自動學(xué)習(xí)出它的分裂方向。
- xgboost工具支持并行。boosting不是一種串行的結(jié)構(gòu)嗎?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能進(jìn)行下一次迭代的(第t次迭代的代價函數(shù)里包含了前面t-1次迭代的預(yù)測值)。xgboost的并行是在特征粒度上的。我們知道,決策樹的學(xué)習(xí)最耗時的一個步驟就是對特征的值進(jìn)行排序(因?yàn)橐_定最佳分割點(diǎn)),xgboost在訓(xùn)練之前,預(yù)先對數(shù)據(jù)進(jìn)行了排序,然后保存為block結(jié)構(gòu),后面的迭代中重復(fù)地使用這個結(jié)構(gòu),大大減小計(jì)算量。這個block結(jié)構(gòu)也使得并行成為了可能,在進(jìn)行節(jié)點(diǎn)的分裂時,需要計(jì)算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計(jì)算就可以開多線程進(jìn)行。
- 可并行的近似直方圖算法。樹節(jié)點(diǎn)在進(jìn)行分裂時,我們需要計(jì)算每個特征的每個分割點(diǎn)對應(yīng)的增益,即用貪心法枚舉所有可能的分割點(diǎn)。當(dāng)數(shù)據(jù)無法一次載入內(nèi)存或者在分布式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可并行的近似直方圖算法,用于高效地生成候選的分割點(diǎn)。
樹集成方法中 隨機(jī)森林和XGboost之間有什么區(qū)別?
先得了解一下回歸樹和樹集成的概念
判斷用戶是否會喜歡電腦游戲的回歸樹模型,每個樹葉的得分對應(yīng)了該用戶有多可能喜歡電腦游戲(分值越高可能性越大)。
上圖中的回歸樹只用到了用戶年齡和性別兩個信息,過于簡單,預(yù)測的準(zhǔn)確性自然有限。在圖2中使用2個回歸樹對用戶是否喜愛電腦游戲進(jìn)行了預(yù)測,并將兩個回歸樹的預(yù)測結(jié)果加和得到單個用戶的預(yù)測結(jié)果。

在實(shí)際的預(yù)測模型建立過程中,我們通過不斷的增加新的回歸樹,并給每個回歸樹賦予合適的權(quán)重,在此基礎(chǔ)上綜合不同的回歸樹得分獲得更為準(zhǔn)確的預(yù)測結(jié)果,這也就是樹集成(tree ensemble)的基本思路。
Random Forest和Boosted Trees都采用了樹集成的方法,但是在具體的模型構(gòu)造和參數(shù)調(diào)整的方法有所差別。
XGBoost的建模思路:就是在每輪迭代中生成一棵新的回歸樹,并綜合所有回歸樹的結(jié)果,使預(yù)測值越來越逼近真實(shí)值。
如何評判預(yù)測值與真實(shí)值的差距,并避免過擬合的存在呢?我們首先給出了一個泛化的目標(biāo)函數(shù)的定義,在此基礎(chǔ)上針對XGBoost提供了相應(yīng)的數(shù)學(xué)表達(dá)式,并進(jìn)行了泰勒二階展開。接下來,我們所需要做的工作就是在每一輪迭代中找到一棵合適的回歸樹,從而使得目標(biāo)函數(shù)進(jìn)一步最小化;
通過樹結(jié)構(gòu)q和樹葉權(quán)重w來描述一棵回歸樹。將樹葉權(quán)重帶入目標(biāo)函數(shù)后,發(fā)現(xiàn)一旦樹結(jié)構(gòu)q確定了,目標(biāo)函數(shù)能夠唯一確定。所以模型構(gòu)建問題最后轉(zhuǎn)化為:找到一個合理的回歸樹結(jié)構(gòu)q,使得它具有最小的目標(biāo)函數(shù)。對于這個問題,XGBoost提供了貪心算法來枚舉所有可能的樹結(jié)構(gòu)并找到最優(yōu)的那個。