導讀: 本文介紹了集成學習中比較具有代表性的方法,如Boosting、Bagging等。而XGBoost是集成學習中的佼佼者, 目前,一些主流的互聯網公司如騰訊、阿里巴巴等都已將XGBoost應用到其業務中。 本文對XGBoost的歷史演化、應用場景及其優良特性進行了闡述,爲入門XGBoost並進一步學習打下基礎。

01 集成學習

集成學習的基本思想是把多個學習器通過一定方法進行組合,以達到最終效果的提升。 雖然每個學習器對全局數據的預測精度不高,但在某一方面的預測精度可能比較高,俗話說“三個臭皮匠頂個諸葛亮”,將多個學習器進行組合,通過優勢互補即可達到強學習器的效果。

集成學習最早來自於Valiant提出的 PAC (Probably Approximately Correct)學習模型,該模型首次定義了 弱學習 強學習 的概念:識別準確率僅比隨機猜測高一些的學習算法爲弱學習算法;識別準確率很高並能在多項式時間內完成的學習算法稱爲強學習算法。

該模型提出給定任意的弱學習算法,能否將其提升爲強學習算法的問題。1990年,Schapire對其進行了肯定的證明。

這樣一來, 我們只需要先找到一個弱學習算法,再將其提升爲強學習算法,而不用一開始就找強學習算法 ,因爲強學習算法比弱學習算法更難找到。目前集成學習中最具代表性的方法是:Boosting、Bagging和Stacking。

1. Boosting

簡單來講, Boosting會訓練一系列的弱學習器,並將所有學習器的預測結果組合起來作爲最終預測結果 ,在學習過程中,後期的學習器更關注先前學習器學習中的錯誤。

1995年,Freund等人提出了AdaBoost,成爲了Boosting代表性的算法。AdaBoost繼承了Boosting的思想,併爲每個弱學習器賦予不同的權值,將所有弱學習器的權重和作爲預測的結果,達到強學習器的效果。

Gradient Boosting是Boosting思想的另外一種實現方法,由Friedman於1999年提出。與AdaBoost類似,Gradient Boosting也是將弱學習器通過一定方法的融合,提升爲強學習器。

與AdaBoost不同的是,它將損失函數梯度下降的方向作爲優化的目標,新的學習器建立在之前學習器損失函數梯度下降的方向,代表算法有 GBDT XGBoost (XGBoost會在下文詳細介紹)等。

一般認爲,Boosting可以有效提高模型的準確性,但各個學習器之間只能串行生成,時間開銷較大。

2. Bagging

Bagging(Bootstrap Aggregating)對數據集進行有放回採樣,得到多個數據集的隨機採樣子集,用這些隨機子集分別對多個學習器進行訓練(對於分類任務,採用簡單投票法;對於迴歸任務採用簡單平均法),從而得到最終預測結果。

隨機森林是Bagging最具代表性的應用 ,將Bagging的思想應用於決策樹,並進行了一定的擴展。一般情況下,Bagging模型的精度要比Boosting低,但其各學習器可並行進行訓練,節省大量時間開銷。

3. Stacking

Stacking的思想是通過訓練集訓練好所有的基模型,然後用基模型的預測結果生成一個新的數據,作爲組合器模型的輸入,用以訓練組合器模型,最終得到預測結果。組合器模型通常採用邏輯迴歸。

下面我們來具體瞭解下XGBoost。

02 XGBoost

XGBoost(Extreme Gradient Boosting)由華盛頓大學的陳天奇博士提出,最開始作爲分佈式(深度)機器學習研究社區(DMLC)小組的研究項目之一。後因在希格斯(Higgs)機器學習挑戰賽中大放異彩,被業界所熟知,在數據科學應用中廣泛應用。

目前,一些主流的互聯網公司如騰訊、阿里巴巴等都已將XGBoost應用到其業務中 ,在各種數據科學競賽中,XGBoost也成爲競賽者們奪冠的利器。

XGBoost在推薦、搜索排序、用戶行爲預測、點擊率預測、產品分類等問題上取得了良好的效果。

雖然這些年神經網絡(尤其是深度神經網絡)變得越來越流行,但XGBoost仍舊在訓練樣本有限、訓練時間短、調參知識缺乏的場景下具有獨特的優勢。相比深度神經網絡,XGBoost能夠更好地處理表格數據,並具有更強的可解釋性,另外具有易於調參、輸入數據不變性等優勢。

XGBoost是Gradient Boosting的實現,相比其他實現方法,XGBoost做了很多優化,在模型訓練速度和精度上都有明顯提升,其 優良特性 如下。

  1. 將正則項加入目標函數中,控制模型的複雜度,防止過擬合。

  2. 對目標函數進行二階泰勒展開,同時用到了一階導數和二階導數。

  3. 實現了可並行的近似直方圖算法。

  4. 實現了縮減和列採樣(借鑑了GBDT和隨機森林)。

  5. 實現了快速直方圖算法,引入了基於loss-guide的樹構建方法(借鑑了LightGBM)。

  6. 實現了求解帶權值的分位數近似算法(weighted quantile sketch)。

  7. 可根據樣本自動學習缺失值的分裂方向,進行缺失值處理。

  8. 數據預先排序,並以塊(block)的形式保存,有利於並行計算。

  9. 採用緩存感知訪問、外存塊計算等方式提高數據訪問和計算效率。

  10. 基於Rabit實現分佈式計算,並集成於主流大數據平臺中。

  11. 除CART作爲基分類器外,XGBoost還支持線性分類器及LambdaMART排序模型等算法。

  12. 實現了DART,引入Dropout技術。

目前已經有越來越多的開發人員爲XGBoost開源社區做出了貢獻。 XGBoost實現了多種語言的包,如Python、Scala、Java等。 Python用戶可將XGBoost與scikit-learn集成,實現更爲高效的機器學習應用。另外,XGBoost集成到了Spark、Flink等主流大數據平臺中。

附上XGBoost的 學習路徑:

03 XGBoost運行環境搭建

XGBoost安裝分爲兩種方式,一種是直接通過pip安裝(適用於Ptyhon),另一種是直接編譯源碼安裝。

1. 通過pip安裝

通過pip安裝Python包既簡單又方便。如果讀者準備在Python環境下使用XGBoost,即可以採用此方法。只需執行如下命令:

pip install xgboost

若Python版本爲3.X,則執行命令爲pip3 install xgboost。安裝完畢後,即可在Python裏直接引用XGBoost包,如下:

import xgboost as xgb

2. 通過源碼編譯安裝

雖然通過pip安裝XGBoost雖然方便,但其安裝的XGBoost可能並非最新版本。源碼編譯安裝XGBoost主要分爲兩個步驟:① 通過C++代碼構建共享庫;② 安裝相應語言包。

1)構建共享庫

Linux下首先通過Git將XGBoost項目從github上克隆下來。因爲XGBoost使用了Git submodules來管理依賴,因此在執行克隆時需加上--recursive選項,然後通過make對源碼直接編譯,如下:

git clone --recursive https://github.com/dmlc/xgboost
cd xgboost
make

2)Python包安裝

共享庫編譯完成之後,即可安裝相應的語言包,此處以Python包爲例。XGBoost使用Distutils來實現Python環境中的構建和安裝,對於用戶來講安裝過程十分簡單。XGBoost的Python包在python-package中,用戶只需進入該目錄然後執行安裝命令即可,如下:

cd python-package
sudo python setup.py install

04 XGBoost告訴你蘑菇是否有毒

XGBoost安裝完成後,本節通過一個簡單的示例,介紹如何使用XGBoost解決機器學習問題。該示例使用的是XGBoost自帶的數據集(位於/demo/data文件夾下),該數據集描述的是不同蘑菇的相關特徵,比如大小、顏色等,並且每一種蘑菇都會被標記爲可食用的(標記爲0)或有毒的(標記爲1)。

我們的任務是對蘑菇特徵數據進行學習,訓練相關模型,然後利用訓練好的模型預測未知的蘑菇樣本是否具有毒性。 下面用XGBoost解決該問題,如下:

import xgboost as xgb
# 數據讀取
xgb_train = xgb.DMatrix('${XGBOOST_PATH}/demo/data/agaricus.txt.train ')
xgb_test = xgb.DMatrix('${XGBOOST_PATH}/demo/data/agaricus.txt.test ')

# 定義模型訓練參數
params = {
    "objective": "binary:logistic",
    "booster": "gbtree",
    "max_depth": 3
         }
# 訓練輪數
num_round = 5

# 訓練過程中實時輸出評估結果
watchlist = [(xgb_train, 'train'), (xgb_test, 'test')]

# 模型訓練
model = xgb.train(params, xgb_train, num_round, watchlist)

首先讀取訓練集和測試集數據 (其中${XGBOOST_PATH}代表XGBoost的根目錄路徑),XGBoost會將數據加載爲自定義的矩陣DMatrix。 數據加載完畢後,定義模型訓練參數, 然後對模型進行訓練 ,訓練過程的輸出如圖1所示。

▲圖1 訓練過程輸出

由圖1中可以看到,XGBoost訓練過程中實時輸出了訓練集和測試集的錯誤率評估結果。隨着訓練的進行,訓練集和測試集的錯誤率均在不斷下降,說明模型對於特徵數據的學習是十分有效的。 最後,模型訓練完畢後,即可通過訓練好的模型對測試集數據進行預測。 預測代碼如下:

# 模型預測
preds = model.predict(xgb_test)
preds

輸出:

array([ 0.10455427,  0.80366629,  0.10455427, ...,  0.89609396,
        0.10285233,  0.89609396], dtype=float32)

可以看到,預測結果爲一個浮點數的數組,其數組大小和測試集的樣本數量是一致的。數組中的值均在0~1的區間內,每個值對應一個樣本。該值可以看作是模型對於該樣本的預測概率,即模型認爲該蘑菇是有毒蘑菇的概率。

關於作者: 何龍,現就職於滴滴出行,XGBoost開源社區貢獻者,專注於人工智能和機器學習領域,從底層算法原理到上層應用實踐都有廣泛的興趣和研究。較早接觸XGBoost,熟悉XGBoost應用開發,深入閱讀源碼,具有豐富的項目開發經驗。

本文摘編自 深入理解XGBoost:高效機器學習算法與進階 ,經出版方授權發佈。

延伸閱讀《 深入理解XGBoost

點擊上方鏈接 瞭解及購買

推薦語: 知名互聯網公司資深工程師撰寫,打通高效機器學習脈絡,掌握競賽神器XGBoost。以機器學習基礎知識做鋪墊,深入剖析XGBoost原理、分佈式實現、模型優化、深度應用等。

有話要說 :point_down:

Q:  你想用XGBoost實現哪些神操作?

歡迎留言與大家分享

更多精彩 :point_down:

今晚8點,機器學習主題分享

AI學習路線和優質資源,在後臺回覆"AI"獲取

相關文章