集成學習(三)GBDT 梯度提升樹

前面學習了:集成學習(二)Boosting-CSDN博客

梯度提升樹:GBDT-Gradient Boosting Decision Tree

一、介紹

作為當代眾多經典算法的基礎,GBDT的求解過程可謂十分精妙,它不僅開創性地舍棄了使用原始標簽進行訓練的方式,同時還極大地簡化了Boosting算法的運算流程,讓Boosting算法本該非常復雜的運算流程變得清晰簡潔。GBDT的數學流程非常簡明、美麗,同時這一美麗的流程也是我們未來所有Boosting高級算法的數學基礎。與任意Boosting算法一致,對GBDT我們需要回答如下問題:

  • 損失函數L(x,y)?的表達式是什么?損失函數如何影響模型構建?
  • 弱評估器?f(x)?是什么,當下boosting算法使用的具體建樹過程是什么?
  • 綜合集成結果?H(x)?是什么?集成算法具體如何輸出集成結果?

同時,還可能存在其他需要明確的問題,例如:

  • 是加權求和嗎?如果是,加權求和中的權重如何求解?
  • 訓練過程中,擬合的數據Xy分別是什么?

回顧Boosting算法的基本指導思想,我們來梳理梯度提升樹回歸算法的基本流程。雖然Boosting理論很早就被人提出,但1999年才是GBDT算法發展的高潮。1999年,有四篇論文橫空出世:

《貪心函數估計:一種梯度提升機器》
Friedman, J. H. (February 1999). "Greedy Function Approximation: A Gradient Boosting Machine"

《隨機梯度提升》
Friedman, J. H. (March 1999). "Stochastic Gradient Boosting"

《梯度下降式提升算法》
Mason, L.; Baxter, J.; Bartlett, P. L.; Frean, Marcus (1999). "Boosting Algorithms as Gradient Descent"

《函數空間中的梯度下降式提升算法》
Mason, L.; Baxter, J.; Bartlett, P. L.; Frean, Marcus (May 1999). "Boosting Algorithms as Gradient Descent in Function Space"

GBDT算法是融合了上述4篇論文思想的集大成之作,為了保持一致,使用與前文不同的數學符號。

二、數學過程

假設現有數據集 ,含有形如\left ( x_{i}, y_{i} \right )的樣本M個,i為任意樣本的編號,單一樣本的損失函數為l\left ( y_{i}, H\left ( x_{i} \right ) \right ),其中?H\left ( x_{i} \right )i號樣本在集成算法上的預測結果,整個算法的損失函數為?L\left ( y, H( x ) \right ),且總損失等于全部樣本的損失之和:L(y,H(x))=\sum_{i}^{}l\left ( y_{i}, H\left ( x_{i} \right ) \right )。同時,弱評估器為回歸樹 ,總共學習T輪。則GBDT回歸的基本流程如下所示:

1、初始化數據迭代的起點H_{0}(x)。sklearn當中,我們可以使用0、隨機數或者任意算法的輸出結果作為H_{0}(x)?,但在最初的論文中,Friedman定義了如下公式來計算?H_{0}(x)?:

其中?y_{i}?為真實標簽,?C?為任意常數。以上式子表示,找出令\sum_{i}^{M}l\left ( y_{i}, C \right )?最小的常數?C?值,并輸出最小的?\sum_{i}^{M}l\left ( y_{i}, C \right )作為H_{0}(x)的值。需要注意的是,由于H_{0}(x)是由全部樣本的l計算出來的,因此所有樣本的初始值都是H_{0}(x),不存在針對某一樣本的單一初始值。

開始循環,for t in 1,2,3...T:

2、在現有數據集?N?中,抽樣?M?subsample?個樣本,構成訓練集N_{t}
3、對任意一個樣本i?,計算偽殘差(pseudo-residuals)r_{it},具體公式為:

不難發現,偽殘差是一個樣本的損失函數對該樣本在集成算法上的預測值求導后取負的結果,并且在進行第t次迭代、計算第t個偽殘差時,我們使用的前t-1次迭代后輸出的集成算法結果。在t=1時,所有偽殘差計算中的H_{t-1}(x_{i})?都等于初始H_{0}(x),在t> 0時,每個樣本上的?H_{t-1}(x_{i})都是不同的取值。

4、求解出偽殘差后,在數據集?\left ( x_{i},r_{it} \right )上按照CART樹規則建立一棵回歸樹f_{t},訓練時擬合的標簽為樣本的偽殘差r_{it}?。

5、將數據集N_{t}上所有的樣本輸入f_{t}進行預測,對每一個樣本,得出預測結果f_{t}\left ( x_{i} \right )。在數學上我們可以證明,只要擬合對象是偽殘差?r_{it},則f_{t}\left ( x_{i} \right )的值一定能讓損失函數最快減小。

6、根據預測結果f_{t}\left ( x_{i} \right )迭代模型,具體來說:

假設輸入的步長為\eta,則H_{t}(x)應該為:

對整個算法則有:

7、循環結束,輸出?H_{T}(x)?的值作為集成模型的輸出值。

三、初始化?H_{0}過程中的常數C是什么?

在最初的論文中,Friedman定義了如下公式來計算H_{0}?:

其中?y_{i}?為真實標簽,?C?為任意常數。以上式子表示,找出令\sum_{i}^{M}l\left ( y_{i}, C \right )?最小的常數?C?值,并輸出最小的?\sum_{i}^{M}l\left ( y_{i}, C \right )作為H_{0}(x)的值。在剛觀察這個式子時,大家可能很難理解?C?這個常數的作用,但這個式子實際上很簡單。

首先,l是損失函數,損失函數衡量兩個自變量之間的差異,因此l\left ( y_{i}, C \right )衡量樣本i的真實標簽y_{i}?與常數C之間的差異,因此l\left ( y_{i}, C \right )是所有樣本的真實標簽與常數C之間的差異之和。現在我們要找到一個常數C,令所有樣本的真實標簽與常數C的差異之和最小,請問常數C是多少呢?這是一個典型的求極值問題,只需要對\sum_{i}^{M}l\left ( y_{i}, C \right )?求導,再令導數為0就可以解出令\sum_{i}^{M}l\left ( y_{i}, C \right )最佳的C。假設?l?是squared_error,每個樣本的平方誤差,則有:

對上述式子求導,并令一階導數等于0:

所以:

可知,當L是平方誤差squared error時,令?l\left ( y_{i}, C \right )?最小的常數C就是真實標簽的均值。因此,式子?H_{0}=argmin_{C}\sum_{i}^{M}l\left ( y_{i}, C \right )的本質其實是求解?C=mean\left ( y_{i} \right )時的損失函數,并以此損失函數作為?H_{0}的值。當然,如果我們選擇了其他的損失函數,我們就需要以其他方式(甚至梯度下降)進行求解,?C?的值可能也就不再是均值了。

四、為什么擬合偽殘差可以令損失函數最快地減小

從直覺上來看,擬合偽殘差可以降低H_{t}\left ( x_{i} \right )與?y_{i}?之間的差異,從而降低整體損失函數的值,但這個行為在數學上真的可行嗎?畢竟,GBDT可以使用任意可微函數作為損失函數,不同損失函數求導后的結果即便與殘差相似,也未必能代替真正的殘差的效果。因此,不僅在直覺上需要理解擬合偽殘差的作用,我們還需要從數學上證明:只要擬合對象是偽殘差r_{it},則弱評估器的輸出值?f_{t}\left ( x_{i} \right )?一定是讓損失函數減小最快的值。

我們可以對損失函數進行泰勒展開。對單一樣本而言,我們有損失函數l(y_{i},H_{t-1}(x_{i})+f_{t}(x_{i})),其中?y_{i}是已知的常數,因此損失函數可以被看做是只有H_{t-1}(x_{i})+f_{t}(x_{i})一個自變量的函數,從而簡寫為?l(H_{t-1}(x_{i})+f_{t}(x_{i}))

根據一階泰勒展開,已知:

該式子中H_{t-1}(x_{i})?是常數,因此第一部分l(H_{t-1}(x_{i}))也是一個常數。同時,第二部分由導數和f_{t}組成,其中導數就是梯度,可以寫作?g_{i}?,所以式子可以化簡為:

現在,如果要令?l?最小,?f_{t}(x_{i})?應該等于多少呢?回到我們最初的目標,找出令損失函數l最小的f_{t}值:

常數無法被最小化,因此繼續化簡:

現在,?g_{t}是包含了所有樣本梯度的向量,f_{t}(x)?是包含了所有樣本在f_{t}上預測值的向量,兩個向量對應位置元素相乘后求和,即表示為向量的內積,由尖括號????表示。現在我們希望求解向量內積的最小值、并找出令向量內積最小的f_{t}(x)的取值,那就必須先找出f_{t}(x)的方向,再找出?f_{t}(x)?的大小。

1、方向

f_{t}(x)的方向應該與g_{t}完全相反。向量的內積?\left \langle g_{t} f_{t}(x)\right \rangle=\left |g_{t} \right |\left | f_{t} (x) \right |cos(\alpha),其中前兩項為兩個向量的模長,?α?是兩個向量的夾角大小。模長默認為整數,因此當且僅當兩個向量的方向完全相反,即夾角大小為180度時,?cos(α)?的值為-1,才能保證兩個向量的內積最小。假設向量 a = [1,2],向量b是與a的方向完全相反的向量。假設a和b等長,那向量b就是[-1,-2]。因此,與g_{t}方向完全相反且等長的向量就是?,-g_{t}f_{t}(x)的方向也正是-g_{t}的方向。

2、大小

對于向量a,除了[-1,-2]之外,還存在眾多與其呈180度夾角、但大小不一致的向量,比如[-2,-4], [-0.5,-1],每一個都可以與向量a求得內積。并且我們會發現,當方向相反時,向量b中的元素絕對值越大,b的模長就越長,向量a與b的內積就越小。因此不難發現,?\left \langle g_{t} f_{t}(x)\right \rangle?是一個理論上可以取到無窮小的值,那我們的?ft(x)?應該取什么大小呢?答案非常出乎意料:任何大小都無所謂。

回到我們的迭代公式:

無論?f_{t}(x)的大小是多少,我們都可以通過步長?η?對其進行調整,只要能夠影響?H(x),我們就可以影響損失迭代過程中的常數的大小。因此在數學上來說,f_{t}(x)?的大小可以是-g_{t}的任意倍數,這一點在梯度下降中其實也是一樣的。為了方便起見,同時為了與傳統梯度下降過程一致,我們通常讓?f_{t}(x)就等于一倍的-g_{t},但也有不少論文令?f_{t}(x)等于其他值的。在GBDT當中:

這就是我們讓GBDT當中的弱評估器擬合偽殘差/負梯度的根本原因。擬合負梯度其實為GBDT帶來了非常多的特點:

首先,通過直接擬合負梯度,GBDT避免了從損失函數找“最優”的過程,即避免了上述證明中求解?f_{t}=argmin_{f}\sum_{i=1}^{M}l\left ( H_{t-1}(x_{i})+f_{t}(x_{i}) \right )?的過程,從而大大地簡化了計算。

其次,通過擬合負梯度,GBDT模擬了梯度下降的過程,由于結合了傳統提升法Boosting與梯度下降,因此才被命名為梯度提升法(Gradient Boosting)。這個過程后來被稱為函數空間上的梯度下降(Gradient Descent in Function Space),這是視角為Boosting算法的發展奠定了重要的基礎。

最后,最重要的一點是,通過讓弱評估器擬合負梯度,弱評估器上的結果可以直接影響損失函數、保證損失函數的降低,從而指向Boosting算法的根本目標:降低偏差。這一過程避免了許多在其他算法中需要詳細討論的問題:例如,每個弱評估器的權重???是多少,以及弱評估器的置信度如何。

在AdaBoost算法當中,損失函數是“間接”影響弱評估器的建立,因此有的弱評估器能夠降低損失函數,而有的弱評估器不能降低損失函數,因此要在求和之前,需要先求解弱評估器的置信度,然后再給與置信度高的評估器更高的權重,權重???存在的根本意義是為了調節單一弱評估器對???的貢獻程度。但在GBDT當中,由于所有的弱評估器都是能夠降低損失函數的,只不過降低的程度不同,因此就不再需要置信度/貢獻度的衡量,因此就不再需要權重???。

五、遺留問題

有些細節性的東西本文還沒有講到,比如:

  1. 葉子結點如何取值?
  2. 其他損失函數下怎么推導?
  3. ...

詳見下面《集成學習(四)DT、GBDT 公式推導》,注意:這兩篇文章的符號不一樣!!

接下來學習:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41894.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41894.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41894.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

virtualbox窗口和win10窗口的切換

1、問題: 從windows切換到虛擬機可以用快捷鍵 ALTTAB,但是從虛擬機到windows使用 ALTTAB 無法成功切換 2、解決方法: 按下圖操作 按上面步驟設置之后,每次要從虛擬機窗口切換到windows窗口 只需要先按 CtrlAlt 跳出虛擬機窗口&…

【已解決】“import ... =“ 只能在 TypeScript 文件中使用

現象 在使用 import 語法的時候,代碼報紅,提示:“import ... “ 只能在 TypeScript 文件中使用 原因 代碼被 VSCode 解析成 TypeScript 語法 解決方案: 關閉 JavaScript 的驗證啟用即可。 mac 快捷方式:comman s…

微機原理與單片機 知識體系梳理

單片機筆記分享 我個人感覺單片機要記的東西很多,也很瑣碎,特別是一些位、寄存器以及相關作用等,非常難以記憶。因此復習時將知識點整理在了一起做成思維導圖,希望對大家有所幫助。內容不是很多,可能有些沒覆蓋全&…

vue-tabs標簽頁引入其他頁面

tabs頁面 <template> <div class"app-container"> <el-tabs v-model"activeName" type"card" tab-click"handleClick"> <el-tab-pane label"套餐用戶列表" name"first"> <user-list r…

VMware CentOS7 Linux 網絡配置

本文主要描述VMware虛擬機的網絡配置。 如上所示&#xff0c;在CentOS Linux虛擬機中設置網絡連接使用橋接模式&#xff0c;該模式對接主機物理網絡&#xff0c;直接由主機的物理網絡的DHCP服務器動態分配IP地址&#xff0c;或者在CentOS Linux的操作系統的網絡配置中設置靜態的…

HACCP體系認證:守護食品安全的黃金標準

在食品生產過程中&#xff0c;食品安全始終是重中之重。為了確保食品的安全性和質量&#xff0c;越來越多的企業開始采用HACCP&#xff08;危害分析關鍵控制點&#xff09;體系認證。這個體系不僅能幫助企業預防食品安全問題&#xff0c;還能顯著提升產品質量和市場競爭力。 HA…

android新聞app(二)

新聞詳細頁&#xff1a; 歷史瀏覽記錄SQList&#xff1a; 分類&#xff1a; 歷史瀏覽記錄主體UI和詳細&#xff1a; 側邊欄&#xff1a; 參考&#xff1a;浩宇開發

如何給gitlab其他訪問者創建賬號并增加權限

嗨&#xff0c;今天創建了項目之后&#xff0c;我想把項目鏈接發送給其他人&#xff0c;讓他下載這個項目&#xff0c;結果發現對方打開顯示登錄的界面&#xff0c;沒錯&#xff0c;他要想使用這個git下載項目&#xff0c;首先他的有一個git賬號 接下來我找有權限的相關人員給他…

網絡“ping不通”,如何排查和解決呢?

網絡問題往往復雜且難以預測&#xff0c;其中“ping不通”是常見的網絡故障之一。 1. 確認問題現象 首先&#xff0c;明確問題是完全無法ping通(無響應)還是ping通但有高延遲或丟包。這有助于縮小問題范圍。 2. 本地檢查 網絡接口狀態&#xff1a;使用ifconfig(Linux)或ipc…

認識并理解webSocket

今天逛牛客&#xff0c;看到有大佬分享說前端面試的時候遇到了關于webSocket的問題&#xff0c;一看自己都沒見過這個知識點&#xff0c;趕緊學習一下&#xff0c;在此記錄&#xff01; WebSocket 是一種網絡通信協議&#xff0c;提供了全雙工通信渠道&#xff0c;即客戶端和服…

策略為王股票軟件源代碼-----如何修改為自己軟件61----資訊菜單修改-----舉例---------調用同花順網頁------

http://stock.sina.com.cn 將原來的新浪行情,修改為同花順, 搜索 stock.sina.com.cn... StkUI\View\InfoView.cpp(58):char

AI防損員的應用:正確率高達90%背后的真相與挑戰

1. AI防損員的工作原理 AI防損員利用圖像識別技術來判斷商超中的行為是否異常。它將所有觀察到的行為分為兩類&#xff1a;正常行為和異常行為。這是一種二分類問題。 2. 數據不平衡問題 在現實中的商超環境中&#xff0c;正常行為占絕大多數&#xff0c;異常行為&#xff08;…

MySQL——備份

為什么要備份&#xff1f; 保證重要的數據不丟失 方便數據轉移 MySQL數據庫備份方式&#xff1a; 1. 直接拷貝物理文件 2. 在可視化工具中手動導出 —— 在想要導出的表或者庫中&#xff0c;右鍵選擇備份或導出 3. 使用命令行導出 mysqldump ——cmd打開命令行 —…

Python實現Mybatis Plus

Python實現Mybatis Plus from flask import g from sqlalchemy import asc, descclass QueryWrapperBuilder:conditions {}order_by_info {}def __new__(cls, *args, **kwargs):obj super(QueryWrapperBuilder, cls).__new__(cls)return objdef __init__(self, obj):self.o…

論文閱讀--Simple Baselines for Image Restoration

這篇文章是 2022 ECCV 的一篇文章&#xff0c;是曠視科技的一篇文章&#xff0c;針對圖像恢復任務各種網絡結構進行了梳理&#xff0c;最后總結出一種非常簡單卻高效的網絡結構&#xff0c;這個網絡結構甚至不需要非線性激活函數。 文章一開始就提到&#xff0c;雖然在圖像復原…

VRPTW(MATLAB):常春藤算法(IVY)求解帶時間窗的車輛路徑問題VRPTW,MATLAB代碼

詳細介紹 VRPTW&#xff08;MATLAB&#xff09;&#xff1a;常春藤算法&#xff08;Ivy algorithm&#xff0c;IVY&#xff09;求解帶時間窗的車輛路徑問題VRPTW&#xff08;提供MATLAB代碼&#xff09;-CSDN博客 ********************************求解結果******************…

EtherCAT轉Profinet網關配置說明第一講:配置軟件安裝及介紹

網關XD-ECPNS20為EtherCAT轉Profinet協議網關&#xff0c;使EtherCAT協議和Profinet協議兩種工業實時以太網網絡之間雙向傳輸 IO 數據。適用于具有EtherCAT協議網絡與Profinet協議網絡跨越網絡界限進行數據交換的解決方案。 本網關通過上位機來進行配置。 首先安裝上位機軟件 一…

Qt使用sqlite數據庫及項目實戰

一.sqlite使用介紹 在Qt中使用SQLite數據庫非常簡單&#xff0c;SQLite是一個輕量級的嵌入式數據庫&#xff0c;不需要單獨的數據庫服務器&#xff0c;完全使用本地文件來存儲數據。 當在Qt中使用SQLite數據庫時&#xff0c;需要涉及到一些SQL語句以及Qt中的相關函數&#xf…

【海賊王的數據航海】ST表——RMQ問題

目錄 1 -> RMQ問題 1.1 -> 定義 1.2 -> 解決策略 2 -> ST表 2.1 -> 定義 2.2 什么是可重復貢獻問題 2.3 -> 預處理ST表 2.4 -> 處理查詢 2.5 -> 實際問題 1 -> RMQ問題 1.1 -> 定義 RMQ (Range Minimum/Maximum Query)即區間最值查詢…

Go 語言多版本管理的最佳實踐 —— Linux 和 Windows 專題20240702

Go 語言多版本管理的最佳實踐 —— Linux 和 Windows 專題 引言 在軟件開發的世界里&#xff0c;保持開發環境的最新和兼容至關重要。特別是 Go 語言&#xff0c;隨著版本的更新&#xff0c;不同項目可能需要不同的 Go 版本。這時&#xff0c;如何在同一臺機器上高效管理多個…