1. 程式人生 > >論文閱讀-XGBoost: A Scalable Tree Boosting System

論文閱讀-XGBoost: A Scalable Tree Boosting System

1 , 簡介

Tianqi Chen大神提出了一種可擴充套件性的端到端基於樹的boosting系統,這個系統可以處理稀疏性資料,通過分散式加權直方圖演算法去近似學習樹,這個系統也提供基於快取的加速模式、資料壓縮、分片功能。機器學習應用於垃圾郵件分類、基於上下文植入廣告、阻止銀行惡意襲擊的漏洞檢測系統、探測引發物理顯現的事件。有兩個重要的因子驅動這些成功的應用:發現數據之間相關性的模型、從大量資料集中學習到有趣的模型。

梯度boosting迴歸樹已經被證明在大量的系統中有好的效果,例如:標準分類基準、應用於排序的boosting樹變體、應用於廣告點選預測,當然boosting樹是整合學習方法的一種,大量應用於比賽。XGboost已經應用於大量的實戰系統,在29個kaggle比賽中,17個獲勝者使用了XGboost,這些獲勝者一部分單獨使用XGboost或者通過與神經網路整合,比賽的獲勝者也指出有小部分的繼承學習的演算法效果比XGboost好。

XGboost能夠在一系列的問題上取得良好的效果,這些問題包括存銷預測、物理事件分類、網頁文字分類、顧客行為預測、點選率預測、動機探測、產品分類。多領域依賴資料分析和特徵工程在這些結果中扮演重要的角色。XGboost在所有場景中提供可擴充套件的功能,XGBoost可擴充套件性保證了相比其他系統更快速,XGBoost演算法優勢具體體現在:處理稀疏資料的新奇的樹的學習演算法、近似學習的分散式加權直方圖。XGBoost能夠基於外存的計算,保障了大資料的計算,使用少量的節點資源可處理大量的資料。XGBoost的主要貢獻:

構建了高可擴充套件的端到端的boosting系統。

提出了具有合理理論支撐的分佈分位調整框架。

介紹了一個新奇的並行適應稀疏處理樹學習演算法。

提出了基於快取快的結構便於外存樹的學習。

已經有人做了並行樹、基於外存的計算、快取的計算、稀疏特徵的學習等一些列工作,這篇文章最重要的是能夠把很多特徵結合到一個系統中。

文章的組織結構:boosting樹的正則化(防止過擬合)、樹的split方法(decision Tree 使用Gini劃分)、系統設計、實驗。

2 , Tree Boosting 簡述

2.1 XGboost的正則化目標

在給出n個例項,m維特徵的情況下,樹的整合模型(多個模型相加的過程)使用K個相加函式預測結果。
(q 將樣本例項(Rm)對映到葉子節點,w T為空間,T為葉子的數量)是CART的假設空間,q 代表每顆樹的結構,對映例項樣本到對應的葉子節點,T代表一棵樹葉子的數量,w代表葉子節點的分數,wq(x)表示為一顆獨立的樹對於樣本例項的預測值。如圖:

q(x)代表一顆樹,W代表葉子的分數,f(x) 為樣本例項的預測值,所以和CART的區別在於每個葉子節點有相應的權重Wi。為了學到模型需要的函式,需要定義正則化目標函式。

一種標準的正則化目標項= differentiable convex  loss function + regularization,即損失函式+正則項。

L衡量預測值與真實值的差異,Ω作為模型複雜度的懲罰項,對於樹的葉子節點個數和葉子節點權重的正則,防止過擬合,即simple is perfect,正則化項比RGF模型更加簡單。

2.2 梯度boosting樹

樹的整合模型不能在傳統的歐幾里得空間中找到合適的解,而應該通過迭代求近似解。表示通過t次迭代去近似真實的值,這樣可以新增迭代更新項,也就是boosting的想法:


將損失項在處泰勒展開:


gi和hi分別為L的一階、二階偏導(梯度),移除常數項:


將Ω展開:


可以看到左側為對於所有樣本求目標函式的和,右邊是對於所有葉子節點求正則懲罰項(需要把兩項相加),將每個葉子節點拆分為樣本集:

如圖:


將樣本分解為每個節點上的樣本,所以目標函式化簡為統一的在葉子節點上的和:


如果固定了樹的結構,即目標函式只與ω葉子權重相關,所以可通過對目標函式關於ω求導,得:


帶入目標函式可得最優解:


方程(6)作為衡量樹結構質量的指標,這個分數類似於決策樹中的純度,只是這個評價樹的指標通過目標函式獲得,而不是自定義的,如圖:


列舉所有可能的樹的結構是不可能的,應該在初始葉子節點上通過貪心演算法迭代新增分支。IL和IR是split(劃分)之後左右節點的集合。I = IL U IR,所以loss function變為:


左 + 右 - 合併的形式通常作為評估劃分的評價指標,對照公式(6),應該使上式最大。

2.3 收縮(學習速率)和列抽樣(借鑑隨機深林)

XGBoost除了使用正則項防止過擬合外,還使用了收縮和列抽樣。收縮再次新增權重因子η到每一步樹boosting的過程中,這個過程和隨機優化中的學習速率相似,收縮減少每棵單獨樹的影響並且為將形成的樹預留了空間(提高了模型的效果)。特徵(列)抽樣(在隨機森林中使用)(相對於遍歷每個特徵,獲取所有可能的gain消耗大)找到近似最優的分割點,列抽樣防止過擬合,並且可以加速並行化。

3 分割演算法

3.1 基礎精確的貪心演算法

方程(7)的關鍵問題是找到合適的分割,精確的貪心演算法通過列舉所有特徵的可能劃分找到最優劃分解,許多單機Tree演算法使用這種方式找到劃分點,例如 sklearn、Rs gbm、單機的XGBoost。精確的演算法需要排序成連續的特徵,之後計算每個可能劃分的梯度統計值,如演算法1:

3.2 近似演算法

精確通過列舉特徵所有可能的劃分,耗時,當資料量大的時候,幾乎不可能將資料全部載入進記憶體,精確劃分在分散式中也會有問題。我們總結了近似的策略,如演算法二所示,演算法首先根據特徵分佈的百分比提議候選劃分點,之後按照候選劃分點將特徵對映到槽中,找到最好的劃分百分點。全域性劃分需要儘可能詳細的特徵劃分,區域性劃分初步就能達到要求。在分散式樹中許多存在的近似演算法都使用這個策略,也可以直接構造直方圖近似(lightGBM直方圖近似,速度更快,好像準確度有所降低),也可以使用其他的策略而不僅僅是分位法,分位策略便於分散式實現、計算方便。

3.3 加權分位法

近似計算中重要的一步是提出候選的分位點,特徵百分比通常作為分散式劃分的依據。考慮多重集合,key-value 為第樣本的(樣本點的第K維特徵, 二階導數),定義排序函式:
表示小於z的點的比例,目標是找到劃分點,,這樣的劃分點滿足式(9) ,這樣儘量做到均勻劃分,hi作為每個資料點的權重的原因,方程(3)整理成平方差的形式,hi為label gi/hi的加權平方損失,對於大資料找到滿足基準的劃分點時意義重大的。
在以往的分位法中,沒有考慮權值,許多存在的近似方法中,或者通過排序或者通過啟發式方法(沒有理論保證)劃分。文章的貢獻是提供了理論保證的分散式加權分位法。

3.4 稀疏自適應分割策略

在實際應用中,稀疏資料是不可避免的,造成稀疏資料的原因主要有:1 ,資料缺失。 2 , 統計上的0 。 3 , 特徵表示中的one-hot形式,以往經驗表明當出現稀疏、缺失值時時,演算法需要很好的稀疏自適應。
當出現特徵值缺失時,例項被對映到預設的方向分支,關鍵是訪問非缺失實體對Ik。現在的演算法處理不存在的作為缺失值,學到處理缺失的最好方向,演算法通過列舉一致性情況同樣適用於使用者指定的值。現有的樹系統僅僅優化稠密的資料或者專注於處理有限的任務,例如:分類編碼。XGBoost通過一種統一的方式處理所有的稀疏性情況。當出現稀疏情況的時候,稀疏性計算只有線性的計算複雜度。如圖所示,稀疏自適應演算法比基本的非稀疏資料演算法快大約50倍。

4 , 系統設計

4.1 適應於並行學習的列塊

排序開銷了樹學習的大部分時間,XGBoost儲存資料進入劃分的記憶體塊單元,每個塊中的資料以壓縮列的方式儲存,排序每個塊單元中中的資料,輸入的資料在訓練前一次計算,後續重複使用。在精確演算法中,需要儲存整個資料進入一個單塊,之後整個資料排序分割,掃描整個塊發現候選的劃分葉子節點。如圖並行學習演算法 ,每一列通過相應的特徵排序,在列中進行線性掃描。在近似演算法中,每一塊對應於資料的子集,不同的塊可以分佈在不同的機器上,發現分位點的掃描變成線性複雜度。 每個分支獨立產生候選分立點。直方圖演算法中二分搜尋是線性時間的合併。並行每一列找到樹的分割點,列塊結構支援列的子抽樣。 時間複雜度分析 d表示為樹的最大深度,k為樹的總數量。在精確貪心演算法中,原始自適應稀疏演算法複雜度為表示為非缺失的實體對。在分塊樹演算法中,時間複雜度為是預處理花銷的時間,這個時間可以被分攤。分塊處理可以節省logn時間因子。在近似計算中,原始演算法的時間複雜度為,q是候選的劃分點,分塊近似演算法複雜度為,B是塊中行的最大值。

4.2 自適應快取的訪問

分塊幫助優化劃分點獲取的複雜度,新的演算法需要每一行的梯度值,這些值通過特徵順序訪問,這是非連續記憶體訪問過程。在累積和非連續記憶體獲取操作中,劃分列舉的基本時實現需要實時讀寫依賴。這個過程延緩分位點的發現,當梯度值在CPU沒有命中,cache缺失的時候。針對這樣的問題,我們提出自適應再獲取演算法。我們獲取每個執行緒的快取,從快取中獲取梯度資料,之後以類似批處理的方式累計。這種預取改變讀寫依賴的方,幫助減少限制的執行時間,特別是行資料很大時。如圖基本演算法與快取策略:
對於近似演算法,我們通過選擇合適的塊大小解決問題,我們定義塊的大小為包含在塊中最大例項,因為這個反應了梯度資料的儲存開銷。選擇太小的工作塊會有執行緒負載,從而導致低效的並行化。而太大的塊導致cache缺失,梯度資料不能很好的匹配CPU的cache。下圖比較了塊選擇:
結果驗證了我們上面的討論,塊的大小影響效率。

4.3 核外計算的塊

系統的目標是充分利用機器資源完成大規模學習任務,除了利用CPU cache和記憶體外,充分利用磁碟空間處理資料也是非常重要的,特別是當記憶體不能載入完整個資料的時候。在計算期間,使用獨立的執行緒從磁碟中預取塊到記憶體快取中,所以可以併發執行計算任務。這樣做只是保證了計算過程併發執行,這不能解決開銷大量時間讀取磁碟的瓶頸,增加磁碟I/O的通道問題能夠減少開銷的天花板。針對以上問題,我們提出兩種方案提高外存計算的能力。 塊壓縮 在載入資料進記憶體時,塊按照列進行壓縮,壓縮通過獨立的執行緒進行,這是以壓縮、解壓代價換區磁碟I/O。 塊分片 將資料分片在在多個磁碟上,一個預取執行緒對應一個磁碟。

5 相關的工作

該系統實現了梯度boosting 包,這個包在函式空間上做了額外的優化。梯度boosting已經成功應用於分類、排序、結構預測和其他領域。XGboost模型合併正則模型防止過擬合,這種整合正則的操作已經有人做過,該模型通過並行簡化了目標函式和演算法。列抽樣借鑑於隨機森林,簡單有效。自適應稀疏方法多用線上性模型中,很少用在樹模型。該演算法聯合了多種有效的方法(論文說是第一次)。樹的並行工作已經有人做過了,許多並行也是通過近似處理或者按列劃分資料。分位點法常用於資料庫中,本演算法需要找到梯度boosting樹中的加權分位點。

6 端到端的評估工作

6.1 系統實現

XGBoost主要提供權重分類、排序目標函式,支援python、R、Julia,整合到了本地的資料管道如sklean。在分散式系統中,XGboost也支援Hadoop、MPI、Flink、spark。

6.2 資料集


6.3 分類


6.4 排序



6.5 外存實驗


6.6 分散式實驗