1. 程式人生 > >XGBoost特點、調參、討論

XGBoost特點、調參、討論

XGBoost是在GBDT(梯度提升決策樹)基礎上發展而來。

GBDT含有幾個關鍵點:梯度提升,提升決策樹,迴歸問題。

本質模型為加法模型,基函式為決策樹,迭代擬合標註和模型的殘差,來不斷逼近損失函式最小化。更一般的情況,以當前模型在L負梯度方向的值,作為殘差的近似。

XGBoost(eXtreme Gradient Boosting)針對GBDT框架,加入了很多改進點。

1. XGB的特點

(1)傳統GBDT以CART作為基函式,xgb還支援線性分類器,此時XGB相當於來L1/L2正則化項的LR(分類)或者Liear R(迴歸)。

booster [default=gbtree]
設定引數:gbtree: tree-based models/gblinear: linear models

(2)傳統GBDT在優化時只用到一階導數資訊(負梯度),xgboost則對代價函式進行了二階泰勒展開,同時用到一階和二階導數。且xgboost工具支援自定義代價函式,只要函式可一階和二階求導。

(3)xgboost在代價函式里加入了正則項,控制模型複雜度。正則項裡包含了樹的葉節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。 剪枝是都有的,葉子節點輸出L2平滑是新增的。

(4)shrinkage縮減和column_subsampling
shrinkage縮減:類似於學習速率,在每一步tree boosting之後增加了一個引數n(權重),通過這種方式來減小每棵樹的影響力,給後面的樹提供空間去優化模型。
column subsampling:列(特徵)抽樣,隨機森林那邊學習來的,防止過擬合的效果比傳統的行抽樣還好(行抽樣功能也有),並且有利於後面提到的並行化處理演算法。

(5)split finding algorithms(劃分點查詢演算法)
樹節點在進行分裂時,我們需要計算每個特徵的每個分割點對應的增益,即用貪心法 greedy algorithm列舉所有可能的分割點。當資料無法一次載入記憶體或者在分散式情況下,貪心演算法效率就會變得很低,所以xgboost還提出了一種可並行的近似approximate algorithm直方圖演算法Weighted Quantile Sketch,用於高效地生成候選的分割點。

(6)對缺失值的處理。對於特徵的值有缺失的樣本,xgboost可以自動學習出它的分裂方向。 稀疏感知演算法 Sparsity-aware Split Finding

(7)Built-in Cross-Validation(內建交叉驗證)
XGBoost allows user to run a cross-validation at each iteration of the boosting process and thus it is easy to get the exact optimum number of boosting iterations in a single run.
This is unlike GBM where we have to run a grid-search and only a limited values can be tested.

(8)High Flexibility(高靈活性)
XGBoost allow users to define custom optimization objectives and evaluation criteria.
This adds a whole new dimension to the model and there is no limit to what we can do.

(9)xgboost支援並行,提高計算速度。

2. XGB並行化

boosting不是一種序列的結構嗎?怎麼並行的?

注意xgboost的並行不是在tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函式裡包含了前面t-1次迭代的預測值)。

xgboost的並行是在特徵粒度上的(是在構建樹的過程中)。我們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(因為要確定最佳分割點),xgboost在訓練之前,預先對資料進行排序,然後儲存為block結構,後面的迭代中重複地使用這個結構,大大減小計算量。

這個block結構也使得並行成為了可能,在進行節點分裂時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做分裂,那麼各個特徵的增益計算就可以開多執行緒進行。

這裡寫圖片描述

構建樹包括外層迴圈和內層迴圈。外層迴圈是構建樹的子節點中,對子節點分別使用CART,那麼此處可以並行化處理。內層迴圈是在某個節點做CART,需要遍歷特徵列,確定特徵及特徵最佳分割點,此處也可以並行。

3. XGB關鍵調參

3.1 常規引數

(1)booster [default=gbtree]:選擇基分類器
gbtree: tree-based models/gblinear: linear models

(2)silent [default=0]:設定成1則沒有執行資訊輸出,最好是設定為0.

(3)nthread [default to maximum number of threads available if not set]:執行緒數

3.2 模型引數

(1)eta:shrinkage引數,更新葉子節點權重時,乘以該係數避免步長過大。

(2)min_child_weight:default=1]引數預設是 1,每個葉子裡面 h 的和至少是多少,對正負樣本不均衡時的 0-1 分類而言,假設 h 在 0.01 附近,min_child_weight 為 1 意味著葉子節點中最少需要包含 100 個樣本。這個引數非常影響結果,控制葉子節點中二階導的和的最小值,該引數值越小,越容易 overfitting。

(3) max_depth [default=6]:每顆樹最大深度,樹高越深,葉節點越多,越容易過擬合。

(4)max_leaf_nodes:最大葉結點數,與max_depth作用有點重合。

(5) gamma [default=0]:後剪枝時,用於控制是否後剪枝的引數。

(6)max_delta_step [default=0]:這個引數在更新步驟中起作用,如果取0表示沒有約束,如果取正值則使得更新步驟更加保守。可以防止做太大的更新步子,使更新更加平緩。

(7)subsample [default=1]:樣本隨機取樣,較低的值使得演算法更加保守,防止過擬合,但是太小的值也會造成欠擬合。是Bagging思想,樣本擾動。

(8)colsample_bytree [default=1]:列取樣,對每棵樹的生成用的特徵進行列取樣。一般設定為: 0.5-1。如RF的思想,屬性擾動。

(9) lambda [default=1]:控制模型複雜度的權重值的L2正則化項引數,引數越大,模型越不容易過擬合。 (葉節點上輸出的score的L2模的平方和)

(10)alpha [default=0]:控制模型複雜程度的權重值的 L1 正則項引數,引數值越大,模型越不容易過擬合。 (葉節點個數)

(11)scale_pos_weight [default=1]:如果取值大於0的話,在類別樣本不平衡的情況下有助於快速收斂。

3.3 學習任務引數

(1)objective [default=reg:linear]:定義最小化損失函式型別。

常用引數:
binary:logistic –logistic regression for binary classification, returns 預測概率值 (not class)

multi:softmax –multiclass classification using the softmax objective, returns 預測的類別 (not probabilities)
you also need to set an additional num_class (number of classes) parameter defining the number of unique classes

multi:softprob –same as softmax, but returns predicted probability of each data point belonging to each class.

(2)eval_metric [ default according to objective ]: The metric to be used for validation data.

The default values are rmse for regression and error for classification.

Typical values are:

rmse – root mean square error
mae – mean absolute error
logloss – negative log-likelihood
error – Binary classification error rate (0.5 threshold)
merror – Multiclass classification error rate
mlogloss – Multiclass logloss
auc: Area under the curve

(3)seed [default=0]:
The random number seed. 隨機種子,用於產生可復現的結果
Can be used for generating reproducible results and also for parameter tuning.

注意::
python sklearn引數名會有所變化
eta –> learning_rate
lambda –> reg_lambda
alpha –> reg_alpha

參考資料

相關推薦

XGBoost特點調討論

XGBoost是在GBDT(梯度提升決策樹)基礎上發展而來。 GBDT含有幾個關鍵點:梯度提升,提升決策樹,迴歸問題。 本質模型為加法模型,基函式為決策樹,迭代擬合標註和模型的殘差,來不斷逼近損失函式最小化。更一般的情況,以當前模型在L負梯度方向的值,作為殘

Xgboost原理程式碼調和上線實錄

對於一個演算法工程師而言,xgboost應該算的上是起手式,網上也有各式各樣的教程,這篇部落格主要從原理、程式碼、調參和上線進行覆蓋,進而構建一個直觀的演算法體系;       生成的二叉樹是滿二叉樹還是完全二叉樹?   調參方法

開源俄版三軸雲臺軟硬體調軟體除錯可用,程式碼開源,入門說明

本方案採用開源方案,雲臺嵌入式軟體採用simpleBGC開原始碼,並參考了網上“SimpleBGC32- 開源三軸無刷雲臺演算法完全解說”修改而成,程式在STorM32 BGC V1.31硬體開源板卡中除錯成功並通過實測。調參軟體採用storm32-bgc開源調參軟體程式修改而成,繼續秉

KMeans原理調及應用

一、前言 KMeans是資料探勘十大演算法之一,在資料探勘實踐中,我們也常常將KMeans運用於各種場景,因為它原理簡單、易於實現、適合多種資料探勘情景。 二、原理 KMeans的原理較為簡單:以某種相似性度量為標準,確定樣本的結構,即樣本屬於哪一個簇取決於該樣本與哪一個簇

內參畸變數三種數與相機的標定方法與相機坐標系的理解

整體 沒有 建立 csdn ext 位置 nbsp ons 包含 博客轉載自:http://blog.csdn.net/yangdashi888/article/details/51356385 相機的內參數是六個分別為:1/dx、1/dy、r、u0、v0、f opencv

簡單的函數實默認值的定義

python 函數 Python語句中可以進行函數調用來簡化工作,每個函數都可以完成具體的任務。當遇到相同任務,調用函數方便快捷。 函數首先需設定形參(抽象概念),最後賦予具體值(實參),有些具體值可以不變,則可提前設定好默認值。 eg. 編寫一個和T-SHIRT尺碼及標語相關的函數: 設定好T-

第一次個人作業【四】(代碼編寫調debug相關)

pre 運行速度 快速 hfile 配置 osi 命令 字符 最大值 代碼編寫過程中的重要知識點 VS調試命令行參數的輸入 在VS中調試,無法直接輸入命令行參數,但是可以通過一下方法配置命令行參數: 點擊菜單欄的 項目>>屬性 出現屬性對話框之後,選擇 配置屬

C語言中函數聲明

-s 函數返回 int 是什麽 變量 strong 返回值 pro ont 函數原型: 原型prototype是函數的聲明;描述了函數的返回值與參數; 函數原型說明了兩點: 1、該函數的返回值 2、該函數的參數及其類型 ++++++++++++++++++++++++++

Python異常處理機制調測試

solid opera font pad 當我 back asi conf one 類似於Java的try..catch..finally Java的為try_except_finally try: print(‘try...‘) r = 10 / 0

C語言中函式宣告

函式原型: 原型prototype是函式的宣告;描述了函式的返回值與引數;  函式原型說明了兩點: 1、該函式的返回值 2、該函式的引數及其型別 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 函式的引數: 引數到底是什

Python 3.X | 一文看懂不懵圈:位置引數(必選引數)預設引數可變引數關鍵字引數...

Win 10+Python 3.6.3 不管是什麼引數,它們身處環境是:函式(function)。引數讓函式如虎添翼,靈活、強大。 1、概念釋義: def func(x, y=2, *arg, *, z, **kwargs): #print(x, y) #print(len(ar

python之自定義函式作用域

一、函式的作用域:表示函式執行時的範圍 注意:返回函式名稱,即返回一個地址;簡單說就是:函式名稱即指代該函式地址,在呼叫函式時,需在函式名稱後面加括號:函式名稱() 如上面圖片中那樣的情況,再最後加兩行程式碼: dz3=dz2()   #---接收foo2()函式執行的返回

VS中生成清理項目調開始運行(不調試)Debug 和 Release等之間的差別

con clear http clas 程序 最好 span 文件的 shee 版權聲明:本文為博主原創文章。未經博主同意不得轉載。 https://blog.csdn.net/helloUSB2010/article/details/

typescript學習之旅----資料型別及函式過載等

typescript中為了使編寫的程式碼更規範,更有利於維護,增加了型別校驗,在typescript中主要給我們提供了以下資料型別         布林型別(boolean)         數字型別(number)         字串型別(string)      

如何使用hyperopt對xgboost進行自動調

本教程重點在於傳授如何使用Hyperopt對xgboost進行自動調參。但是這份程式碼也是我一直使用的程式碼模板之一,所以在其他資料集上套用該模板也是十分容易的。 同時因為xgboost,lightgbm,catboost。三個類庫呼叫方法都比較一致,所以在本部分結束之後,我們有理由

構造方法(定義過載)

一、構造方法是什麼,有什麼用? 構造方法是類的一個特殊的成員,在類例項化時會自動呼叫。 通過前面的學習,我們知道為一個屬性賦值有兩種方法:①、直接訪問物件屬性 ②、通過setXxx()方法 如果想在例項化物件的同時就為這個物件的屬性進行賦值,可以通過構造方

3.5 抽象類repr算術定義深淺拷貝序列化

from abc import ABC, abstractmethod # 抽象基類 class Animal(ABC): # 定義抽象方法:規定介面 @abstractmethod def run(self): pass # 抽象基類不能例項化 # a =

python 利用pymssql連線sqlserver查詢插入新表案例

場景:連線資料庫後,將某個表的查詢結果賦值給另一條查詢語句,並將查詢後的結果插入到新表。 知識點: *1.pymssql如何連線資料庫 2.資料庫查詢傳參 3.字串之間的相互轉換* import pymssql import numpy as np c

golang基礎-函式是變數自定義type命名返回值可變defer匿名

函式是一個變數型別 package main import("fmt" ) func main() { c := add fmt.Println(c) sum := c(10, 20)

9.無線架構之存在的問題(包括Guest限制調限速通道切換掉線)

拓撲 拓撲可以儲存到本地,然後擴大檢視,這樣才能看的更清楚。(拖動到新視窗開啟即可) 目前環境存在的問題 8.5.1 無線之間都可以訪問。 可以看到內部使用者與Guest之間是可以訪問的,這樣存在一定的安全性,因為訪客是從外面過來的,經過了各種各樣的網路,假