「日拱一碼」091 機器學習——集成學習

目錄

集成學習介紹

1. 核心思想

2. 為什么有效?

3. 主要流派與方法

A. 并行方法:Bagging (Bootstrap Aggregating)

B. 串行方法:Boosting

C. 堆疊法:Stacking

代碼示例

Bagging 的代表 —— 隨機森林 (Random Forest)


集成學習介紹

1. 核心思想

集成學習是一種機器學習范式,其核心思想非常直觀:“三個臭皮匠,頂個諸葛亮”。它通過構建并結合多個基學習器(Base Learners)?來完成學習任務,而不是只使用一個單一的模型。

通過將多個性能可能僅優于隨機猜測的弱學習器(Weak Learners)?組合起來,集成方法往往能夠形成一個強學習器(Strong Learner),獲得比任何單一模型都更加顯著優越的泛化性能。

2. 為什么有效?

集成學習有效的根本原因在于它降低了模型的方差(Variance)偏差(Bias),或同時降低兩者,從而避免了過擬合或欠擬合。

  1. 統計角度: 假設一個分類任務,25個基分類器每個的錯誤率為 ε = 0.35。如果使用簡單投票法集成,并且假設分類器之間相互獨立,那么集成分類器出錯的概率(即超過一半的分類器都出錯)會遠低于 0.35。這大大提高了準確性。
  2. 計算角度: 很多學習算法(如決策樹)對數據微小變動非常敏感,容易陷入局部最優。通過多次運行并平均結果,集成方法可以平滑掉這種不穩定性,找到一個更穩定、更魯棒的解決方案。
  3. 表示角度: 真實世界的假設空間可能非常龐大,單個模型可能無法找到最優解。集成多個模型相當于擴展了假設空間,從而有可能逼近那個真正的、更優的解。

3. 主要流派與方法

集成學習方法主要分為兩大類:

A. 并行方法:Bagging (Bootstrap Aggregating)
  • 核心思想:通過自助采樣法(Bootstrap Sampling)?從原始數據集中隨機有放回地抽取多個子集,并行地訓練多個基學習器,然后通過投票(分類)?或平均(回歸)?的方式結合預測結果。
  • 目標:主要旨在降低方差,特別適用于那些容易過擬合的復雜模型(如深度決策樹)。
  • 典型算法
    • 隨機森林(Random Forest): Bagging 的升級版和代表作。它在構建每棵決策樹時,不僅對樣本進行隨機采樣,還對特征進行隨機采樣。這種“雙重隨機性”進一步增強了模型的多樣性和泛化能力,有效防止過擬合。
B. 串行方法:Boosting
  • 核心思想:基學習器是串行訓練的。后續的模型會更加關注先前模型預測錯誤的樣本,通過不斷調整樣本的權重或擬合殘差,逐步提升整體性能。
  • 目標:主要旨在降低偏差,將多個弱學習器提升為一個強學習器。
  • 典型算法
    • AdaBoost (Adaptive Boosting): 通過逐步提高被錯誤分類樣本的權重,迫使后續的弱分類器重點關注這些難分的樣本。
    • 梯度提升(Gradient Boosting): 不再是調整樣本權重,而是通過擬合損失函數的負梯度(即殘差)?來迭代地構建模型。每一個新模型都是在學習之前所有模型加總的殘差。
    • XGBoost, LightGBM, CatBoost: 這些都是 Gradient Boosting 的高效、高性能實現,在各類數據科學競賽中占據統治地位。它們通過優化計算速度、處理缺失值、防止過擬合等方面進行了大量改進。
C. 堆疊法:Stacking
  • 核心思想:訓練多個異質的基學習器(第一層模型),然后不是簡單投票,而是訓練一個元學習器(Meta-Learner,第二層模型)?來整合基學習器的預測結果,以得到最終的輸出。
  • 目標:結合不同模型的優勢,形成更強大的預測能力。

代碼示例

Bagging 的代表 —— 隨機森林 (Random Forest)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, ConfusionMatrixDisplay
from sklearn.tree import DecisionTreeClassifier# 1. 加載數據(威斯康星州乳腺癌數據集)
data = load_breast_cancer()
X, y = data.data, data.target
feature_names = data.feature_names# 2. 劃分訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)print("數據集形狀:", X.shape)  # (569, 30)
print("特征示例:\n", feature_names[:5])  # ['mean radius' 'mean texture' 'mean perimeter' 'mean area' 'mean smoothness']
print("目標標簽: 0-惡性(Malignant), 1-良性(Benign)")  # 0-惡性(Malignant), 1-良性(Benign)# 3. 訓練一個單一的決策樹(作為對比基準)
single_tree = DecisionTreeClassifier(random_state=42)
single_tree.fit(X_train, y_train)
y_pred_tree = single_tree.predict(X_test)
acc_tree = accuracy_score(y_test, y_pred_tree)
print(f"\n單一決策樹準確率: {acc_tree:.4f}")  # 0.9474# 4. 訓練隨機森林集成模型
# n_estimators: 森林中樹的數量
# max_features: 尋找最佳分割時考慮的最大特征數,'sqrt'是常用值,即總特征數的平方根
# random_state: 確保結果可重現
rf_clf = RandomForestClassifier(n_estimators=100, max_features='sqrt', random_state=42)
rf_clf.fit(X_train, y_train)# 5. 在測試集上進行預測并評估
y_pred_rf = rf_clf.predict(X_test)
acc_rf = accuracy_score(y_test, y_pred_rf)
print(f"隨機森林準確率: {acc_rf:.4f}")  # 0.9649# 6. 可視化特征重要性(集成模型的強大附加功能)
importances = rf_clf.feature_importances_
indices = np.argsort(importances)[::-1] # 按重要性降序排列索引plt.figure(figsize=(10, 6))
plt.title("Random Forest - Feature Importances")
plt.bar(range(X_train.shape[1]), importances[indices], align='center')
plt.xticks(range(X_train.shape[1]), [feature_names[i] for i in indices], rotation=90)
plt.tight_layout()
plt.show()# 7. 繪制混淆矩陣
cm = confusion_matrix(y_test, y_pred_rf, labels=rf_clf.classes_)
disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=['Malignant', 'Benign'])
disp.plot(cmap='Blues')
plt.title("Random Forest Confusion Matrix")
plt.show()

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

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

相關文章

vscode實現第三方包的使用,cmake結合vcpkg(跨平臺)

要使用cmake和vcpkg組織一個完整的現代cpp項目,一般來說需要三個文件vcpkg.json描述第三方依賴項//vcpkg.json {"dependencies": ["fmt"] }//安裝,在vcpkg.json目錄執行 vcpkg installCMakePresets.json定義項目的本質屬性(What&…

DevExpress中Word Processing Document API學習記錄

文章目錄1 文檔結構劃分2 文檔操作基礎2.1 Positions and Ranges2.2 Secitions2.3 Paragraphs2.4 Tables2.5 Lists2.6 Hyperlinks and Bookmarks2.7 Comments2.8 Headers and Footers2.9 Shapes and Pictures2.10 Watermarks2.11 Charts2.12 OLE Objects2.13 ActiveX Controls2…

Roo Code 的差異_快速編輯功能

什么是差異編輯? 簡單來說,差異編輯就像是一位細心的裝修師傅:他不會把整個房子拆掉重蓋,而是精準地只修補需要改動的部分。Roo Code 的這項功能默認開啟,它通過比對代碼差異(diff)來實施修改&a…

【Axure高保真原型】標簽樹分類查詢案例

今天和大家分享標簽樹分類查詢案例的原型模版,效果包括: 樹形分類——點擊左側樹形里的箭頭,可以展開或收起子級選項; 查詢表格——點擊標簽樹里的選項,如果是末級選項,可以篩選右側表格用戶標簽&#xf…

容器化部署項目05

一、工作原理 鏡像:容器的模板,包括容器運行時所需的數據 容器:運行中的進程,依賴鏡像運行,鏡像的具現化 鏡像你可以把它看成Python中的類,而容器可以看做是類的實例化對象。 一個類可以有多個對象&#xf…

微信小程序 工作日歷 周計劃日報 修改等提報和狀態展示功能,支持h5,Android ,ios,基于uniapp,適配vue2和vue3

Work-calendar 介紹 (底部附鏈接) 基于uni-calendar做的定制化開發,主要功能為工作日歷展示和提報組件 ? 1.支持周計劃日報狀態展示且可配置 ? 2.支持農歷展示配置,回到當日,月份切換 ? 3.日歷,周報…

openharmony 鴻蒙 下 利用藍牙API(a2dp模塊-高級音頻,ble模塊-低功耗藍牙等)完成對藍牙音響的控制(藍牙廣播)

1.首先是登錄頁面(利用webapi 和本地數據存儲完成登陸操作) 2.添加設備(利用ble.startBLEScan 和 ble.on("BLEDeviceFind", onReceiveEvent);完成藍牙掃描與顯示) 3.藍牙ble連接(利用ble.createGattClientDe…

17、邏輯回歸與分類評估 - 從連續到離散的智能判斷

學習目標:理解分類問題的本質和評估方法,掌握邏輯回歸的數學原理和概率解釋,學會二分類和多分類問題的處理方法,熟練使用分類評估指標,理解過擬合和正則化的基本概念。 > 從第16章到第17章:從預測數值到判斷類別 在第16章中,我們學習了線性回歸,解決的是預測連續數…

自動化腳本的核心引擎

自動化腳本作為現代軟件開發與運維的重要工具,其核心引擎承擔著解析指令、調度任務和執行邏輯的關鍵職能。這種引擎本質上是一個輕量級的運行時環境,通過預定義的規則集將人類可讀的腳本語言轉化為機器可執行的原子操作。在持續集成/持續交付&#xff08…

【Vue2 ?】Vue2 入門之旅 · 進階篇(九):Vue2 性能優化

在前幾篇文章中,我們學習了 Vuex 的內部機制以及 Vue Router 的工作原理。本篇將深入探討 Vue2 性能優化,幫助你掌握在開發中提升 Vue 應用性能的方法和技巧。 目錄 性能優化的意義響應式系統優化虛擬 DOM 與渲染優化組件懶加載與按需渲染事件與計算屬性…

【題解】B2600 【深基1.例2】簡單的分蘋果

題目描述 這里有 101010 個蘋果,小 A 拿走了 222 個,Uim 拿走了 444 個,八尾勇拿走剩下的所有的蘋果。我們想知道: 小A 和 Uim 兩個人一共拿走多少蘋果?八尾勇能拿走多少蘋果? 現在需要編寫一個程序&#x…

中小企業 4G 專網部署:性能與成本的最佳平衡

在數字化轉型的浪潮中,中小企業同樣需要安全、穩定和高效的通信網絡。然而,傳統專網的高成本和復雜部署往往成為阻礙。IPLOOK 提供的4G輕量級核心網與專網解決方案,正是幫助中小企業在性能與成本之間找到最佳平衡的關鍵。 中小企業的網絡挑…

LeetCode每日一題,20250914

元音拼寫檢查器 思路 精確匹配 用 HashSet 保存原始單詞&#xff0c;查詢時直接判斷是否存在。 大小寫忽略匹配 用 HashMap<String, String> 保存 小寫單詞 -> 第一次出現的原始單詞。用 putIfAbsent&#xff0c;確保只記錄第一次出現的單詞。 元音模糊匹配 把單詞…

i2s_record_play

這章主要講述i2s 1&#xff1a;環境及配件 esp32c3 esp32s3 idf5.4.1 INMP441 MAX98357A 都使用dma 2&#xff1a;eps32c3 測試 只有1個i2s 只能一邊錄 完 再播放 &#xff0c;內存太小&#xff0c;這里用 flash 存audio里 只說能 錄音 能播放 &#xff0c;效果不好&#xff0…

Spring Boot 3 + EasyExcel 文件導入導出實現

SpringBoot集成EasyExcel 3.x&#xff1a;高效實現Excel數據的優雅導入與導出 在現代企業應用中&#xff0c;Excel作為數據交換的重要工具&#xff0c;幾乎無處不在。如何高效且優雅地實現Excel數據的導入與導出&#xff0c;是每個開發者都需要面對的問題。EasyExcel是阿里巴巴…

Ruby編程實踐:20個實用練習

1、編寫一個程序,計算一年有多少小時。 以下是兩種實現方式的代碼: 方式一: puts 24*365方式二: puts 24*365 puts "(or #{24*366} on a leap year)"2、編寫一個程序,計算十年中有多少分鐘。 以下兩種實現方式: 簡單計算(未考慮閏年數量差異): ru…

邏輯回歸(二):從原理到實戰 - 訓練、評估與應用指南

引言&#xff1a; 上期我們講了什么是邏輯回歸&#xff0c;了解了它如何利用Sigmoid函數將線性回歸的輸出轉化為概率&#xff0c;并通過最大似然估計來尋找最佳參數。今天&#xff0c;我們將繼續這段旅程&#xff0c;學習如何訓練這個 模型、如何評估它的表現&#xff0c;以及如…

9.8C++作業

思維導圖#include <iostream> #include <vector> #include <fstream> using namespace std;class Stu {friend ofstream &operator<<(ofstream &ofs,const Stu &stu); private:string name;string id;int age;double score; public:Stu(){…

Linux內存管理章節十六:非均勻的內存訪問:深入Linux NUMA架構內存管理

引言 在傳統的SMP&#xff08;對稱多處理&#xff09;系統中&#xff0c;所有CPU核心通過一條共享總線訪問同一塊內存&#xff0c;所有內存訪問延遲是均勻的&#xff08;UMA&#xff09;。然而&#xff0c;隨著CPU核心數量的增加&#xff0c;共享總線成為了巨大的性能和 scalab…

【論文翻譯】Seg-Zero: Reasoning-Chain Guided Segmentation via Cognitive Reinforcement

0. 摘要Traditional methods for reasoning segmentation rely on supervised fine-tuning with categorical labels and simple descriptions, limiting its out-of-domain generalization and lacking explicit reasoning processes. To address these limitations, we propo…