Boosted Tree

作為一個非常有效的機器學習方法,Boosted Tree是數據挖掘和機器學習中最常用的算法之一。因為它效果好,對于輸入要求不敏感,往往是從統計學家到數據科學家必備的工具之一,它同時也是Kaggle比賽冠軍選手最常用的工具。Boosted Tree有各種馬甲,比如GBDT(Gradient Boosting Decision Tree), GBRT(Gradient Boosting Regression Tree)以及MART(Multiple Additive Regression Tree)。很多介紹Boosted tree的資料都是源于Friedman的較早的一篇文章[1]。

1. 分類和回歸樹(CART)

圖 1. CART示意圖

上面就是一個CART的例子。CART會把輸入根據輸入的屬性分配到各個葉子節點,而每個葉子節點上面都會對應一個實數分數。問題:預測一個人是否會喜歡電腦游戲。可以把葉子的分數理解為這個人喜歡電腦游戲的可能性。CART可以理解為是decision tree的一個擴展。從簡單的類標到分數之后,似乎能做更多的事情了(例如概率預測或是排序)。

2. Tree ensemble

同樣類比Random Forest的思想,當一棵樹解決不了問題時,可以將幾棵樹聯起來。


圖2. Tree ensemble示意圖

圖2的例子中,我們用兩棵樹來進行預測。我們對于每個樣本的預測結果就是每棵樹預測分數的和。我們常見的隨機森林和boosted tree和tree ensemble有什么關系呢?它們都是ensemble,只是構造模型參數的方法不同。

3. 模型學習

模型中的參數是什么?在tree ensemble中,參數對應了樹的結構,以及每個葉子節點上面的預測分數。同樣需要先定義合理的目標函數(一般會包括loss function 以及 regularizer ),然后嘗試優化目標函數。對于tree ensemble,可以將模型寫成為:



其中每個fk對應了一棵regression tree。

采用一種叫做additive training的方式(實際上boosting含義就是指additive training)。如每一次保留原來的模型不變,加入一個新的函數fk到我們的模型中。

圖3. Additive training示意圖
3.1 目標函數的定義

在圖3中,如何選擇每一輪加入什么樣的fk呢?可以選取一個fk來使得我們的目標函數最大化的降低 。目標函數包括損失函數和正則化項。

圖4. 目標函數的構成

目標函數 = 損失函數 + 正則項


目標函數
圖5. 近似目標函數
3.2 樹的復雜度

樹的復雜度就是目標函數中的正則化項。將樹拆分成結構部分q 和葉子權重部分 w 。圖6是一個具體的例子。結構函數q把輸入映射到葉子的索引號上面去,而w給定了每個索引號對應的葉子分數是什么,使得fk成為一種條件函數。

圖6. q與w定義示意圖

定義一棵樹的復雜度,考慮復雜度包含了一棵樹節點的個數T,以及每個樹葉子節點上面輸出分數w,如圖7所示。

圖7. 樹的復雜度定義

3.3 目標函數的最終形式
將正則項代入到目標函數中,確定目標函數的最終形式為

圖8. 目標函數最小值推導

現在剩下最后一個問題就是樹的結構劃分。通過不斷地枚舉不同樹的結構,比較目標函數值來尋找一個最優結構的樹。暴力枚舉的時間開銷太大,同decision tree一樣采用貪心算法,每一次嘗試對已有的葉子加入一個分割。這樣,對于一個分割方案,我們可以獲得的增益可以由如下所示。

圖9. 劃分后的Gain示意圖
圖10.葉子節點劃分示意圖.png

4.xgboost

xgboost是大規模并行boosted tree的工具,它是目前最快最好的開源boosted tree工具包,比常見的工具包快10倍以上。在數據科學方面,有大量kaggle選手選用它進行數據挖掘比賽,其中包括兩個以上kaggle比賽的奪冠方案。在工業界規模方面,xgboost的分布式版本有廣泛的可移植性,支持在YARN, MPI, Sungrid Engine等各個平臺上面運行,并且保留了單機并行版本的各種優化,使得它可以很好地解決于工業界規模的問題。XGBoost 所應用的算法就是 gradient boosting decision tree,既可以用于分類也可以用于回歸問題中。

應用案例:

先來用 Xgboost 做一個簡單的二分類問題,以下面這個數據為例,來判斷病人是否會在 5 年內患病,這個數據前 8 列是自變量,最后一列是預測值為 0 或 1。
數據描述:
https://archive.ics.uci.edu/ml/datasets/Pima+Indians+Diabetes
下載數據集,并保存為 “pima-indians-diabetes.csv“ 文件:
https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-diabetes/pima-indians-diabetes.data

  • 基礎應用
#引入 xgboost 等包
from numpy import loadtxt
from xgboost import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#分出變量和標簽
dataset = loadtxt('pima-indians-diabetes.csv', delimiter=",")
X = dataset[:,0:8]
Y = dataset[:,8]
#將數據劃分為訓練集(67%)和測試集(33%)
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 建立模型
model = XGBClassifier()
model.fit(X_train, y_train)
#xgboost 的結果是樣本分類的概率值
y_pred = model.predict(X_test)
predictions = [round(value) for value in y_pred]
accuracy = accuracy_score(y_test, predictions)
print("Accuracy: %.2f%%" % (accuracy * 100.0))
  • 輸出特征重要度
    gradient boosting可以給出訓練好的模型的特征重要性,可以提供feature selection。僅需要需要引入:from xgboost import plot_importance和前面的代碼相比,就是在 fit 后面加入兩行畫出特征的重要性
plot_importance(model)
pyplot.show()

5. 學習資源

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
應用示例:
https://github.com/dmlc/xgboost/tree/master/demo
最好的資源當然就是項目的 Github 主頁:
https://github.com/dmlc/xgboost

6. 參考文獻

【1】http://machinelearningmastery.com/develop-first-xgboost-model-python-scikit-learn/
【2】https://www.zhihu.com/question/37683881
【3】Friedman J H. Greedy Function Approximation: A Gradient Boosting Machine[J]. Annals of Statistics, 2001, 29(5): 1189-1232
【4】http://www.lxweimin.com/p/7e0e2d66b3d4
【5】https://xgboost.readthedocs.io/en/latest/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,182評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,489評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,290評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,776評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,510評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,866評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,860評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,036評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,585評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,331評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,536評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,058評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,754評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,154評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,469評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,273評論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,505評論 2 379

推薦閱讀更多精彩內容