【机器学习】XGBoost集成算法——(理论+图解+python代码比较其他算法使用天池蒸汽数据)
一、集成算法思想
二、XGBoost基本思想
三、用python實(shí)現(xiàn)XGBoost算法
在競賽題中經(jīng)常會(huì)用到XGBoost算法,用這個(gè)算法通常會(huì)使我們模型的準(zhǔn)確率有一個(gè)較大的提升。既然它效果這么好,那么它從頭到尾做了一件什么事呢?以及它是怎么樣去做的呢?
我們先來直觀的理解一下什么是XGBoost。XGBoost算法是和決策樹算法聯(lián)系到一起的。?
XGBoost是boosting算法的其中一種。Boosting算法的思想是將許多弱分類器集成在一起形成一個(gè)強(qiáng)分類器。因?yàn)閄GBoost是一種提升樹模型,所以它是將許多樹模型集成在一起,形成一個(gè)很強(qiáng)的分類器。而所用到的樹模型則是CART回歸樹模型
一、集成算法思想
在決策樹中,我們知道一個(gè)樣本往左邊分或者往右邊分,最終到達(dá)葉子結(jié)點(diǎn),這樣來進(jìn)行一個(gè)分類任務(wù)。 其實(shí)也可以做回歸任務(wù)。
該算法思想就是不斷地添加樹,不斷地進(jìn)行特征分裂來生長一棵樹,每次添加一個(gè)樹,其實(shí)是學(xué)習(xí)一個(gè)新函數(shù),去擬合上次預(yù)測的殘差。當(dāng)我們訓(xùn)練完成得到k棵樹,我們要預(yù)測一個(gè)樣本的分?jǐn)?shù),其實(shí)就是根據(jù)這個(gè)樣本的特征,在每棵樹中會(huì)落到對(duì)應(yīng)的一個(gè)葉子節(jié)點(diǎn),每個(gè)葉子節(jié)點(diǎn)就對(duì)應(yīng)一個(gè)分?jǐn)?shù),最后只需要將每棵樹對(duì)應(yīng)的分?jǐn)?shù)加起來就是該樣本的預(yù)測值
?
如下圖例子,訓(xùn)練出了2棵決策樹,小孩的預(yù)測分?jǐn)?shù)就是兩棵樹中小孩所落到的結(jié)點(diǎn)的分?jǐn)?shù)相加。爺爺?shù)念A(yù)測分?jǐn)?shù)同理
?
看上面一個(gè)圖例左邊:有5個(gè)樣本,現(xiàn)在想看下這5個(gè)人愿不愿意去玩游戲,這5個(gè)人現(xiàn)在都分到了葉子結(jié)點(diǎn)里面,對(duì)不同的葉子結(jié)點(diǎn)分配不同的權(quán)重項(xiàng),正數(shù)代表這個(gè)人愿意去玩游戲,負(fù)數(shù)代表這個(gè)人不愿意去玩游戲。所以我們可以通過葉子結(jié)點(diǎn)和權(quán)值的結(jié)合,來綜合的評(píng)判當(dāng)前這個(gè)人到底是愿意還是不愿意去玩游戲。上面「tree1」那個(gè)小男孩它所處的葉子結(jié)點(diǎn)的權(quán)值是+2(可以理解為得分)。
用單個(gè)決策樹好像效果一般來說不是太好,或者說可能會(huì)太絕對(duì)。通常我們會(huì)用一種集成的方法,就是一棵樹效果可能不太好,用兩棵樹呢?
看圖例右邊的「tree2」,它和左邊的不同在于它使用了另外的指標(biāo),出了年齡和性別,還可以考慮使用電腦頻率這個(gè)劃分屬性。通過這兩棵樹共同幫我們決策當(dāng)前這個(gè)人愿不愿意玩游戲,小男孩在「tree1」的權(quán)值是+2,在「tree2」的權(quán)值是+0.9, 所以小男孩最終的權(quán)值是+2.9(可以理解為得分是+2.9)。老爺爺最終的權(quán)值也是通過一樣的過程得到的。
所以說,我們通常在做分類或者回歸任務(wù)的時(shí)候,需要想一想一旦選擇用一個(gè)分類器可能表達(dá)效果并不是很好,那么就要考慮用這樣一個(gè)集成的思想。上面的圖例只是舉了兩個(gè)分類器,其實(shí)還可以有更多更復(fù)雜的弱分類器,一起組合成一個(gè)強(qiáng)分類器。
?
二、XGBoost基本思想
XGBoost的集成表示是什么?怎么預(yù)測?求最優(yōu)解的目標(biāo)是什么?看下圖的說明你就能一目了然。
600
在XGBoost里,每棵樹是一個(gè)一個(gè)往里面加的,每加一個(gè)都是希望效果能夠提升,下圖就是XGBoost這個(gè)集成的表示(核心)。
一開始樹是0,然后往里面加樹,相當(dāng)于多了一個(gè)函數(shù),再加第二棵樹,相當(dāng)于又多了一個(gè)函數(shù)...等等,這里需要保證加入新的函數(shù)能夠提升整體對(duì)表達(dá)效果。提升表達(dá)效果的意思就是說加上新的樹之后,目標(biāo)函數(shù)(就是損失)的值會(huì)下降。
如果葉子結(jié)點(diǎn)的個(gè)數(shù)太多,那么過擬合的風(fēng)險(xiǎn)會(huì)越大,所以這里要限制葉子結(jié)點(diǎn)的個(gè)數(shù),所以在原來目標(biāo)函數(shù)里要加上一個(gè)懲罰項(xiàng)「omega(ft)」。
?
這里舉個(gè)簡單的例子看看懲罰項(xiàng)「omega(ft)」是如何計(jì)算的:
一共3個(gè)葉子結(jié)點(diǎn),權(quán)重分別是2,0.1,-1,帶入「omega(ft)」中就得到上面圖例的式子,懲罰力度和「lambda」的值人為給定。
XGBoost算法完整的目標(biāo)函數(shù)見下面這個(gè)公式,它由自身的損失函數(shù)和正則化懲罰項(xiàng)「omega(ft)」相加而成。
關(guān)于目標(biāo)函數(shù)的推導(dǎo)本文章不作詳細(xì)介紹。過程就是:給目標(biāo)函數(shù)對(duì)權(quán)重求偏導(dǎo),得到一個(gè)能夠使目標(biāo)函數(shù)最小的權(quán)重,把這個(gè)權(quán)重代回到目標(biāo)函數(shù)中,這個(gè)回代結(jié)果就是求解后的最小目標(biāo)函數(shù)值,如下:
其中第三個(gè)式子中的一階導(dǎo)二階導(dǎo)的梯度數(shù)據(jù)都是可以算出來的,只要指定了主函數(shù)中的兩個(gè)參數(shù),這就是一個(gè)確定的值。下面給出一個(gè)直觀的例子來看下這個(gè)過程。
(這里多說一句:Obj代表了當(dāng)我們指定一個(gè)樹的結(jié)構(gòu)的時(shí)候,在目標(biāo)上最多會(huì)減少多少,我們可以把它叫做結(jié)構(gòu)分?jǐn)?shù),這個(gè)分?jǐn)?shù)越小越好)
對(duì)于每次擴(kuò)展,我們依舊要枚舉所有可能的方案。對(duì)于某個(gè)特定的分割,我們要計(jì)算出這個(gè)分割的左子樹的導(dǎo)數(shù)和和右子數(shù)導(dǎo)數(shù)和之和(就是下圖中的第一個(gè)紅色方框),然后和劃分前的進(jìn)行比較(基于損失,看分割后的損失和分割前的損失有沒有發(fā)生變化,變化了多少)。遍歷所有分割,選擇變化最大的作為最合適的分割。
?
?GBDT與XGbost的區(qū)別
三、用python實(shí)現(xiàn)XGBoost算法代碼
使用天池競賽的蒸汽數(shù)據(jù)
xgboost回歸對(duì)比線性回歸 Ada、?GradientBoostingRegressor
train = pd.read_csv('./zhengqi_train.txt',sep = '\t')X = train.iloc[:,0:-1] y = train['target'] X_train,X_test,y_train,y_test = train_test_split(X,y,test_size =0.2)from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_errorlinear = LinearRegression() linear.fit(X_train,y_train)print('r2_score',linear.score(X_test,y_test)) y1_ = linear.predict(X_test) mean_squared_error(y_test,y1_)r2_score 0.9035544162615812
from sklearn.ensemble import AdaBoostRegressor ada = AdaBoostRegressor() ada.fit(X_train,y_train)print('ada_score',ada.score(X_test,y_test)) y2_ = ada.predict(X_test) mean_squared_error(y_test,y2_)ada_score 0.8469280190502533
0.15315981475425688
from xgboost import XGBRegressor xgb = XGBRegressor() xgb.fit(X_train,y_train)print('xgb_score',xgb.score(X_test,y_test)) y3_ = xgb.predict(X_test) mean_squared_error(y_test,y3_)xgb_score 0.896815295803221
0.10324391232279032
from sklearn.ensemble import GradientBoostingRegressor gbdt = GradientBoostingRegressor() gbdt.fit(X_train,y_train)print('gbdt_score',gbdt.score(X_test,y_test)) y4_ = gbdt.predict(X_test) mean_squared_error(y_test,y4_)gbdt_score 0.8947755352826943
0.10528484327258612
推薦:
一文讀懂機(jī)器學(xué)習(xí)大殺器XGBoost原理
總結(jié)
以上是生活随笔為你收集整理的【机器学习】XGBoost集成算法——(理论+图解+python代码比较其他算法使用天池蒸汽数据)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows10商店应用离线安装方法
- 下一篇: HCNA每日一练错误