【機器學習】 XGBoost算法梳理

前言:XGBoost原理上跟普通GBDT一樣,都屬於集成算法中的boost類。boost的原理可以看我的另外兩篇介紹集成學習的文章,這裏不多贅述。所以這篇文章主要在XGB與普通GBDT不同之處進行討論。

1.損失函數

XGB的損失函數是支持自定義的,只要滿足二階可導即可。

XGB的損失函數除了擬合上一輪殘差部分,還自帶了兩個損失項以減少樹模型複雜度:

先討論簡單的,正則化部分:

係數:這裏的γ和λ,你可以設定它們的值,顯然,γ越大,表示越希望獲得結構簡單的樹,因爲此時對較多葉子節點的樹的懲罰越大。λ越大也是越希望獲得結構簡單的樹。

懲罰內容:T是該輪構建樹的葉子結點樹,w_j標識該結點上的值(值指的是迴歸樹,分類樹上則對應類別)。我理解w_j的意義在於,建立新樹過程中,不希望有某個分支突然學到“真理”,學習應該是循序漸進的,突然學得那麼“精確”容易過擬合。比如一男子,50歲,第一個葉節點根據性別就猜對了男子50歲,後面都沒有殘差了,這顯然不夠科學。所以需要加入此正則化部分,1是可以使模型趨於簡單,2可以避免過擬合。

再看頭疼一點的,誤差函數項,

爲了好理解,先以平方誤差(MSE)爲例,y_i\widehat{y}^\left ( {t-1} \right )都是已知項,上式可以轉化爲:

這個函數,是不是熟悉多了?因爲y_i\widehat{y}^\left ( {t-1} \right )都是已知項,所以這就是一個優雅的二次函數了,爲什麼說二次函數比較優雅,後面會提到。但是很多情況下,損失函數並不是平方誤差這麼簡單,那就用泰勒展開,只保留到二次項。泰勒公式就不細說了(反正我也說不通...),泰勒展開後,上式會變成這樣:

其中:

忽略損失函數l中的第一個自變量y_i(別忘了上面說的“在第t步,y_i是真實值,即已知”,不影響後續目標函數對的偏導計算),做下一一對應:

● 泰勒二階展開f 裏的x對應目標函數裏的

● f 裏的對應目標函數的

● 從而f 對x求導數時,對應爲目標函數對求偏導

這裏有必要再明確一下,g_ih_i的含義。g_i怎麼理解呢?現有t-1棵樹是不是?這t-1棵樹組成的模型對第i個訓練樣本有一個預測值\widehat{y}_i是不是?這個\widehat{y}_i與第i個樣本的真實標籤y_i肯定有差距是不是?這個差距可以用L\left ( y_i,\widehat{y}_i \right )這個損失函數來衡量是不是?現在g_ih_i的含義已經清楚了,而且,更重要的是,g_ih_i與當前要建立的樹無關啊,可以分佈運行啊,所以速度快啊。所以,上面的式子還可以進一步簡化爲(把常數項去掉)

這時,目標函數只依賴於每個數據點在誤差函數上的一階導數g和二階導數h

記住這個式子,再看其中的f_t(x),雖然知道它是個什麼東西,但是總覺得怪怪的是不是,怎麼去得到這個f_t(x)呢?

下面是決策樹的另一種表達方式:

式中:w(x)表示某個葉子結點上的值q(x)則是一種映射關係,表示把x映射到哪個葉子結點上,這樣一來,我們上面的損失函數就又可以表示成:

直接把,從樣本遍歷轉化爲從葉子結點遍歷了有沒有?這個公式還是有點難懂,那麼如果我們再變換一下呢?

這個公式,問你怎麼求w_j使得損失函數最小?當然是-\frac{b}{2a} 啊!(初中二次函數知識)

這個obj*表示一個樹的結構的好壞,只與樹結構有關係。下面這張圖,相信大家都在各種介紹XGB的文章裏見到過,這裏不多做介紹,只是輔助理解。

2.尋找最優的結構

以判斷一個人是否喜歡計算機遊戲爲例子。最簡單的樹結構就是一個節點的樹。我們可以算出這棵單節點的樹的好壞程度obj*。假設我們現在想按照年齡將這棵單節點樹進行分叉,我們需要知道:
1、按照年齡分是否有效,也就是是否減少了obj的值
2、如果可分,那麼以哪個年齡值來分。

爲了回答上面兩個問題,我們可以將這一家五口人按照年齡做個排序。如下圖所示:

從左向右遍歷每個年齡,可以得到兩個區域,然後計算gain

這個就類似於信息增益,增益越大,那麼obj*就越小,而這個\gamma是控制每次分裂的增益最小值的,如果增益小於\gamma,就不切分。對每個節點遞歸得調用這個方法,就可以得到一個新的樹。

3.特點

Xgboost可以有效地防止過擬合併且各種支持分佈式/並行,所以一般傳言這種大殺器效果好(集成學習的高配)+訓練效率高(分佈式),與深度學習相比,對樣本量和特徵數據類型要求沒那麼苛刻,適用範圍廣。而且具有深度學習沒有的一些特性比如模型的可解釋性、輸入數據的不變性、更易於調參等。

4.應用場景

XGBoost以其較高的準確率,又可以局部分佈式訓練,可以說能用GBDT的都可以用XGBoost來試試,訓練得比較快,時間省下來多調調參也是好的。

5.調參實踐

https://github.com/zzzzzzhang/Datawhale_learn/blob/master/XGBoost_cloud.py

參考

【1】http://www.julyedu.com/question/big/kp_id/23/ques_id/2590

【2】https://blog.csdn.net/github_38414650/article/details/76061893

【3】https://blog.csdn.net/qq_34562093/article/details/78880975

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