【Python】XGBoost原理小結及Python中的參數詳解

     對於XGBoost,相信大家都不陌生了,小白也曾經看了很多次,不過每次都沒有很系統的學習,都是在使用過程中,遇到什麼問題,就查什麼問題,對於整個算法都是“星星點點”的學習,最近幾天又看到了這個算法,小白就在學習中總結了一下這個算法的要點。

目錄

1.XGBoost描述

2.淺析XGBoost思路

3.XGBoost.分裂停止條件

4.Xgboost的一些重點

5.XGBoost參數

5.1Booster參數: 

5.2通用參數 

5.3學習目標參數


1.XGBoost描述

   XGBoost是一種集成學習算法,通過迴歸樹,每一次對殘差(實際值與預測值之差)進行擬合,最後把預測值相加得到最終的預測值。

比如:燈泡的壽命是10年,經過三棵樹的訓練,第一顆樹的訓練結果爲5年,那麼殘差爲10-5=5年,在此基礎上訓練,第二棵樹的訓練結果爲3年,殘差爲5-3=2年,接着第三棵樹,訓練結果爲1年,殘差爲2-1=1年,結束,那麼這棵樹最終預測的壽命=5+3+1=9年,這個結果顯然更接近於真實值。

2.淺析XGBoost思路

   XGBoost是通過建立K個迴歸樹,使樹羣的預測值趨近於真實值,且有儘量大的泛化能力,目標函數爲:

其中,i:第i個樣本,第一個函數:每個樣本的預測誤差和,誤差越小越好,第二個函數:樹的複雜度函數,越小泛化能力越強,複雜度越低。函數表達試爲:

對於求解,使用二次最優化(貪心策略+最優化):決策時刻按照當前目標最優化決定。

選擇feature分裂成兩個節點,需要:

1)確定分裂用的feature。枚舉所有feature,選擇loss function效果最好的那個(關於粗暴枚舉,Xgboost的做了改良,以並行方式同時計算每個feature的loss function);

2)如何確立節點的w以及最小的loss function二次函數的求最值(細節的會注意到,計算二次最值是不是有固定套路,導數=0的點)

  那麼整體就變成:選擇一個feature分裂,計算loss function最小值,然後再選一個feature分裂,又得到一個loss function最小值,枚舉完,找一個效果最好的,把樹給分裂,就得到了小樹苗。在分裂的時候,每次節點分裂,loss function被影響的只有這個節點的樣本,因而每次分裂,計算分裂的增益(loss function的降低量)只需要關注打算分裂的那個節點的樣本。接下來,繼續分裂,按照上述的方式,形成一棵樹,再形成一棵樹,每次在上一次的預測基礎上取最優進一步分裂/建樹,這就是貪心策略!

3.XGBoost.分裂停止條件

凡是循環迭代的方式必定有停止條件: 
  (1)當引入的分裂帶來的增益小於一個閥值的時候,我們可以剪掉這個分裂,所以並不是每一次分裂loss function整體都會增加的,有點預剪枝的意思,閾值參數爲 γ 正則項裏葉子節點數 T 的係數; 
  (2)當樹達到最大深度時則停止建立決策樹,設置一個超參數max_depth,這個好理解吧,樹太深很容易出現的情況學習局部樣本,過擬合; 
  (3)當樣本權重和小於設定閾值時則停止建樹,這個解釋一下,涉及到一個超參數-最小的樣本權重和min_child_weight,和GBM的 min_child_leaf 參數類似,但不完全一樣,大意就是一個葉子節點樣本太少了,也終止同樣是過擬合; 
  (4)貌似看到過有樹的最大數量的…這個不確定 
  那節點分裂的時候是按照哪個順序來的,比如第一次分裂後有兩個葉子節點,先裂哪一個?答:同一層級的(多機)並行,確立如何分裂或者不分裂成爲葉子節點 

4.Xgboost的一些重點

1)w是最優化求出來的,不是平均值或規則指定的,這是XGBoost的一個創新;

2)loss function中包含了正則化防止過擬合的技術;

3)支持自定義loss function,只要能泰勒展開(能求一階導和二階導)就行;

4)支持並行化,這個地方有必要說明下,因爲這是xgboost的閃光點,直接的效果是訓練速度快,boosting技術中下一棵樹依賴上述樹的訓練和預測,所以樹與樹之間應該是隻能串行!但是在選擇最佳分裂點,進行枚舉的時候並行!(這個也是樹形成最耗時的階段)

5)XGBoost還特別設計了針對稀疏數據的算法 

  假設樣本的第i個特徵缺失時,無法利用該特徵對樣本進行劃分,這裏的做法是將該樣本默認地分到指定的子節點,至於具體地分到哪個節點還需要某算法來計算,

  算法的主要思想是,分別假設特徵缺失的樣本屬於右子樹和左子樹,而且只在不缺失的樣本上迭代,分別計算缺失樣本屬於右子樹和左子樹的增益,選擇增益最大的方向爲缺失數據的默認方向;

6)可實現後剪枝

7)交叉驗證,方便選擇最好的參數。

8)行採樣、列採樣,隨機森林的套路(防止過擬合)

9)Shrinkage,前面例子講的是預測值爲每個迴歸樹預測值的加和,這裏也可以是加權。舉一個例子,比如第一棵樹預測值爲9,label爲10,第二棵樹才學1,再後面的樹其實結果不是很重要了,所以給他打個折扣,比如5折,這就可以發揮了啦,以此類推,這是爲了防止過擬合,如果對於“僞殘差”學習,那更像梯度下降裏面的學習率;

10)XGBoost還支持設置樣本權重,這個權重體現在梯度g和二階梯度h上,是不是有點adaboost的意思,重點關注某些樣本

5.XGBoost參數

  在運行XGBoost程序之前,必須設置三種類型的參數:通用類型參數(general parameters)、booster參數和學習任務參數(task parameters)。 
  一般類型參數general parameters –參數決定在提升的過程中用哪種booster,常見的booster有樹模型和線性模型。 
  Booster參數-該參數的設置依賴於我們選擇哪一種booster模型。 
  學習任務參數task parameters-參數的設置決定着哪一種學習場景,例如,迴歸任務會使用不同的參數來控制着排序任務。 
  命令行參數-一般和xgboost的CL版本相關。

5.1Booster參數: 

 

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

  2. min_child_weight[默認是1]  決定最小葉子節點樣本權重和。當它的值較大時,可以避免模型學習到局部的特殊樣本。但如果這個值過高,會導致欠擬合。這個參數需要用cv來調整 

  3. max_depth [默認是6]  樹的最大深度,這個值也是用來避免過擬合的3-10 

  4. max_leaf_nodes  樹上最大的節點或葉子的數量,可以代替max_depth的作用,應爲如果生成的是二叉樹,一個深度爲n的樹最多生成2n個葉子,如果定義了這個參數max_depth會被忽略 

  5. gamma[默認是0]  在節點分裂時,只有在分裂後損失函數的值下降了,纔會分裂這個節點。Gamma指定了節點分裂所需的最小損失函數下降值。這個參數值越大,算法越保守。 

  6. max_delta_step[默認是0]  這參數限制每顆樹權重改變的最大步長。如果是0意味着沒有約束。如果是正值那麼這個算法會更保守,通常不需要設置。 

  7. subsample[默認是1]  這個參數控制對於每棵樹,隨機採樣的比例。減小這個參數的值算法會更加保守,避免過擬合。但是這個值設置的過小,它可能會導致欠擬合。典型值:0.5-1 

  8. colsample_bytree[默認是1]  用來控制每顆樹隨機採樣的列數的佔比每一列是一個特徵0.5-1 

  9. colsample_bylevel[默認是1]  用來控制的每一級的每一次分裂,對列數的採樣的佔比。 

  10. lambda[默認是1]  權重的L2正則化項 

  11. alpha[默認是1]  權重的L1正則化項 

  12. scale_pos_weight[默認是1]  各類樣本十分不平衡時,把這個參數設置爲一個正數,可以使算法更快收斂。

5.2通用參數 


  1. booster[默認是gbtree] 
  選擇每次迭代的模型,有兩種選擇:gbtree基於樹的模型、gbliner線性模型 
  2. silent[默認是0] 
  當這個參數值爲1的時候,靜默模式開啓,不會輸出任何信息。一般這個參數保持默認的0,這樣可以幫我們更好的理解模型。 
  3. nthread[默認值爲最大可能的線程數] 
  這個參數用來進行多線程控制,應當輸入系統的核數,如果你希望使用cpu全部的核,就不要輸入這個參數,算法會自動檢測。

5.3學習目標參數


  1. objective[默認是reg:linear] 
  這個參數定義需要被最小化的損失函數。最常用的值有:binary:logistic二分類的邏輯迴歸,返回預測的概率非類別。multi:softmax使用softmax的多分類器,返回預測的類別。在這種情況下,你還要多設置一個參數:num_class類別數目。 
  2. eval_metric[默認值取決於objective參數的取之] 
  對於有效數據的度量方法。對於迴歸問題,默認值是rmse,對於分類問題,默認是error。典型值有:rmse均方根誤差;mae平均絕對誤差;logloss負對數似然函數值;error二分類錯誤率;merror多分類錯誤率;mlogloss多分類損失函數;auc曲線下面積。 
  3. seed[默認是0] 
隨機數的種子,設置它可以復現隨機數據的結果,也可以用於調整參數。

     以上就是小白最近看到的一些關於XGBoost的內容,可能零零散散大家都看到過,我這裏是總結一下,方便自己以後的學習積累。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章