小巧玲瓏:機器學習屆快刀XGBoost的介紹和使用


歡迎大家前往騰訊雲技術社區,獲取更多騰訊海量技術實踐干貨哦~

作者:張萌 

序言

XGBoost效率很高,在Kaggle等諸多比賽中使用廣泛,並且取得了不少好成績。為了讓公司的算法工程師,可以更加方便的使用XGBoost,我們將XGBoost更好地與公司已有的存儲資源和計算平台進行集成,將數據預處理、模型訓練、模型預測、模型評估及可視化、模型收藏及分享等功能,在Tesla平台中形成閉環,同時,數據的流轉實現了與TDW完全打通,讓整個機器學習的流程一體化。

XGBoost介紹

XGBoost的全稱為eXtreme Gradient Boosting,是GBDT的一種高效實現,XGBoost中的基學習器除了可以是CART(gbtree)也可以是線性分類器(gblinear)。

什么是GBDT?

  • GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一種迭代的決策樹算法,該算法由多棵決策樹組成,所有樹的結論累加起來做最終答案。它在被提出之初就和SVM一起被認為是泛化能力(generalization)較強的算法。GBDT的核心在於,每一棵樹學的是之前所有樹結論和的殘差,這個殘差就是一個加預測值后能得真實值的累加量。與隨機森林不同,隨機森林采用多數投票輸出結果;而GBDT則是將所有結果累加起來,或者加權累加起來。

XGBoost對GBDT的改進

1 . 避免過擬合

目標函數之外加上了正則化項整體求最優解,用以權衡目標函數的下降和模型的復雜程度,避免過擬合。基學習為CART時,正則化項與樹的葉子節點的數量T和葉子節點的值有關。

2 . 二階的泰勒展開,精度更高

不同於傳統的GBDT只利用了一階的導數信息的方式,XGBoost對損失函數做了二階的泰勒展開,精度更高。

第t次的損失函數:

對上式做二階泰勒展開( g為一階導數,h為二階導數):

3 . 樹節點分裂優化

選擇候選分割點針對GBDT進行了多個優化。正常的樹節點分裂時公式如下:

XGBoost樹節點分裂時,雖然也是通過計算分裂后的某種值減去分裂前的某種值,從而得到增益。但是相比GBDT,它做了如下改進:

  • 通過添加閾值gamma進行了剪枝來限制樹的生成
  • 通過添加系數lambda對葉子節點的值做了平滑,防止過擬合。
  • 在尋找最佳分割點時,考慮傳統的枚舉每個特征的所有可能分割點的貪心法效率太低,XGBoost實現了一種近似的算法,即:根據百分位法列舉幾個可能成為分割點的候選者,然后從候選者中根據上面求分割點的公式計算找出最佳的分割點。
  • 特征列排序后以塊的形式存儲在內存中,在迭代中可以重復使用;雖然boosting算法迭代必須串行,但是在處理每個特征列時可以做到並行。

整體上,通過上述的3個優化,加上其易用性,不太需要編程,XGBoost目前是GBDT體系中最受歡迎的工具。但是值得留意的是,當數據量很大,尤其是維度很高的情況下,XGBoost的性能會下降較快,這時推進大家可以試試騰訊自己的Angel,其GBDT比XGBoost性能更好噢

TDW體系中的XGBoost介紹

XGBoost在TDW體系中以兩種形式存在

  • 提供出了拖拽式的組件,來簡化用戶使用成本
  • 提供出了maven依賴,來讓用戶享受Spark Pipeline的流暢

1. Tesla平台上的3個組件:

  • XGBoost-spark-ppc組件(基於社區版0.7,以Spark作業形式運行在PowerPC機型的集群上)
  • XGBoost-spark-x86組件(基於社區版0.7,以Spark作業形式運行在x86機型的集群上)
  • XGBoost-yarn組件(基於社區版0.4,以Yarn作業形式運行在x86機型的集群上)

目前來看,XGBoost的ppc版本,性能比x86的好,建議大家優先選擇。

2. 公司Maven庫中的3個依賴:

  • XGBoost4j-ppc(封裝社區版0.7的API,在PowerPC機型上進行的編譯)
  • XGBoost4j-x86(封裝社區版0.7的API,在x86機型上進行的編譯)
  • XGBoost4j-toolkit(封裝HDFS IO、TDW IO、Model IO等功能)

Tesla中的XGBoost-on-spark組件介紹

Tesla中XGBoost-on-spark組件根據集群的機型區分成:XGBoost-spark-ppc組件和XGBoost-spark-x86組件。將以前的XGBoost-yarn組件進行了升級,體現在了:

數據源之間的打通、作業調試更友好、IO方式更豐富、數據處理的上下游延伸更廣、model支持在線服務等方面。

  1. 數據源之間的打通

    • 消除了不同HDFS集群上的權限問題
    • 與TDW打通,數據流轉更順暢,開發成本更低
      • 用戶可以不再編寫程序生成LibSVM格式的數據文件,而是通過Hive或者Spark SQL生成TDW特征表,通過選擇TDW特征表的某些列(selected_cols=1-2,4,8-10),由XGBoost-on-spark組件后台生成libsvm類型的輸入
      • 可以針對TDW分區表,借助Tesla作業定時調度機制,可以進行XGBoost作業的例行化調度運行
  2. 作業調試更友好

    • 以Spark作業的形式,而非直接的Yarn作業的形式運行,用戶對作業的運行情況更清楚
      • 可以查看作業的進度
      • 可以查看各節點上的日志信息
  3. IO方式更豐富

    • 輸入的數據集來源,可以為之前的HDFS上LibSVM格式的文件形式。也可以為一張TDW表,用戶通過選擇TDW表中的某些列,由XGBoost-on-spark組件在后台生成LibSVM格式的輸入。
    • 訓練階段增加了特征重要度(weight、gain、cover)的輸出、以及3種類型model的輸出:文本格式(用戶可以直接查看)、LocalFile的二進制格式(用戶可以下載到本地,利用python加載后在線預測)、HadoopFile的二進制格式(用戶可以在Tesla環境中,利用Spark加載后離線批量預測)
    • 模型輸出的3種格式舉例


4 . 數據處理的上下游延伸更廣

與Tesla平台深度整合

  • 可以拖拽Tesla的組件:數據切分、模型評估,實現數據處理的上下游功能
  • 可以利用Tesla的功能:參數替換、並發設置,進行批量調參

5 . model支持在線服務

  • 可以利用Tesla的模型服務,進行模型導出、模型部署、在線預測

總結

XGBoost是機器學習的利器,雖然小巧,但是功能強大,以其被實戰檢驗過的高效,吸引了很多使用者。我們針對用戶痛點進行了諸多改進,實現了用戶在Tesla平台中更加方便的使用,大大減少了用戶的開發成本,同時,我們也開放出了XGBoost API,讓邏輯復雜的業務可以在自身系統中嵌入xgBoost,更加直接的對接TDW系統。后續有進一步的需求,歡迎聯系Tesla團隊,我們將提供更好的機器學習和數據服務。

 

相關閱讀

當 AI 遇見體育

騰訊 AI Lab 副主任俞棟:過去兩年基於深度學習的聲學模型進展

基於騰訊開源 Angel 的 LDA* 入選國際頂級學術會議 VLDB


 此文已由作者授權騰訊雲技術社區發布,轉載請注明文章出處

原文鏈接:https://cloud.tencent.com/community/article/794649


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM