1.背景
關於xgboost的原理網絡上的資源不多,大多數還停留在應用層面,本文經過學習陳天奇博士的PPT地址和xgboost導讀和實戰 地址,但願對xgboost原理進行深刻理解。python
2.xgboost vs gbdt
說到xgboost,不得不說gbdt。瞭解gbdt能夠看我這篇文章 地址,gbdt不管在理論推導仍是在應用場景實踐都是至關完美的,但有一個問題:第n顆樹訓練時,須要用到第n-1顆樹的(近似)殘差。從這個角度來看,gbdt比較難以實現分佈式(ps:雖然難,依然是能夠的,換個角度思考就行),而xgboost從下面這個角度着手
注:紅色箭頭指向的l即爲損失函數;紅色方框爲正則項,包括L一、L2;紅色圓圈爲常數項。
利用泰勒展開三項,作一個近似,咱們能夠很清晰地看到,最終的目標函數只依賴於每一個數據點的在偏差函數上的一階導數和二階導數。git
3.原理
(1)定義樹的複雜度
對於f的定義作一下細化,把樹拆分紅結構部分q和葉子權重部分w。下圖是一個具體的例子。結構函數q把輸入映射到葉子的索引號上面去,而w給定了每一個索引號對應的葉子分數是什麼。
定義這個複雜度包含了一棵樹裏面節點的個數,以及每一個樹葉子節點上面輸出分數的L2模平方。固然這不是惟一的一種定義方式,不過這必定義方式學習出的樹效果通常都比較不錯。下圖還給出了複雜度計算的一個例子。
注:方框部分在最終的模型公式中控制這部分的比重
在這種新的定義下,咱們能夠把目標函數進行以下改寫,其中I被定義爲每一個葉子上面樣本集合 github
這一個目標包含了TT個相互獨立的單變量二次函數。咱們能夠定義算法
最終公式能夠化簡爲網絡
經過對求導等於0,能夠獲得分佈式
而後把最優解代入獲得:ide
(2)打分函數計算示例函數
Obj表明了當咱們指定一個樹的結構的時候,咱們在目標上面最多減小多少。咱們能夠把它叫作結構分數(structure score)post
(3)枚舉不一樣樹結構的貪心法學習
貪心法:每一次嘗試去對已有的葉子加入一個分割
對於每次擴展,咱們仍是要枚舉全部可能的分割方案,如何高效地枚舉全部的分割呢?我假設咱們要枚舉全部x < a 這樣的條件,對於某個特定的分割a咱們要計算a左邊和右邊的導數和。
咱們能夠發現對於全部的a,咱們只要作一遍從左到右的掃描就能夠枚舉出全部分割的梯度和GL和GR。而後用上面的公式計算每一個分割方案的分數就能夠了。
觀察這個目標函數,你們會發現第二個值得注意的事情就是引入分割不必定會使得狀況變好,由於咱們有一個引入新葉子的懲罰項。優化這個目標對應了樹的剪枝, 當引入的分割帶來的增益小於一個閥值的時候,咱們能夠剪掉這個分割。你們能夠發現,當咱們正式地推導目標的時候,像計算分數和剪枝這樣的策略都會天然地出現,而再也不是一種由於heuristic(啓發式)而進行的操做了。
4.自定義損失函數
在實際的業務場景下,咱們每每須要自定義損失函數。這裏給出一個官方的 連接 地址
5.Xgboost調參
因爲Xgboost的參數過多,使用GridSearch特別費時。這裏能夠學習下這篇文章,教你如何一步一步去調參。地址
6.python、R對於xgboost的簡單使用
任務:二分類,存在樣本不均衡問題(scale_pos_weight能夠必定程度上解讀此問題)
【Python】
【R】
7.xgboost中比較重要的參數介紹
(1)objective [ default=reg:linear ] 定義學習任務及相應的學習目標,可選的目標函數以下:
- 「reg:linear」 –線性迴歸。
- 「reg:logistic」 –邏輯迴歸。
- 「binary:logistic」 –二分類的邏輯迴歸問題,輸出爲機率。
- 「binary:logitraw」 –二分類的邏輯迴歸問題,輸出的結果爲wTx。
- 「count:poisson」 –計數問題的poisson迴歸,輸出結果爲poisson分佈。 在poisson迴歸中,max_delta_step的缺省值爲0.7。(used to safeguard optimization)
- 「multi:softmax」 –讓XGBoost採用softmax目標函數處理多分類問題,同時須要設置參數num_class(類別個數)
- 「multi:softprob」 –和softmax同樣,可是輸出的是ndata * nclass的向量,能夠將該向量reshape成ndata行nclass列的矩陣。沒行數據表示樣本所屬於每一個類別的機率。
- 「rank:pairwise」 –set XGBoost to do ranking task by minimizing the pairwise loss
(2)’eval_metric’ The choices are listed below,評估指標:
- 「rmse」: root mean square error
- 「logloss」: negative log-likelihood
- 「error」: Binary classification error rate. It is calculated as #(wrong cases)/#(all cases). For the predictions, the evaluation will regard the instances with prediction value larger than 0.5 as positive instances, and the others as negative instances.
- 「merror」: Multiclass classification error rate. It is calculated as #(wrong cases)/#(all cases).
- 「mlogloss」: Multiclass logloss
- 「auc」: Area under the curve for ranking evaluation.
- 「ndcg」:Normalized Discounted Cumulative Gain
- 「map」:Mean average precision
- 「ndcg@n」,」map@n」: n can be assigned as an integer to cut off the top positions in the lists for evaluation.
- 「ndcg-「,」map-「,」ndcg@n-「,」map@n-「: In XGBoost, NDCG and MAP will evaluate the score of a list without any positive samples as 1. By adding 「-」 in the evaluation metric XGBoost will evaluate these score as 0 to be consistent under some conditions.
(3)lambda [default=0] L2 正則的懲罰係數
(4)alpha [default=0] L1 正則的懲罰係數
(5)lambda_bias 在偏置上的L2正則。缺省值爲0(在L1上沒有偏置項的正則,由於L1時偏置不重要)
(6)eta [default=0.3]
爲了防止過擬合,更新過程當中用到的收縮步長。在每次提高計算以後,算法會直接得到新特徵的權重。 eta經過縮減特徵的權重使提高計算過程更加保守。缺省值爲0.3
取值範圍爲:[0,1]
(7)max_depth [default=6] 數的最大深度。缺省值爲6 ,取值範圍爲:[1,∞]
(8)min_child_weight [default=1]
孩子節點中最小的樣本權重和。若是一個葉子節點的樣本權重和小於min_child_weight則拆分過程結束。在現行迴歸模型中,這個參數是指創建每一個模型所須要的最小樣本數。該成熟越大算法越conservative
取值範圍爲: [0,∞]
更多關於Xgboost學習地址
(1)https://github.com/dmlc/xgboost
我的學習心得
該段代碼引用的時候產生異常,建議使用常見的引用方式
問題二 ModuleNotFoundError: No module named 'sklearn.cross_validation'
解決辦法 選用新的導入代碼