目錄git
參考地址:
貪心學院:https://github.com/GreedyAIAcademy/Machine-Learninggithub
學習XGBoost過程當中險些把以前決策數的知識也弄迷茫了,所以首先回顧一下決策樹
算法
據信息熵來的,也就是信息熵大的字段會更靠近決策樹的根節點
函數
林最重要的就是根據不一樣的字段的前後決策順序組成不一樣的樹。學習
說實話剛接觸XGBoost算法的時候我就蒙了,仔細分析了例子以後就清晰了spa
請分析下圖示例:
假設咱們不知道用戶年齡的狀況下,經過用戶行爲來預測用戶的年齡
blog
,XGBoost的計算結果以下:
get
19.25和57.2是怎麼來的呢?
$ (13 + 14 + 15 + 35) / 4 = 19.25 $
$ (25 + 49 + 68 + 71 + 73) / 5 = 57.2$
爲何要這麼算?由於XGBoost算法就是一個號稱"三個臭皮匠,頂個諸葛亮"的算法,其強悍之處在於多棵樹計算結果的迭代,因此最初取平均值影響不大。
這裏面還有一個殘差(residual)的概念,殘差 = 實際結果 - 預測結果
好比:Person1的Tree1殘差爲\(13 - 19.25 = -6.25\)it
(https://img2018.cnblogs.com/blog/753880/201908/753880-20190802183318845-666594384.png)
這裏要注意是第二棵決策樹,並不是是第一棵樹的一個節點。
第一棵決策樹是按LikeGardening來分的,第二棵樹是按PlaysVedioGames來分的。
第二棵樹的預測結果是怎麼算的?
$ 7.133 = (-8.2 + 13.8 + 15.8) / 3 $
$ -3.567 = (-6.25 -5.25 -4.25 -32.2 + 15.75 + 10.08) / 6 $
也就是第二棵樹的預測結果是第一棵樹殘差的平均數。
最終的聯合預測結果的計算方法:
好比:Person1的計算方法:
$ 15.683 = 19.25 + (-3.567) $
最新的殘差的算法:
$ 2.683 = 15.683 - 13 $
從上面的例子中咱們能夠看出,實際上問題是由預測年齡轉變成了找到最佳的殘差值。
這樣多棵樹就起到了聯合學習的效果,殘差也會逐漸逼近最終的真實年齡值。
這樣作的好處就在於節省了很大的計算量,也所以XGBoost會火。io
Bagging:Leverages unstable base learners that are weak because of overfitting
Boosting: Leverage stable base learners that are weak because of underfitting
殘差:
\(y_{i,residual} = y_{i,true}-y_{i,predict}\)
預測值:
$ y_{(i,k,predict)} = \frac{1}{m}\sum_{j}^{m} y_{(i,j,k-1)} , y_{(i,0,predict)}=y_{(i,true)} $
其中m就是i所在葉子節點所包含的記錄數, 咱們求和的就是此葉子節點中每條記錄的上一個棵樹的預測值。
最終的結果就是把全部的預測值加起來就好了。
這樣標達過於麻煩,所以咱們換一種簡單的方法:
假設訓練了K棵樹,\(f_{k}(x_{i})\)爲第i我的在第k棵樹上的預測值(其實這個值就是上面例子中的殘差而已),而訓練完k棵樹的最終預測值是:
\hat{y}{i} = \sum{k=1}^{K}f_{k}(x_{i})
有預測值並非咱們的目標,咱們的目標是方差最小,所以目標函數爲:
第2節的例子,後面的公式推導就是循序漸進地代入就好了。
首先將目標函數展開,再封裝用泰勒公式模型求導,找出極值點再帶回到目標函數求得極值的值,把k個極值加起來做爲得分就能夠找到最佳的樹的分割了。
(後面的部分太麻煩了,就不一一解釋了)