XGBoost總結


再從頭到尾復習一邊+面試題總結:https://zhuanlan.zhihu.com/p/83901304

 陳國平:GBDT原理小結:https://www.cnblogs.com/pinard/p/6140514.html#!comments

XGBoost算法原理小結、XGBoost類庫使用小結  https://www.cnblogs.com/pinard/

https://blog.csdn.net/u013363120/article/details/80195471缺點

https://blog.csdn.net/weixin_41843918/article/details/88817166總結

簡介:

xgboost是Boosting算法的其中一種,Boosting算法的思想是許多弱分類器集成在一起,形成一個強分類器。以為xgboost是一種提升樹模型,所以他是將許多樹模型集成在一起,形成一個很強的分類器。而所用到的樹模型則是cart回歸樹模型。

xgboost是在GBDT的基礎上進行改進,使得更加強大,使用范圍更大
xgboost一般和sklearn一起使用,但是由於sklearn中沒有集成Xgboost,所以需要單獨安裝
在安裝的時候要注意安裝多線程版本

1. XGBoost的優勢
XGBoost算法可以給預測模型帶來能力的提升。當我對它的表現有更多了解的時候,當我對它的高准確率背后的原理有更多了解的時候,我發現它具有很多優勢:

1.1 正則化
標准GBM的實現沒有像XGBoost這樣的正則化步驟。正則化對減少過擬合也是有幫助的。
實際上,XGBoost以“正則化提升(regularized boosting)”技術而聞名。
1.2 並行處理
XGBoost可以實現並行處理,相比GBM有了速度的飛躍。
不過,眾所周知,Boosting算法是順序處理的,它怎么可能並行呢?每一課樹的構造都依賴於前一棵樹,那具體是什么讓我們能用多核處理器去構造一個樹呢?我希望你理解了這句話的意思。如果你希望了解更多,點擊這個鏈接。
XGBoost 也支持Hadoop實現。
1.3 高度的靈活性
XGBoost 允許用戶定義自定義優化目標和評價標准
它對模型增加了一個全新的維度,所以我們的處理不會受到任何限制。
1.4 缺失值處理
XGBoost內置處理缺失值的規則。
用戶需要提供一個和其它樣本不同的值,然后把它作為一個參數傳進去,以此來作為缺失值的取值。XGBoost在不同節點遇到缺失值時采用不同的處理方法,並且會學習未來遇到缺失值時的處理方法。
1.5 剪枝
當分裂時遇到一個負損失時,GBM會停止分裂。因此GBM實際上是一個貪心算法。
XGBoost會一直分裂到指定的最大深度(max_depth),然后回過頭來剪枝。如果某個節點之后不再有正值,它會去除這個分裂。
這種做法的優點,當一個負損失(如-2)后面有個正損失(如+10)的時候,就顯現出來了。GBM會在-2處停下來,因為它遇到了一個負值。但是XGBoost會繼續分裂,然后發現這兩個分裂綜合起來會得到+8,因此會保留這兩個分裂。
1.6 內置交叉驗證
XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。
而GBM使用網格搜索,只能檢測有限個值。
1.7、在已有的模型基礎上繼續
XGBoost可以在上一輪的結果上繼續訓練。這個特性在某些特定的應用上是一個巨大的優勢。
sklearn中的GBM的實現也有這個功能,兩種算法在這一點上是一致的。

3.1 參數調優的一般方法

我們會使用和GBM中相似的方法。需要進行如下步驟:

  • 選擇較高的學習速率(learning rate)。一般情況下,學習速率的值為0.1。但是,對於不同的問題,理想的學習速率有時候會在0.05到0.3之間波動。選擇對應於此學習速率的理想決策樹數量。XGBoost有一個很有用的函數“cv”,這個函數可以在每一次迭代中使用交叉驗證,並返回理想的決策樹數量。
  • 對於給定的學習速率和決策樹數量,進行決策樹特定參數調優(max_depth, min_child_weight, gamma, subsample, colsample_bytree)。在確定一棵樹的過程中,我們可以選擇不同的參數,待會兒我會舉例說明。
  • xgboost的正則化參數的調優。(lambda, alpha)。這些參數可以降低模型的復雜度,從而提高模型的表現。
  • 降低學習速率,確定理想參數。

3.2 具體步驟 

第一步:確定學習速率和tree_based 參數調優的估計器數目。

為了確定boosting 參數,我們要先給其它參數一個初始值。咱們先按如下方法取值:
1、max_depth = 5 :這個參數的取值最好在3-10之間。我選的起始值為5,但是你也可以選擇其它的值。起始值在4-6之間都是不錯的選擇。
2、min_child_weight = 1:在這里選了一個比較小的值,因為這是一個極不平衡的分類問題。因此,某些葉子節點下的值會比較小。
3、gamma = 0: 起始值也可以選其它比較小的值,在0.1到0.2之間就可以。這個參數后繼也是要調整的。
4、subsample,colsample_bytree = 0.8: 這個是最常見的初始值了。典型值的范圍在0.5-0.9之間。
5、scale_pos_weight = 1: 這個值是因為類別十分不平衡。
注意哦,上面這些參數的值只是一個初始的估計值,后繼需要調優。這里把學習速率就設成默認的0.1。然后用xgboost中的cv函數來確定最佳的決策樹數量。

第二步: max_depth 和 min_weight 參數調優

我們先對這兩個參數調優,是因為它們對最終結果有很大的影響。首先,我們先大范圍地粗調參數,然后再小范圍地微調。
注意:在這一節我會進行高負荷的柵格搜索(grid search),這個過程大約需要15-30分鍾甚至更久,具體取決於你系統的性能。你也可以根據自己系統的性能選擇不同的值。

第三步:gamma參數調優

第四步:調整subsample 和 colsample_bytree 參數

第五步:正則化參數調優。

第6步:降低學習速率
最后,我們使用較低的學習速率,以及使用更多的決策樹。我們可以用XGBoost中的CV函數來進行這一步工作

 

2. XGBoost的參數
XGBoost的作者把所有的參數分成了三類:

通用參數:宏觀函數控制。
Booster參數:控制每一步的booster(tree/regression)。
學習目標參數:控制訓練目標的表現。
在這里我會類比GBM來講解,所以作為一種基礎知識,強烈推薦先閱讀這篇文章。

5.1 通用參數
這些參數用來控制XGBoost的宏觀功能。

1、booster[默認gbtree]
選擇每次迭代的模型,有兩種選擇:
gbtree:基於樹的模型
gbliner:線性模型
2、silent[默認0]
當這個參數值為1時,靜默模式開啟,不會輸出任何信息。
一般這個參數就保持默認的0,因為這樣能幫我們更好地理解模型。
3、nthread[默認值為最大可能的線程數]
這個參數用來進行多線程控制,應當輸入系統的核數。
如果你希望使用CPU全部的核,那就不要輸入這個參數,算法會自動檢測它。
還有兩個參數,XGBoost會自動設置,目前你不用管它。接下來咱們一起看booster參數。

5.2 booster參數
盡管有兩種booster可供選擇,我這里只介紹tree booster,因為它的表現遠遠勝過linear booster,所以linear booster很少用到。

1、eta[默認0.3]
和GBM中的 learning rate 參數類似。
通過減少每一步的權重,可以提高模型的魯棒性。
典型值為0.01-0.2。

為了防止過擬合,更新過程中用到的收縮步長。在每次提升計算之后,算法會直接獲得新特征的權重。 eta通過縮減特征的權重使提升計算過程更加保守。
2、min_child_weight[默認1]
決定最小葉子節點樣本權重和。
和GBM的 min_child_leaf 參數類似,但不完全一樣。XGBoost的這個參數是最小樣本權重的和,而GBM參數是最小樣本總數。
這個參數用於避免過擬合。當它的值較大時,可以避免模型學習到局部的特殊樣本。
但是如果這個值過高,會導致欠擬合。這個參數需要使用CV來調整。
3、max_depth[默認6]
和GBM中的參數相同,這個值為樹的最大深度。
這個值也是用來避免過擬合的。max_depth越大,模型會學到更具體更局部的樣本。
需要使用CV函數來進行調優。
典型值:3-10

調參:值越大,越容易過擬合;值越小,越容易欠擬合。
4、max_leaf_nodes
樹上最大的節點或葉子的數量。
可以替代max_depth的作用。因為如果生成的是二叉樹,一個深度為n的樹最多生成n2n^2n
2
個葉子。
如果定義了這個參數,GBM會忽略max_depth參數。
5、gamma[默認0]
在節點分裂時,只有分裂后損失函數的值下降了,才會分裂這個節點。Gamma指定了節點分裂所需的最小損失函數下降值。
這個參數的值越大,算法越保守。這個參數的值和損失函數息息相關,所以是需要調整的。
6、max_delta_step[默認0]
這參數限制每棵樹權重改變的最大步長。如果這個參數的值為0,那就意味着沒有約束。如果它被賦予了某個正值,那么它會讓這個算法更加保守。
通常,這個參數不需要設置。但是當各類別的樣本十分不平衡時,它對邏輯回歸是很有幫助的。
這個參數一般用不到,但是你可以挖掘出來它更多的用處。
7、subsample[默認1]
和GBM中的subsample參數一模一樣。這個參數控制對於每棵樹,隨機采樣的比例。
減小這個參數的值,算法會更加保守,避免過擬合。但是,如果這個值設置得過小,它可能會導致欠擬合。
典型值:0.5-1

調參:防止overfitting。
8、colsample_bytree[默認1]
和GBM里面的max_features參數類似。用來控制每棵隨機采樣的列數的占比(每一列是一個特征)。
典型值:0.5-1

調參:防止overfitting。
9、colsample_bylevel[默認1]
用來控制樹的每一級的每一次分裂,對列數的采樣的占比。
我個人一般不太用這個參數,因為subsample參數和colsample_bytree參數可以起到相同的作用。但是如果感興趣,可以挖掘這個參數更多的用處。
10、lambda[默認1]
權重的L2正則化項。(和Ridge regression類似)。
這個參數是用來控制XGBoost的正則化部分的。雖然大部分數據科學家很少用到這個參數,但是這個參數在減少過擬合上還是可以挖掘出更多用處的。
11、alpha[默認1]
權重的L1正則化項。(和Lasso regression類似)。
可以應用在很高維度的情況下,使得算法的速度更快。
12、scale_pos_weight[默認1]
在各類別樣本十分不平衡時,把這個參數設定為一個正值,可以使算法更快收斂。參數詳解:https://blog.csdn.net/h4565445654/article/details/72257538
2.3學習目標參數
這個參數用來控制理想的優化目標和每一步結果的度量方法。

1、objective[默認reg:linear]
這個參數定義需要被最小化的損失函數。最常用的值有:
binary:logistic 二分類的邏輯回歸,返回預測的概率(不是類別)。
multi:softmax 使用softmax的多分類器,返回預測的類別(不是概率)。
在這種情況下,你還需要多設一個參數:num_class(類別數目)。
multi:softprob 和multi:softmax參數一樣,但是返回的是每個數據屬於各個類別的概率。

  • 回歸任務
    • reg:linear (默認)
    • reg:logistic
  • 二分類
    • binary:logistic     概率 
    • binary:logitraw   類別
  • 多分類
    • multi:softmax  num_class=n   返回類別
    • multi:softprob   num_class=n  返回概率
  • rank:pairwise


2、eval_metric[默認值取決於objective參數的取值]
對於有效數據的度量方法。
對於回歸問題,默認值是rmse,對於分類問題,默認值是error。
典型值有:

logloss 負對數似然函數值
error 二分類錯誤率(閾值為0.5)
merror 多分類錯誤率
mlogloss 多分類logloss損失函數
auc 曲線下面積

  • 回歸任務(默認rmse)
    • rmse--均方根誤差
    • mae--平均絕對誤差
  • 分類任務(默認error)
    • auc--roc曲線下面積
    • error--錯誤率(二分類)
    • merror--錯誤率(多分類)
    • logloss--負對數似然函數(二分類)
    • mlogloss--負對數似然函數(多分類)


3、seed(默認0)
隨機數的種子
設置它可以復現隨機數據的結果,也可以用於調整參數
如果你之前用的是Scikit-learn,你可能不太熟悉這些參數。但是有個好消息,python的XGBoost模塊有一個sklearn包,XGBClassifier。這個包中的參數是按sklearn風格命名的。會改變的函數名是:

1、eta -> learning_rate
2、lambda -> reg_lambda
3、alpha -> reg_alpha

num_rounds

3、調參:

兩種XGBoost包:

 

調參代碼實現(參考評論區):https://blog.csdn.net/han_xiaoyang/article/details/52665396


免責聲明!

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



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