scikit-learn 梯度提升樹(GBDT)算法實戰

2021-03-02 機器學習算法那些事

前言

上一篇文章對GBDT算法原理進行了總結,本文使用GBDT回歸類探討了損失函數對訓練數據的靈敏度,並介紹了參數調參實例。文末給出代碼連結,歡迎下載。

目錄

scikit-learn GBDT類庫概述

GBDT類庫boosting框架參數

GBDT回歸類損失函數的靈敏度探討

GBDT回歸類的調參實例

總結

GBDT類庫包含了GradientBoostingClassifier分類類和GradientBoostingRegressor回歸類,回歸類和分類類除了損失函數參數不相同,其他參數大致相同。之前有boosting族Adaboosting分類類的實踐,因此,本文重點介紹GradientBoostingRegressor回歸類的使用。

GBDT類包含了boosting框架和弱學習器,GBDT類使用CART決策樹作為弱學習器,前面文章有介紹決策樹的相關參數,這裡主要介紹boosting框架參數。

1)n_estimators:最大弱學習器個數。n_estimators過小容易欠擬合,模型處於高偏差狀態;n_estimators過大容易過擬合,模型處於高方差狀態。n_estimators常和learning_rate結合使用,默認值是100。

2)learning_rate:每個弱學習器的權重縮減係數v,相當於正則化參數。考慮權重係數v,那麼GBDT模型的迭代公式為:

其中,f(x)代表學習器模型,G(x)代表每次迭代的弱學習器,v為權重縮減係數(0<v≤1)。係數 v的作用:達到相同的訓練效果,含有權重縮減係數的模型需要更多的迭代次數,因此,通過設置 v 降低了模型的複雜度,防止過擬合。

3)subsample:從訓練樣本隨機無放回的抽取一定比例的子樣本集進行訓練,達到降低模型方差的效果,但同時會增大模型偏差。

4)loss:GBDT算法的損失函數,分類模型和回歸模型的損失函數是不同的。

分類模型:有對數損失函數」deviance「和指數損失函數"exponential",默認是對數損失函數。一般用對數損失函數進行二元分類和多元分類。

回歸模型:有均方差」ls「,絕對損失」lad「,Huber損失」huber「和分位數損失」quantile"。默認是均方差。如果訓練數據較好,推薦使用 ls,訓練數據含有噪聲或異常點時,推薦使用抗噪音的損失函數「huber"。如果需要對訓練集進行分段預測的時候,則採用損失函數」quantile「,表達式可參考上文。

5)alpha:這個參數只有GradientBoostingRegressor有,當我們使用Huber損失"huber"和分位數損失"quantile"時,需要制定分位數的值。默認是0.9,如果噪音較多,可以適當降低這個分位數的值。

問題:當訓練數據含有噪聲或異常點時,對不同損失函數的GBDT回歸模型影響有多大。

評價準則:均方差結果 。

數據類型:原始數據(org_data),數據含有隨機噪聲(noisy_data),數據含有異常值(outlier data)。

GBDT回歸模型:損失函數分別為 ls,lad,huber,quantile,其他參數都是默認值。

下圖為不同損失函數的回歸模型對不同數據類型的預測誤差情況:

上面四個圖橫坐標表示迭代次數,縱坐標表示預測值與實際值的均方差。

分析思路:比較同一模型對不同數據的均方差情況,就可以分析得到模型對噪聲或異常值的敏感情況,異常值可以看成是加入了比較大的噪聲。

結果分析:回歸模型對加入噪聲的數據不是很敏感,當數據加了一些異常值時,損失函數為huber的回歸模型有最好的預測結果,因為均方差是最小的。因此,當你的數據有較大的噪聲或異常值時,我建議你使用損失函數是huber的GBDT回歸模型。

前面有一篇文章介紹了boosting族的分類調參實例,因此本節介紹GBDT回歸類的調參數實例,其他集成方法類的參數擇優算法基本相同。

本節對損失函數的quantile的回歸模型進行優化,如果參數都是默認值,訓練數據的均方差情況:

輸出結果:

使用sklearn.model_selection.GridSearchCV和sklearn.model_selection.cross_validate進行調參,本文採用GridSearchCV函數進行調參:

得到最佳參數:

用最佳參數擬合訓練數據得到新模型,用該模型預測測試數據,得到均方差:

均方差結果:

參數優化後的均方差結果大大的降低了。仍可以使用GridSearchCV再次優化框架參數和決策樹參數,因為均方差結果比較小了,本文就不繼續優化參數了,感興趣的童鞋可以繼續優化。

當訓練數據含有較大的噪聲或異常值時,建議選擇損失函數為」huber「的GBDT回歸模型,參數擇優一般採用交叉驗證的方法,重點是理解交叉驗證的算法思想,若還有疑問,歡迎微信交流。

後臺回復"GBDT"獲取本文源碼連結

參考:

https://www.cnblogs.com/pinard/p/6143927.html

推薦閱讀

提升樹算法原理小結

集成學習原理總結

比較全面的隨機森林算法總結

比較全面的Adaboost算法總結

-END-

相關焦點

  • 梯度提升(Gradient Boosting)算法
    梯度下降法 3. 梯度提升算法4. 梯度提升原理推導 5. 對梯度提升算法的若干思考 6. 總結 7. Reference1. 引言提升樹利用加法模型與前向分歩算法實現學習的優化過程。當損失函數是平方誤差損失函數和指數損失函數時,每一步優化是很簡單的。
  • Scikit-Learn決策樹算法類庫使用小結
    scikit-learn決策樹算法類庫內部實現是使用了調優過的CART樹算法,既可以做分類,又可以做回歸。
  • 開源機器學習框架:Scikit-learn API簡介
    目前Scikit-learn已經實現的算法包括:支持向量機(SVM),最近鄰,邏輯回歸,隨機森林,決策樹以及多層感知器(MLP)神經網絡等等。需要指出的是,由於Scikit-learn本身不支持深度學習,也不支持GPU加速,因此這裡對於MLP的實現並不適合於處理大規模問題。有相關需求的讀者可以查看同樣對Python有良好支持的Keras和Theano等框架。
  • scikit-learn 0.22版正式發布,第一時間來學習新功能
    搞機器學習的應該沒有人不知道scikit-learn吧,這個在ML中使用非常頻繁的庫在昨天已經發布了它最新版本0.22了。scikit-learn 0.22的發布,其中包含許多錯誤修復和新功能!我們在下面詳細介紹此版本的一些主要功能。
  • Python + Scikit-learn 完美入門機器學習指南 ​
    但我們都知道,機器學習常用的算法有很多,例如:線性回歸、支持向量機、k 近鄰、決策樹、樸素貝葉斯、邏輯回歸等。其中的一些算法都有著比較複雜的數學過程,如果每一次都需要自己通過代碼實現這些算法,那麼機器學的門檻就變得很高了。這時,scikit-learn 來了。
  • GBDT原理及利用GBDT構造新的特徵-Python實現
    而讓損失函數持續下降,就能使得模型不斷改性提升性能,其最好的方法就是使損失函數沿著梯度方向下降(講道理梯度方向上下降最快)。Gradient Boost是一個框架,裡面可以套入很多不同的算法。1.2 Gradient Boosting Decision Tree每一次建立樹模型是在之前建立模型損失函數的梯度下降方向。
  • scikit-learn — 神經網絡模型
    特別是,scikit-learn沒有提供GPU支持。要獲得基於GPU更快的實現,以及提供更多靈活性以構建深度學習體系結構的框架,請參見相關項目https://scikit-learn.org/stable/related_projects.html#related-projects。1.
  • WePay機器學習反欺詐實踐:Python+scikit-learn+隨機森林
    【編者按】將機器學習算法用於金融領域的一個很好的突破口是反欺詐,在這篇博文中,WePay介紹了支付行業構建機器學習模型應對很難發現的shell selling欺詐的實踐心得。WePay採用了流行的Python、scikit-learn開源學習機器學習工具以及隨機森林算法。以下是文章內容:什麼是shellselling?
  • ...分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R實現)
    這種分支結構讓回歸樹很自然地學習到非線性關係。集成方法,如隨機森林(RF)或梯度提升樹(GBM)則組合了許多獨立訓練的樹。這種算法的主要思想就是組合多個弱學習算法而成為一種強學習算法,不過這裡並不會具體地展開。在實踐中 RF 通常很容易有出色的表現,而 GBM 則更難調參,不過通常梯度提升樹具有更高的性能上限。優點:決策樹能學習非線性關係,對異常值也具有很強的魯棒性。
  • 回歸、分類與聚類:三大方向剖解機器學習算法的優缺點(附Python和R...
    這種分支結構讓回歸樹很自然地學習到非線性關係。集成方法,如隨機森林(RF)或梯度提升樹(GBM)則組合了許多獨立訓練的樹。這種算法的主要思想就是組合多個弱學習算法而成為一種強學習算法,不過這裡並不會具體地展開。在實踐中 RF 通常很容易有出色的表現,而 GBM 則更難調參,不過通常梯度提升樹具有更高的性能上限。優點:決策樹能學習非線性關係,對異常值也具有很強的魯棒性。
  • 梯度提升算法
    在上一篇介紹提升樹模型時,我們用到的損失函數一般都是指數函數或者平方函數,這些函數都比較容易求導,也能很方便的求出優化後的結果。 但對於更為一般的損失函數而言,求解優化的過程並沒有那麼簡單。為此,Friedman提出了梯度提升算法。
  • 資料| 連廣場大媽都聽得懂的「機器學習入門」scikit-learn -17頁...
    from=leiphonecolumn_res0604pmScikit-learn 是基於 Python 的開源機器學習庫,它基於 NumPy 和 SciPy 等科學計算庫,並支持支持向量機、隨即森林、梯度提升樹、K 均值聚類等學習算法。Scikit-learn 目前主要由社區成員自發進行維護,且專注於構建機器學習領域內經廣泛驗證的成熟算法。
  • scikit-learn(sklearn)0.18 官方文檔中文版 | ApacheCN
    pageId=10813869ApacheCN cwiki 地址為 scikit-learn 0.18 中文文檔 (或點擊文章最下面的閱讀原文訪問): http://cwiki.apachecn.org/pages/viewpage.action?
  • 利用Spark 和 scikit-learn 將你的模型訓練加快 100 倍
    當我們使用 Spark 進行數據處理時,我們首選的機器學習框架是 scikit-learn。隨著計算機變得越來越便宜,機器學習解決方案的上市時間變得越來越關鍵,我們探索了加快模型訓練的各種方法。其中一個解決方案是將 Spark 和 scikit-learn 中的元素組合到我們自己的混合解決方案中。
  • 使用Scikit-learn 理解隨機森林
    雷鋒網(公眾號:雷鋒網)按:本文為 AI 研習社編譯的技術博客,原標題 Random forest interpretation with scscikit-learn,作者 ando。我的一些代碼包正在做相關工作,然而,大多數隨機森林算法包(包括 scikit-learn)並沒有給出預測過程的樹路徑。因此 sklearn 的應用需要一個補丁來展現這些路徑。
  • 極簡Scikit-Learn入門
    Scikit-Learn高清全景圖傳送:http://scikit-learn.org/stable/tutorial/machine_learning_map/index.html在機器學習和數據挖掘的應用中
  • 【下載】Scikit-learn作者新書《Python機器學習導論》, 教程+代碼手把手帶你實踐機器學習算法
    Müller同時也是著名機器學習Python包scikit-learn的主要貢獻者 Andreas Muller 和 Reonomy 公司數據科學家 Sarah Guido 的新書《Python機器學習導論》(Introduction to machine learning with Python)從實戰角度出髮帶你用Python快速上手機器學習方法。
  • 推薦:《機器學習實戰:基於Scikit-Learn和TensorFlow》中文翻譯和代碼下載
    本文提供機器學習入門的好書《機器學習實戰:基於Scikit-Learn和TensorFlow》的中文翻譯文件和原始碼下載。一、前言推薦一本機器學習入門的好書:《機器學習實戰:基於Scikit-Learn和TensorFlow》。
  • Scikit-learn估計器分類
    Scikit-learn實現了一系列數據挖掘算法,提供通用編程接口、標準化的測試和調參公局,便於用戶嘗試不同算法對其進行充分測試和查找最優參數值。本次講解數據挖掘通用框架的搭建方法。有了這樣一個框架,後續章節就可以把講解重點放到數據挖掘應用和技術上面。為幫助用戶實現大量分類算法,scikit-learn把相關功能封裝成估計器。估計器用於分類任務,它主要包括兩個函數。
  • 使用 scikit-learn 玩轉機器學習——集成學習
    上次我們剛聊過決策樹,相信小夥伴們還有些印象,決策樹是由一系列節點構成的,每劃分一個節點都要在所有的特徵維度的每個特徵可能取到的值上進行搜索,以取得信息熵的最小和,或最大的信息增益。隨機森林裡面的樹的節點劃分可能稍有些變化,隨機森林算法的高明之處之一就是利用隨機性,使得模型更魯棒。