Kaggle 神器 xgboost

在 Kaggle 的很多比賽中刊橘,我們可以看到很多 winner 喜歡用 xgboost拆檬,而且獲得非常好的表現(xiàn)于樟,今天就來(lái)看看 xgboost 到底是什么以及如何應(yīng)用务冕。

本文結(jié)構(gòu):

  • 什么是 xgboost书释?
  • 為什么要用它翘贮?
  • 怎么應(yīng)用?
  • 學(xué)習(xí)資源

什么是 xgboost爆惧?

XGBoost :eXtreme Gradient Boosting
項(xiàng)目地址:https://github.com/dmlc/xgboost

是由 Tianqi Chen http://homes.cs.washington.edu/~tqchen/ 最初開發(fā)的實(shí)現(xiàn)可擴(kuò)展狸页,便攜,分布式 gradient boosting (GBDT, GBRT or GBM) 算法的一個(gè)庫(kù)扯再,可以下載安裝并應(yīng)用于 C++芍耘,Python,R熄阻,Julia斋竞,Java,Scala秃殉,Hadoop坝初,現(xiàn)在有很多協(xié)作者共同開發(fā)維護(hù)浸剩。

XGBoost 所應(yīng)用的算法就是 gradient boosting decision tree,既可以用于分類也可以用于回歸問(wèn)題中鳄袍。

那什么是 Gradient Boosting绢要?

Gradient boosting 是 boosting 的其中一種方法

所謂 Boosting ,就是將弱分離器 f_i(x) 組合起來(lái)形成強(qiáng)分類器 F(x) 的一種方法拗小。

所以 Boosting 有三個(gè)要素

  • A loss function to be optimized:
    例如分類問(wèn)題中用 cross entropy重罪,回歸問(wèn)題用 mean squared error。

  • A weak learner to make predictions:
    例如決策樹十籍。

  • An additive model:
    將多個(gè)弱學(xué)習(xí)器累加起來(lái)組成強(qiáng)學(xué)習(xí)器蛆封,進(jìn)而使目標(biāo)損失函數(shù)達(dá)到極小。

Gradient boosting 就是通過(guò)加入新的弱學(xué)習(xí)器勾栗,來(lái)努力糾正前面所有弱學(xué)習(xí)器的殘差惨篱,最終這樣多個(gè)學(xué)習(xí)器相加在一起用來(lái)進(jìn)行最終預(yù)測(cè),準(zhǔn)確率就會(huì)比單獨(dú)的一個(gè)要高围俘。之所以稱為 Gradient砸讳,是因?yàn)樵谔砑有履P蜁r(shí)使用了梯度下降算法來(lái)最小化的損失。


為什么要用 xgboost界牡?

前面已經(jīng)知道簿寂,XGBoost 就是對(duì) gradient boosting decision tree 的實(shí)現(xiàn),但是一般來(lái)說(shuō)宿亡,gradient boosting 的實(shí)現(xiàn)是比較慢的常遂,因?yàn)槊看味家葮?gòu)造出一個(gè)樹并添加到整個(gè)模型序列中。

而 XGBoost 的特點(diǎn)就是計(jì)算速度快挽荠,模型表現(xiàn)好克胳,這兩點(diǎn)也正是這個(gè)項(xiàng)目的目標(biāo)。

表現(xiàn)快是因?yàn)樗哂羞@樣的設(shè)計(jì):

  • Parallelization:
    訓(xùn)練時(shí)可以用所有的 CPU 內(nèi)核來(lái)并行化建樹圈匆。
  • Distributed Computing :
    用分布式計(jì)算來(lái)訓(xùn)練非常大的模型漠另。
  • Out-of-Core Computing:
    對(duì)于非常大的數(shù)據(jù)集還可以進(jìn)行 Out-of-Core Computing。
  • Cache Optimization of data structures and algorithms:
    更好地利用硬件跃赚。

下圖就是 XGBoost 與其它 gradient boosting 和 bagged decision trees 實(shí)現(xiàn)的效果比較笆搓,可以看出它比 R, Python,Spark纬傲,H2O 中的基準(zhǔn)配置要更快满败。

另外一個(gè)優(yōu)點(diǎn)就是在預(yù)測(cè)問(wèn)題中模型表現(xiàn)非常好,下面是幾個(gè) kaggle winner 的賽后采訪鏈接叹括,可以看出 XGBoost 的在實(shí)戰(zhàn)中的效果算墨。


怎么應(yīng)用?

先來(lái)用 Xgboost 做一個(gè)簡(jiǎn)單的二分類問(wèn)題领猾,以下面這個(gè)數(shù)據(jù)為例米同,來(lái)判斷病人是否會(huì)在 5 年內(nèi)患糖尿病骇扇,這個(gè)數(shù)據(jù)前 8 列是變量,最后一列是預(yù)測(cè)值為 0 或 1面粮。

數(shù)據(jù)描述:
https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes

下載數(shù)據(jù)集少孝,并保存為 “pima-indians-diabetes.csv“ 文件:
https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data

1. 基礎(chǔ)應(yīng)用

引入 xgboost 等包

from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

分出變量和標(biāo)簽

dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")

X = dataset[:,0:8]
Y = dataset[:,8]

將數(shù)據(jù)分為訓(xùn)練集和測(cè)試集,測(cè)試集用來(lái)預(yù)測(cè)熬苍,訓(xùn)練集用來(lái)學(xué)習(xí)模型

seed = 7
test_size = 0.33
X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)

xgboost 有封裝好的分類器和回歸器稍走,可以直接用 XGBClassifier 建立模型
這里是 XGBClassifier 的文檔:
http://xgboost.readthedocs.io/en/latest/python/python_api.html#module-xgboost.sklearn

model = XGBClassifier()
model.fit(X_train, y_train)

xgboost 的結(jié)果是每個(gè)樣本屬于第一類的概率,需要用 round 將其轉(zhuǎn)換為 0 1 值

y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]

得到 Accuracy: 77.95%

accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
2. 監(jiān)控模型表現(xiàn)

xgboost 可以在模型訓(xùn)練時(shí)柴底,評(píng)價(jià)模型在測(cè)試集上的表現(xiàn)婿脸,也可以輸出每一步的分?jǐn)?shù)

只需要將

model = XGBClassifier()
model.fit(X_train, y_train)

變?yōu)椋?/strong>

model = XGBClassifier()
eval_set = [(X_test, y_test)]
model.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="logloss", eval_set=eval_set, verbose=True)

那么它會(huì)在每加入一顆樹后打印出 logloss

[31]    validation_0-logloss:0.487867
[32]    validation_0-logloss:0.487297
[33]    validation_0-logloss:0.487562

并打印出 Early Stopping 的點(diǎn):

Stopping. Best iteration:
[32]    validation_0-logloss:0.487297
3. 輸出特征重要度

gradient boosting 還有一個(gè)優(yōu)點(diǎn)是可以給出訓(xùn)練好的模型的特征重要性,
這樣就可以知道哪些變量需要被保留柄驻,哪些可以舍棄

需要引入下面兩個(gè)類

from xgboost import plot_importance
from matplotlib import pyplot

和前面的代碼相比狐树,就是在 fit 后面加入兩行畫出特征的重要性

model.fit(X, y)

plot_importance(model)
pyplot.show()
4. 調(diào)參

如何調(diào)參呢,下面是三個(gè)超參數(shù)的一般實(shí)踐最佳值鸿脓,可以先將它們?cè)O(shè)定為這個(gè)范圍抑钟,然后畫出 learning curves,再調(diào)解參數(shù)找到最佳模型:

  • learning_rate = 0.1 或更小野哭,越小就需要多加入弱學(xué)習(xí)器在塔;
  • tree_depth = 2~8;
  • subsample = 訓(xùn)練集的 30%~80%拨黔;

接下來(lái)我們用 GridSearchCV 來(lái)進(jìn)行調(diào)參會(huì)更方便一些:

可以調(diào)的超參數(shù)組合有:

樹的個(gè)數(shù)和大小 (n_estimators and max_depth).
學(xué)習(xí)率和樹的個(gè)數(shù) (learning_rate and n_estimators).
行列的 subsampling rates (subsample, colsample_bytree and colsample_bylevel).

下面以學(xué)習(xí)率為例:

先引入這兩個(gè)類

from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import StratifiedKFold

設(shè)定要調(diào)節(jié)的 learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]
和原代碼相比就是在 model 后面加上 grid search 這幾行:

model = XGBClassifier()
learning_rate = [0.0001, 0.001, 0.01, 0.1, 0.2, 0.3]
param_grid = dict(learning_rate=learning_rate)
kfold = StratifiedKFold(n_splits=10, shuffle=True, random_state=7)
grid_search = GridSearchCV(model, param_grid, scoring="neg_log_loss", n_jobs=-1, cv=kfold)
grid_result = grid_search.fit(X, Y)

最后會(huì)給出最佳的學(xué)習(xí)率為 0.1
Best: -0.483013 using {'learning_rate': 0.1}

print("Best: %f using %s" % (grid_result.best_score_, grid_result.best_params_))

我們還可以用下面的代碼打印出每一個(gè)學(xué)習(xí)率對(duì)應(yīng)的分?jǐn)?shù):

means = grid_result.cv_results_['mean_test_score']
stds = grid_result.cv_results_['std_test_score']
params = grid_result.cv_results_['params']
for mean, stdev, param in zip(means, stds, params):
    print("%f (%f) with: %r" % (mean, stdev, param))
-0.689650 (0.000242) with: {'learning_rate': 0.0001}
-0.661274 (0.001954) with: {'learning_rate': 0.001}
-0.530747 (0.022961) with: {'learning_rate': 0.01}
-0.483013 (0.060755) with: {'learning_rate': 0.1}
-0.515440 (0.068974) with: {'learning_rate': 0.2}
-0.557315 (0.081738) with: {'learning_rate': 0.3}

前面就是關(guān)于 xgboost 的一些基礎(chǔ)概念和應(yīng)用實(shí)例蛔溃,下面還有一些學(xué)習(xí)資源供參考:

學(xué)習(xí)資源:

Tianqi Chen 的講座:
https://www.youtube.com/watch?v=Vly8xGnNiWs&feature=youtu.be
講義:
https://speakerdeck.com/datasciencela/tianqi-chen-xgboost-overview-and-latest-news-la-meetup-talk

入門教程:
https://xgboost.readthedocs.io/en/latest/

安裝教程:
http://xgboost.readthedocs.io/en/latest/build.html

應(yīng)用示例:
https://github.com/dmlc/xgboost/tree/master/demo

最好的資源當(dāng)然就是項(xiàng)目的 Github 主頁(yè):
https://github.com/dmlc/xgboost

參考:
http://machinelearningmastery.com/develop-first-xgboost-model-python-scikit-learn/
https://www.zhihu.com/question/37683881


推薦閱讀 歷史技術(shù)博文鏈接匯總
http://www.reibang.com/p/28f02bb59fe5
也許可以找到你想要的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市篱蝇,隨后出現(xiàn)的幾起案子贺待,更是在濱河造成了極大的恐慌,老刑警劉巖态兴,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狠持,死亡現(xiàn)場(chǎng)離奇詭異疟位,居然都是意外死亡瞻润,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門甜刻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)绍撞,“玉大人,你說(shuō)我怎么就攤上這事得院∩迪常” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵祥绞,是天一觀的道長(zhǎng)非洲。 經(jīng)常有香客問(wèn)我鸭限,道長(zhǎng),這世上最難降的妖魔是什么两踏? 我笑而不...
    開封第一講書人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任败京,我火速辦了婚禮,結(jié)果婚禮上梦染,老公的妹妹穿的比我還像新娘赡麦。我一直安慰自己,他們只是感情好帕识,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開白布泛粹。 她就那樣靜靜地躺著,像睡著了一般肮疗。 火紅的嫁衣襯著肌膚如雪晶姊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評(píng)論 1 308
  • 那天伪货,我揣著相機(jī)與錄音帽借,去河邊找鬼。 笑死超歌,一個(gè)胖子當(dāng)著我的面吹牛砍艾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播巍举,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼脆荷,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了懊悯?” 一聲冷哼從身側(cè)響起蜓谋,我...
    開封第一講書人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎炭分,沒(méi)想到半個(gè)月后桃焕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捧毛,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年观堂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呀忧。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡师痕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出而账,到底是詐尸還是另有隱情胰坟,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布泞辐,位于F島的核電站笔横,受9級(jí)特大地震影響竞滓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吹缔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一虽界、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧涛菠,春花似錦莉御、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至迄薄,卻和暖如春琅关,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讥蔽。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工涣易, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壳炎,地道東北人厂财。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像虐块,于是被迫代替她去往敵國(guó)和親响禽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子徒爹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容