【集成學習】Boosting算法詳解

文章目錄

  • 1. 集成學習概述
  • 2. Boosting算法詳解
  • 3. Gradient Boosting算法詳解
    • 3.1 基本思想
    • 3.2 公式推導
  • 4. Python實現

1. 集成學習概述

集成學習(Ensemble Learning)是一種通過結合多個模型的預測結果來提高整體預測性能的技術。相比于單個模型,集成學習通過多個基學習器的“集體智慧”來增強模型的泛化能力,通常能夠提高模型的穩定性和準確性。

常見的集成學習框架有:

  • Bagging:通過并行訓練多個模型并對其結果進行平均或投票來減少方差
  • Boosting:通過按順序訓練多個模型,每個模型都試圖糾正前一個模型的錯誤,從而減少偏差
  • Stacking:通過訓練多個不同類型的基學習器,并將它們的輸出作為特征輸入到一個高層模型中,從而提升預測性能

每種方法都有其獨特的優勢和適用場景。在本文中,我們將重點介紹 Boosting 算法,它主要聚焦于通過提高模型的準確度來減少偏差。

2. Boosting算法詳解

Boosting 是一種迭代加權的集成學習方法,旨在通過多個弱學習器(通常是偏差較大的模型)的組合,構建一個具有較低偏差和較高準確度的強學習器。與 Bagging 不同,Boosting 關注的是減小模型的 偏差,而非僅僅減少方差。

Boosting 算法通過逐步構建和改進模型,使得每個新模型都能夠專注于糾正前一個模型的錯誤。這種方式使得模型的 預測能力 不斷得到提高。Boosting 的核心思想是 順序訓練。每個新的模型都在前一個模型的基礎上進行訓練,重點關注那些被前一個模型錯誤分類的樣本。通過這種方式,Boosting 可以有效地減少偏差,進而提升模型的精度。

3. Gradient Boosting算法詳解

3.1 基本思想

Gradient Boosting 是 Boosting 的一種實現方法,它通過梯度下降的方式,逐步減少模型的偏差。在每一輪迭代中,Gradient Boosting 都會根據上一輪模型的預測誤差(殘差)訓練一個新的弱學習器,最終的預測結果是所有模型預測結果的加權和。

舉個簡單的例子,假設一個樣本真實值為10,若第一個學習器擬合結果為7,則殘差為 10-7=3, 殘差3作為下一個學習器的擬合目標。若第二個學習器擬合結果為2,則這兩個弱學習器組合而成的Boosting模型對于樣本的預測為7+2 = 9,以此類推可以繼續增加弱學習器以提高性能。

Gradient Boosting還可以將其理解為函數空間上的梯度下降。我們比較熟悉的梯度下降是在參數空間上的梯度下降(例如訓練神經網絡,每輪迭代中計算當前損失關于參數的梯度,對參數進行更新)。而在Gradient Boosting中,每輪迭代生成一個弱學習器,這個弱學習器擬合損失函數關于之前累積模型的梯度,然后將這個弱學習器加入累積模型中,逐漸降低累積模型的損失。即 參數空間的梯度下降利用梯度信息調整參數降低損失,函數空間的梯度下降利用梯度擬合一個新的函數降低損失。

3.2 公式推導

假設有訓練樣本 { x i , y i } , i = 1... n \{x_i,y_i\}, i=1...n {xi?,yi?},i=1...n,在第 m ? 1 m-1 m?1 輪獲得的累積模型為 F m ? 1 ( x ) F_{m-1}(x) Fm?1?(x),則第 m m m 輪的弱學習器 h ( x ) h(x) h(x) 可以通過下式得到

F m ( x ) = F m ? 1 ( x ) + arg ? min ? h ∈ H Loss ( y i , F m ? 1 ( x i ) + h ( x i ) ) F_m(x) = F_{m-1}(x) + \arg \min_{h \in H} \, \text{Loss}(y_i, F_{m-1}(x_i) + h(x_i)) Fm?(x)=Fm?1?(x)+arghHmin?Loss(yi?,Fm?1?(xi?)+h(xi?))

其中上式等號右邊第二項的意思是:在函數空間 H H H 中找到一個弱學習器 h ( x ) h(x) h(x),使得加入這個弱學習器之后的累積模型的 l o s s loss loss 最小。那么應該如何找這個 h ( x ) h(x) h(x) 呢?在第 m ? 1 m-1 m?1 輪結束后,我們可以計算得到損失 L o s s ( y , F m ? 1 ( x ) ) Loss(y,F_{m-1}(x)) Loss(y,Fm?1?(x)),如果我們希望加入第 m m m 輪的弱學習器后模型的 l o s s loss loss 最小,根據最速下降法新加入的模型損失函數沿著負梯度的方向移動,即如果第 m 輪弱學習器擬合函數關于累積模型 F m ? 1 ( x ) F_{m-1}(x) Fm?1?(x) 的負梯度,則加上該弱學習器之后累積模型的 l o s s loss loss 會最小。

因此可以得知第 m 輪弱學習器訓練的目標是損失函數的負梯度,即:

g m = ? ? Loss ( y , F m ? 1 ( x ) ) ? F m ? 1 ( x ) g_m = - \frac{\partial \, \text{Loss}(y, F_{m-1}(x))}{\partial F_{m-1}(x)} gm?=??Fm?1?(x)?Loss(y,Fm?1?(x))?

如果 Gradient Boosting中采用平方損失函數 L o s s = ( y ? F m ? 1 ( x ) ) 2 Loss=(y-F_{m-1}(x))^2 Loss=(y?Fm?1?(x))2,損失函數負梯度計算出來剛好是殘差 y ? F m ? 1 ( x ) y-F_{m-1}(x) y?Fm?1?(x),因此也會說Gradient Boosting每一個弱學習器是在擬合之前累積模型的殘差。這樣的說法不具有一般性,如果使用其他損失函數或者在損失函數中加入正則項,那么負梯度就不再剛好是殘差。

由此可得完整的 Gradient Boosting 算法流程:
在這里插入圖片描述
以上 Gradient Boosting 的算法流程具有一般性,根據其中的損失函數和弱學習器的不同可以演變出多種不同的算法。如果損失函數換成平方損失,則算法變成 L2Boosting;如果將損失函數換成 log-loss,則算法成為 BinomialBoost;如果是指數損失,則算法演變成 AdaBoost;還可以采用 Huber loss 等更加 robust 的損失函數。弱學習器如果使用決策樹,則算法成為 GBDT(Gradient Boosting Decision Tree),使用決策樹作為弱學習器的 GBDT 使用較為普遍。

4. Python實現

python偽代碼實現 GradientBoosting :

class GradientBoosting:def __init__(self, base_learner, n_learner, learning_rate):self.learners = [clone(base_learner) for _ in range(n_learner)]self.lr = learning_ratedef fit(self, X, y):residual = y.copy()for learner in self.learners:learner.fit(X, residual)residual -= self.lr * learner.predict(X)def predict(self, X):preds = [learner.predict(X)  for learner in self.learners]return np.array(preds).sum(axis=0) * self.lr

加入學習率 (learning_rate 或 lr) 的目的是為了控制每個基學習器(或弱學習器)對最終模型的貢獻度,從而達到更好的訓練效果和避免過擬合。 具體來說,學習率的作用可以總結為以下幾點(From ChatGPT):

1.防止過擬合

在 Gradient Boosting 中,訓練過程是逐步的,每一輪都會基于前一輪的殘差訓練一個新的基學習器,并將其結果加到已有模型中。假設沒有學習率的話,每個基學習器的預測值將完全被加到累積模型中,可能會使模型快速過擬合訓練數據。

學習率 lr 的引入通過調整每個基學習器的權重,從而控制模型每次更新的幅度。如果學習率過大,可能會使模型在訓練集上快速擬合,導致過擬合;而如果學習率過小,模型訓練速度會變得非常慢,可能需要更多的基學習器來達到同樣的效果。因此,合理的學習率可以在訓練過程中平衡模型的收斂速度和防止過擬合。

2. 控制每個基學習器的貢獻度

Gradient Boosting 的訓練是一個漸進的過程,每個基學習器都會根據前一輪的殘差來進行擬合。沒有學習率的情況下,每個新基學習器的貢獻將會很大,這可能導致模型在早期就對訓練數據過于敏感,無法很好地泛化。

學習率通過縮小每個基學習器的貢獻,避免模型在每輪更新時發生過大的變化。通常來說,較小的學習率需要更多的基學習器(即更多的迭代次數)來收斂,但可以有效減少每個基學習器對最終結果的影響,從而降低過擬合的風險。

3. 控制訓練過程的收斂速度

學習率對模型的收斂速度有很大的影響。較大的學習率可以使模型快速收斂,但可能導致震蕩或過擬合;而較小的學習率使模型收斂較慢,但通常會得到更加平滑和穩健的結果。合理選擇學習率,可以在優化過程的初期實現快速的方向調整,而在后期逐漸精細化模型。

4. 改進模型的穩定性

加入學習率可以幫助模型在訓練過程中避免跳躍式的大幅更新。每個基學習器的調整幅度得到控制,使得模型更新更為平穩,從而使得訓練過程更加穩定,減少了由于每個學習器的過度調整帶來的不穩定性。

數學解釋:
在訓練過程中,每一輪訓練的目標是通過最小化損失函數來擬合前一輪累積模型的殘差。對于每一輪的弱學習器,其目標是擬合當前模型殘差的負梯度。加入學習率 lr 后,訓練過程中的每個弱學習器的輸出會乘以該學習率,從而調節每個學習器對模型更新的貢獻。
具體來說,假設當前模型的輸出為 F m ? 1 ( x ) F_{m-1}(x) Fm?1?(x),而第 m m m 輪的弱學習器的目標是擬合該模型的殘差。使用學習率 lr 后,更新步驟變為:

F m ( x ) = F m ? 1 ( x ) + l r ? h m ( x ) F_m(x) = F_{m-1}(x) + lr*h_m(x) Fm?(x)=Fm?1?(x)+lr?hm?(x)
這里, h m ( x ) h_m(x) hm?(x) 是第 m m m 輪弱學習器的輸出。通過學習率 lr,我們可以控制每個弱學習器的輸出對最終模型的貢獻。

本文參考:
https://borgwang.github.io/ml/2019/04/12/gradient-boosting.html

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

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

相關文章

小米vela系統(基于開源nuttx內核)——如何使用信號量進行PV操作

如何使用信號量進行PV操作 前言信號量1. 信號量簡介2. NuttX中信號量的創建與使用2.1 Nuttx信號量的初始化和銷毀2.2 信號量的等待和發布 3. 信號量的實際應用:下載任務示例3.1 實際代碼3.2 代碼說明3.3 執行說明 4. 信號量的優勢與應用場景5. 常見應用場景&#xf…

CMake學習筆記(2)

1. 嵌套的CMake 如果項目很大,或者項目中有很多的源碼目錄,在通過CMake管理項目的時候如果只使用一個CMakeLists.txt,那么這個文件相對會比較復雜,有一種化繁為簡的方式就是給每個源碼目錄都添加一個CMakeLists.txt文件&#xff…

旅游網站設計與實現

文末附有完整項目代碼 在當今數字化時代,旅游網站成為人們獲取旅游信息的重要途徑。本文將詳細介紹旅游網站的設計與實現,讓你輕松了解其中的技術奧秘! 一、項目背景 隨著社會經濟的發展,人們對精神消費愈發重視,旅游…

【C++】size_t究竟是什么?全面解析與深入拓展

博客主頁: [小????????] 本文專欄: C 文章目錄 💯前言💯一、什么是size_t?為什么需要size_t? 💯二、size_t的特性與用途1. size_t是無符號類型示例: 2. size_t的跨平臺適應性示例對…

【物流管理系統 - IDEAJavaSwingMySQL】基于Java實現的物流管理系統導入IDEA教程

有問題請留言或私信 步驟 下載項目源碼:項目源碼 解壓項目源碼到本地 打開IDEA 左上角:文件 → 新建 → 來自現有源代碼的項目 找到解壓在本地的項目源代碼文件,點擊確定,根據圖示步驟繼續導入項目 查看項目目錄&#xff…

ssh2-sftp-client和ssh2配合使用js腳本快速部署項目到服務器

有時候因為服務器不能實現github或者gitlab的自動部署服務,所以就需要使用腳本來實現自動部署,可以省時省力,一勞永逸。這里就使用ssh2-sftp-client和ssh2來實現,即便是需要sudo權限,也是可以的。 1.先將本地打包后的…

深度解析Linux中的調試器gdb/cgdb的使用

Linux下我們編譯好的代碼,無法直接調試 gcc/g默認的工作模式是realse模式 程序要調試的話,必須是debug模式,也就是說編譯的時候要加-g選項 gdb攜帶調試信息的exe 我們現在在文件夾里面創建一個文件lesson11 里面創建一個累加的代碼&…

【Maui】動態菜單實現(綁定數據視圖)

前言 .NET 多平臺應用 UI (.NET MAUI) 是一個跨平臺框架,用于使用 C# 和 XAML 創建本機移動和桌面應用。 使用 .NET MAUI,可從單個共享代碼庫開發可在 Android、iOS、macOS 和 Windows 上運行的應用。 .NET MAUI 是一款開放源代碼應用,是 X…

Bash語言的語法糖

Bash語言的語法糖 引言 在現代編程語言中,“語法糖”是一個非常常見的術語,它指的是那些使代碼更加易讀、易寫的語法特性。盡管這些特性并不改變語言的功能,但它們能顯著提升開發者的編程體驗。在眾多編程語言中,Bash&#xff0…

linux---Nginx詳細教程(包含安裝,網站部署)

Nginx是一個高性能的HTTP和反向代理服務器,也可以用作郵件代理服務器,其以占有內存少、并發能力強、穩定性高、豐富的功能集、低系統資源消耗而聞名。以下是對Nginx的詳細教程: 一、Nginx簡介 Nginx由俄羅斯人開發,第一個公開版…

RNN之:LSTM 長短期記憶模型-結構-理論詳解-及實戰(Matlab向)

0.前言 遞歸!循環神經網絡Recurrent Neural Network 循環神經網絡(又稱遞歸神經網絡,Recurrent Neural Network,RNN)。是一種用于處理序列數據的神經網絡結構,具有記憶功能,能夠捕捉序列中的時…

泛目錄和泛站有什么差別

啥是 SEO 泛目錄? 咱先來說說 SEO 泛目錄是啥。想象一下,你有一個巨大的圖書館,里面的書架上擺滿了各種各樣的書,每一本書都代表著一個網頁。而 SEO 泛目錄呢,就像是一個超級圖書管理員,它的任務就是把這些…

初識@ffmpeg/ffmpeg庫

前言 FFmpeg是一套可以用來記錄、轉換數字音頻、視頻,并且能夠利用它們來創建一個新的流媒體格式的自由軟件項目,它被廣泛應用在視頻處理、音頻處理以及直播領域。其中,@ffmpeg/ffmpeg 是一個將 FFmpeg 編譯為 WebAssembly(WASM)的庫,可支持幾乎所有的音視頻格式。 安裝…

【圖像去噪】論文復現:反向擴散中加入MAP將擴散模型從高斯去噪推廣到真實去噪!DiffusionVI的Pytorch源碼復現,跑通源碼,梳理理論,單卡可執行!

請先看【專欄介紹文章】:【圖像去噪(Image Denoising)】關于【圖像去噪】專欄的相關說明,包含適配人群、專欄簡介、專欄亮點、閱讀方法、定價理由、品質承諾、關于更新、去噪概述、文章目錄、資料匯總、問題匯總(更新中) 完整代碼和訓練好的模型權重文件下載鏈接見本文底…

Windows 藍牙驅動開發-簡介

藍牙(英語:Bluetooth)是一種無線通信技術標準,用來讓固定與移動設備,在短距離間交換資料,以形成個人局域網(PAN)。其使用短波特高頻(UHF)無線電波,經由2.4至2.485 GHz的ISM頻段來進行通信。1994年由電信商愛立信(Erics…

【Vue】全局/局部組件使用流程(Vue2為例)

全局組件和局部組件區別 如何使用 全局組件:全局注冊后,可以在任意頁面中直接使用。局部組件:在頁面中需要先導入子組件路徑,注冊組件才能使用。 適用場景 全局組件:適用于高頻使用的組件,如導航欄、業…

【Pytorch實用教程】PyTorch 中如何輸出模型參數:全面指南

文章目錄 PyTorch 中如何輸出模型參數:全面指南1. 為什么需要輸出模型參數?2. PyTorch 中輸出模型參數的方法2.1 使用 `model.parameters()` 輸出所有參數2.2 使用 `model.named_parameters()` 輸出參數名稱和值2.3 使用 `model.state_dict()` 輸出模型的參數字典2.4 輸出特定…

vscode vue 自動格式化

vscode vue 自動格式化 安裝Prettier和Vetur插件 選擇設置,并且轉到編輯文件。增加如下內容。 {"editor.formatOnSave": true,"editor.defaultFormatter": "esbenp.prettier-vscode","[vue]": {"editor.defaultFor…

1、docker概念和基本使用命令

docker概念 微服務:不再是以完整的物理機為基礎的服務軟件,而是借助于宿主機的性能。以小量的形式,單獨部署的應用。 docker:是一個開源的應用容器引擎,基于go語言開發的,使用時apache2.0的協議。docker是…

Genymotion配套VirtualBox所在地址

在 Genymotion打開虛擬機前需要先打開VirtualBox中的虛擬機 C:\Program Files\Oracle\VirtualBox\VirtualBox.exe 再開啟genymotion中的虛擬機開關