Boosting算法是一種內建學習算法,由一系列基本分類器按照不同的權重組合成為一個強分類器,這些基本分類器之間有依賴關系。包括Adaboost算法、提升樹、GBDT算法。
當Adaboost算法中的基本分類器是cart回歸樹時,就是提升樹,同時,損失函數變為平方誤差損失函數。在Adaboost算法中通過改變樣本的權重來進行每一輪的基本分類器的學習,在提升樹算法中,是通過上一輪學習的殘差進行本輪的學習。
1.需要解決的問題
對于Boosting算法,需要解決兩個問題:
· 如何調整訓練集,使得在訓練集上訓練的弱分類器得以進行。
· 如何将訓練得到的各個弱分類器聯合起來形成強分類器。
2.算法的三個要素
函數模型(Boosting的函數模型是疊加型的),即:
目标函數(標明某種損失函數作為優化目标):
優化算法(貪婪地逐漸優化),即:
3.Gradient Boosting算法(梯度提升算法)
Gradient Boosting算法的實作:
· 函數模型為CART回歸樹模型。
· 損失函數一般為“對數損失函數”或“指數損失函數”。
· 優化算法采用梯度下降。
· 針對Boosting需要解決的兩個問題,Gradient Boosting算法采用了以下政策:
将殘差作為下一個弱分類器的訓練資料,每個新的弱分類器的建立都是為了使得之前弱分類器的殘差往梯度方向減少。
将弱分類器聯合起來,使用累加機制代替平均投票機制。
與Adaboost算法不同,Gradient Boosting算法在疊代的時候選擇梯度下降的方向來保證最後的結果最好。損失函數用來描述模型的“靠譜”程度,假設模型沒有過拟合,損失函數越大,模型的錯誤率就越高。如果模型能夠讓損失函數持續下降,就說明模型在不停地改進,而最好的方式就是讓損失函數在其梯度方向上下降。
【例1】GradientBoostingRegressor的實作。
Python中的Scikit-Learn包提供了GradientBoostingRegressor和GBDT的函數接口,可以很友善地調用函數完成模型的訓練和預測。
Gradient Boosting算法模型圖如圖1所示。
圖1 Gradient Boosting算法
可以發現,如果要用Gradient Boosting算法,那麼在sklearn包裡調用還是非常友善的,幾行代碼即可完成,大部分的工作應該是在特征提取上。