XGBOOST的基本原理以及使用
XGBOOST的基本原理以及使用
XGBOOST的基本原理
XGBOOST的模型形式
XGBOOST是boosting方法的一種加法模型,訓練的時候采用前向分布算法進行貪婪學習,每次迭代都學習一顆CART樹來擬合之前t-1棵樹的預測結果與訓練樣本真實值的殘差。
XGBOOST的模型形式比較類似于GBDT算法。其基本形式為對于給定數據集
學習包括N棵樹的加法模型,其中K是子分類器的數量,f是子分類器,F是子分類器從屬的函數空間
XGBOOST的損失函數
XGBOOST的目標函數如下所示,其中還包含了正則項
對于f是決策樹而不是連續函數,所以沒辦法用梯度下降的辦法進行優化,所以我們使用貪心算法來獲得最優解。
將上述目標函數按照泰勒級數展開
假設子分類器f的正則項有葉子節點的數量,以及葉子節點的權重的平方和兩部分組成。
則XGBOOST最終的損失函數如下所示
上述公式對w求導后為0,得到
XGBOOST的學習策略
上一節最后紅色的部分就是學習優化的關鍵,要讓紅色的部分月大越好。因此XGBoost中計算增益的方法入下圖所示:
在選擇分裂點的過程中,如果使用精確貪心算法,對每個特征排序完之后,枚舉完所有分裂點之后。假設樹的深度為H,特征數為d,則復雜度為O(Hdnlogn),其中排序為O(nlogn)。
當數據量十分龐大,無法全部存入內存中時,精確算法很慢。所以要采用近似算法,即根據特征的分布將特征分為l個桶。按照不同的桶進行切分。在將特征分為不同的桶的過程中,XGBOOST并沒有采取簡單的分為數方法,而是以二階梯度h作為權重進行劃分。
對特征k構造multi-set的數據集
XGBOOST的控制處理
XGBoost能對缺失值進行自動處理,原理就是將缺失值分別劃分到左子樹和右子樹,分別計算增益。看哪個方向的增益比較大就把缺失值放到哪個方向。
XGBOOST的工程實現
在建樹的過程中,最耗時的是尋找最優切分點,而在這個過程中,最耗時的部分是將數據排序。為了減少排序時間,XGBOOST使用了Block結構存儲數據。
Block中的數據以稀疏格式CSC進行存儲
Block中的特征進行預排序,并通過索引獲得內存中的梯度信息
使用Block結構的缺點是取梯度的時候,是通過索引來獲取的,而這些梯度的獲取順序是按照特征的大小排序的。這將導致非連續的內存訪問,可能使CPU Cache中緩存命中率低,從而影響算法的效率。對于精確算法中,使用緩存預取。具體來說,對于每個線程分配一個連續的buffer,讀取梯度信息并且存入Buffer中,然后再統計梯度信息。這種方式在大樣本的情況下非常的有用。
XGBOOST的優缺點總結
優點:
- 精度更高:GBDT 只用到一階泰勒展開,而 XGBoost 對損失函數進行了二階泰勒展開。XGBoost 引入二階導一方面是為了增加精度,另一方面也是為了能夠自定義損失函數,二階泰勒展開可以近似大量損失函數
- 靈活性更強:GBDT 以 CART 作為基分類器,XGBoost 不僅支持 CART 還支持線性分類器,(使用線性分類器的 XGBoost 相當于帶 L1 和 L2 正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題))。此外,XGBoost 工具支持自定義損失函數,只需函數支持一階和二階求導
- 正則化:XGBoost 在目標函數中加入了正則項,用于控制模型的復雜度。正則項里包含了樹的葉子節點個數、葉子節點權重的 L2 范式。正則項降低了模型的方差,使學習出來的模型更加簡單,有助于防止過擬合
- 缺失值處理:XGBoost 采用的稀疏感知算法極大的加快了節點分裂的速度
- 可以并行化操作:塊結構可以很好的支持并行計算
缺點:
- 雖然利用預排序和近似算法可以降低尋找最佳分裂點的計算量,但在節點分裂過程中仍需要遍歷數據集
- 預排序過程的空間復雜度過高,不僅需要存儲特征值,還需要存儲特征對應樣本的梯度統計值的索引,相當于消耗了兩倍的內存
XGBOOST Python實用調參過程
XGBOOST的參數一般分為三類:
通用參數:
booster:可全gbtree,和gblinear。gbtree采用樹的結構,gblinear采用線性的方式
nthread:使用的線程數,一般選擇-1就是使用所有線程進行計算
booster參數:
n_estimators:迭代次數
learning_rate:shrink的速率,默認是0.3
gamma:默認是0。分裂后造成
subsample:每個booster采用率,默認是1,一般選擇0.5-0.8
colsample_bytree:樹層面的列抽樣
colsample_bylevel:每一次分裂的列抽樣,默認是1
max_depth:樹的最大深度
max_delta_step:限制了每棵樹權重該表的最大步長。默認是0就是沒有約束。通常不需要設置,但是在部分樣本不平衡的情況下,由于存在二階導,所以可以防止權重異常的增加。
lambda:L2正則項,默認0
alpha:L1正則項,默認0
scale_pos_weight:默認1,用來平衡樣本的數量
學習目標參數
objective:默認reg:linear
- reg:linear :線性回歸
- reg:logistic :邏輯回歸
- binary:logistic :二分類邏輯回歸
- binary:logitraw :二分類邏輯回歸,輸出為wTx
- count:poisson :計數問題poisson回歸
- multi:softmax :設置XGBOOST使用softmax目標函數做多分類,需要設置參數num_class
- multi:softprob :如同softmax,但輸出結果為ndata*nclass的向量,其中的值是每個數據分為每個類的概率
eval_metric: 默認是使用objective相同的參數 - rmse:均方根誤差
- mae:絕對值誤差
- logloss:最大似然取負
- error:二分類錯誤率
- merror: 多分類錯誤率
- mlogloss:多分類log損失
- auc: auc曲線下面的面積
- ndcg:Normalized Discounted Cumulative Gain
- map: 平均正確率
我們先查看一下調整scale_pos_weight對輸出產生的影響
class_weight=1,mean Y result=0.064
class_weight=2,mean Y result=0.100
class_weight=10,mean Y result=0.256
class_weight=20,mean Y result=0.354
我們可以看出,基本上scale_pos_weight越大,概率輸出也越大。如果對概率的正確性有要求,一般不用調scale_pos_weight
調整n_estimators,和learning_rate
我們發現n_estimators越大效果越好,然而learning_rate則不一定,選取0.1的時候是最優的
我隨后嘗試調整一下樣本抽樣subsample和列抽樣colsample_bytree,看看是否對準去率有一定的影響
可以看出,這兩個值越大,auc值越多,但是colsample_bytree超過0.8之后邊際效益就出來了,所以最終選擇subsample=0.5,colsample_bytree=0.8
調整max_depth和gamma,看看剪枝是否可以提升模型的效果
我們發現max_depth=10的時候效果最好,gamma沒有明顯影響
我們試圖加入L2正則項Lambda,看看正則化對模型效果是否有影響
最后發現正則化對模型最終區分能力AUC沒有太大的影響,但會減小模型的方差。這里選取lambda=0.1即可
總結
以上是生活随笔為你收集整理的XGBOOST的基本原理以及使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1111
- 下一篇: 喜报|云南永兴元科技顺利通过CMMI三级