集成學習(上):Bagging集成方法

一、什么是集成學習?

在機器學習的世界里,沒有哪個模型是完美無缺的。就像古希臘神話中的"盲人摸象",單個模型往往只能捕捉到數據特征的某個側面。但當我們把多個模型的智慧集合起來,就能像拼圖一樣還原出完整的真相,接下來我們就來介紹一種“拼圖”算法——集成學習。

集成學習是一種機器學習技術,它通過組合多個模型(通常稱為“弱學習器”或“基礎模型”)的預測結果,構建出更強、更準確的學習算法。這種方法的主要思想是利用群體智慧的概念——即整體性能優于單個個體。

1.1 集成學習的核心機制

集成學習大體分為三種序列集成方法(Boosting)、并行集成方法(Bagging)、堆疊集成方法(Stacking):
在這里插入圖片描述

  1. Bagging(Bootstrap Aggregating)
    • 原理:通過自助采樣法(Bootstrap Sampling)生成多個子數據集,分別訓練基學習器,最終通過投票(分類)或平均(回歸)結合結果。

    • 算法流程

原始數據集
Bootstrap采樣
子數據集1
子數據集2
...
子數據集N
模型1訓練
模型2訓練
模型3訓練
模型N訓練
聚合預測
最終結果
  • 數學表達
    自助采樣時,每個樣本未被選中的概率為
    P = ( 1 ? 1 m ) m ≈ 1 e ≈ 36.8 % , P = \left(1 - \frac{1}{m}\right)^m \approx \frac{1}{e} \approx 36.8\%, P=(1?m1?)me1?36.8%,
    其中 m m m為原始數據集大小。
  • 代表算法:隨機森林(Random Forest)。
  1. Boosting

    • 原理:基學習器按順序訓練,后續模型重點關注前序模型的錯誤樣本,最終加權結合所有模型的預測結果。
    • 算法流程
      在這里插入圖片描述
    • 關鍵步驟
      • 計算基學習器的加權錯誤率 ? t \epsilon_t ?t?
      • 調整樣本權重,使錯誤樣本在下一輪訓練中更受關注;
      • 最終預測結果為各模型的加權投票。
    • 代表算法:AdaBoost、GBDT、XGBoost。
  2. Stacking(堆疊泛化)

    • 原理:將多個基學習器的輸出作為“元特征”,訓練一個元學習器(Meta-Learner)進行最終預測。

    • 算法流程
      在這里插入圖片描述

    • 實現步驟

      1. 基學習器在訓練集上通過交叉驗證生成元特征;
      2. 元學習器基于這些特征進行訓練。

1.2 集成學習的優勢

  1. 降低方差(Bagging):通過平均多個高方差模型(如決策樹)的預測,減少過擬合。
  2. 降低偏差(Boosting):通過逐步修正錯誤,提升模型對復雜模式的擬合能力。
  3. 提高泛化能力:結合不同模型的優勢,增強對未知數據的適應性。

1.3 局限性

  1. 計算成本高:需訓練多個模型,時間和資源消耗較大。
  2. 可解釋性差:模型復雜度高,難以直觀理解預測邏輯。
  3. 過擬合風險:若基學習器本身過擬合,集成后可能加劇這一問題(尤其是Boosting)。

二、Bagging方法的革命性突破

在了解了集成學習之后,我們先來學習集成學習算法中的 Bagging 集成學習方法:

Bagging(Bootstrap Aggregating)作為集成學習三劍客之首,由Leo Breiman于1996年提出,其核心思想通過三個顛覆性創新徹底改變了機器學習實踐:

  1. Bootstrap采樣:有放回抽樣生成多樣性訓練集
  2. 并行訓練機制:基模型獨立訓練實現高效并行
  3. 民主投票策略:平等加權聚合降低預測方差
# Bootstrap采樣可視化示例
import numpy as np
import matplotlib.pyplot as pltoriginal_data = np.arange(100)
bootstrap_samples = [np.random.choice(original_data, 100, replace=True) for _ in range(5)]plt.figure(figsize=(10,6))
for i, sample in enumerate(bootstrap_samples[:3]):plt.scatter([i]*100, sample, alpha=0.5)
plt.title("Bootstrap采樣分布可視化")
plt.ylabel("樣本索引")
plt.xlabel("采樣批次")
plt.show()

三、算法原理深度剖析

3.1 數學本質

設基模型為 h i ( x ) h_i(x) hi?(x),Bagging的預測結果為:
H ( x ) = 1 N ∑ i = 1 N h i ( x ) H(x) = \frac{1}{N}\sum_{i=1}^N h_i(x) H(x)=N1?i=1N?hi?(x)

方差分解公式:
Var ( H ) = ρ σ 2 + 1 ? ρ N σ 2 \text{Var}(H) = \rho\sigma^2 + \frac{1-\rho}{N}\sigma^2 Var(H)=ρσ2+N1?ρ?σ2
其中 ρ \rho ρ 為模型間相關系數, σ 2 \sigma^2 σ2 為單個模型方差

3.2 關鍵技術創新

技術維度傳統方法Bagging創新
數據使用全量數據有放回抽樣
模型關系串行依賴完全獨立
預測聚合加權平均平等投票
特征選擇全特征隨機子空間

3.3 算法演進路線

1996原始Bagging
2001隨機森林
2004Extra-Trees
2012深度森林
2020在線Bagging

四、六大核心實現技術

4.1 雙重隨機性設計

from sklearn.ensemble import RandomForestClassifier# 同時啟用樣本隨機和特征隨機
rf = RandomForestClassifier(max_samples=0.8,        # 樣本隨機采樣率max_features='sqrt',    # 特征隨機選擇bootstrap=True
)

4.2 OOB(Out-of-Bag)估計

內置交叉驗證通過 OOB 樣本實現免交叉驗證評估:

# OOB評分自動計算
rf = RandomForestClassifier(oob_score=True)
rf.fit(X_train, y_train)
print(f"OOB準確率:{rf.oob_score_:.4f}")

4.3 特征重要性分析

可視化關鍵影響因子:

import matplotlib.pyplot as pltfeatures = ["年齡", "收入", "負債率", "信用分"]
importances = forest.feature_importances_plt.barh(features, importances)
plt.title('特征重要性分析')
plt.show()

特征重要性可視化

4.4 并行化加速

from joblib import Parallel, delayeddef train_tree(data):X_sample, y_sample = bootstrap_sample(data)return DecisionTree().fit(X_sample, y_sample)# 并行訓練100棵樹
trees = Parallel(n_jobs=8)(delayed(train_tree)(data) for _ in range(100))

4.5 概率校準

from sklearn.calibration import CalibratedClassifierCVcalibrated_rf = CalibratedClassifierCV(rf, method='isotonic', cv=5)
calibrated_rf.fit(X_train, y_train)

4.6 異常值魯棒性

# 使用絕對誤差替代平方誤差
from sklearn.ensemble import RandomForestRegressorrobust_rf = RandomForestRegressor(criterion='absolute_error',max_samples=0.632,min_samples_leaf=10
)

五、實戰指南

案例1:金融反欺詐系統

  • 數據集:50萬條交易記錄
  • 特征維度:128維(包含時序特征、設備指紋、交易模式等)
  • 類別比例:正常交易98.7%,欺詐交易1.3%
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report# 加載百萬級交易數據
X, y = load_fraud_transactions()# 構建隨機森林模型
fraud_model = RandomForestClassifier(n_estimators=500,max_depth=10,class_weight="balanced"
)# 訓練與評估
fraud_model.fit(X_train, y_train)
y_pred = fraud_model.predict(X_test)
print(classification_report(y_test, y_pred))

案例2:醫療影像診斷

import joblib
from skimage.feature import hog# 提取HOG特征
def extract_features(images):return np.array([hog(img) for img in images])# 訓練癌癥診斷模型
X_features = extract_features(medical_images)
cancer_model = RandomForestClassifier()
cancer_model.fit(X_features, labels)# 保存診斷系統
joblib.dump(cancer_model, "cancer_diagnosis.model")

案例3:電商推薦系統

from sklearn.ensemble import RandomForestRegressor# 用戶行為特征矩陣
user_features = generate_user_vectors()# 預測購買概率
purchase_model = RandomForestRegressor()
purchase_model.fit(user_features, purchase_labels)# 實時推薦
live_user = get_live_data()
pred_score = purchase_model.predict([live_user])

案例4:工業設備預測性維護

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler# 構建特征工程流水線
maintenance_pipe = make_pipeline(StandardScaler(),RandomForestClassifier(n_estimators=300)
)# 在線學習更新
partial_data, partial_label = stream_data()
maintenance_pipe.partial_fit(partial_data, partial_label)

六、性能優化八項黃金法則

6.1 參數調優矩陣

參數優化策略推薦范圍
n_estimators早停法+OOB監控200-2000
max_depth交叉驗證網格搜索8-30
max_features特征工程后動態調整sqrt/log2/0.3
min_samples_split基于類別分布調整2-50
bootstrap樣本量<10萬設為TrueBool
class_weight使用balanced_subsampleauto/自定義
ccp_alpha后剪枝優化0-0.01
max_samples大數據集設為0.80.6-1.0

6.1 超參數黃金組合(根據實際項目調整)

optimal_params = {'n_estimators': 500,          # 樹的數量'max_depth': 15,              # 樹的最大深度'min_samples_leaf': 5,        # 葉節點最小樣本數'max_features': 'sqrt',       # 特征采樣策略'n_jobs': -1,                # 使用全部CPU核心'oob_score': True            # 開啟OOB評估
}

6.3 內存優化技巧

# 使用內存映射處理超大矩陣
import numpy as np
X = np.load('bigdata.npy', mmap_mode='r')# 增量訓練
for subset in np.array_split(X, 10):partial_model = rf.fit(subset)rf.estimators_.extend(partial_model.estimators_)

6.4 特征工程技巧

  • 對高基數類別特征進行目標編碼
  • 使用時間序列特征生成滯后變量
  • 對數值特征進行分箱離散化
from category_encoders import TargetEncoder# 處理地址等類別特征
encoder = TargetEncoder()
X_encoded = encoder.fit_transform(X_cat, y)

七、踩坑實測避坑指南:十大常見誤區

  1. 樣本量不足時仍使用默認bootstrap

    • 修正方案:當n_samples<1000時設置bootstrap=False
  2. 忽略特征重要性分析

    • 必須使用permutation importance進行驗證
  3. 類別不平衡數據使用普通隨機森林

    • 應選用BalancedRandomForest
  4. 超參數網格搜索順序錯誤

    • 正確順序:n_estimators → max_depth → min_samples_split
  5. 誤用OOB分數作為最終評估

    • OOB需與holdout集結合驗證
  6. 忽略特征尺度敏感性

    • 樹模型雖無需歸一化,但對范圍敏感特征需特殊處理
  7. 錯誤處理缺失值

    • 應顯式用np.nan表示缺失,而非填充-999
  8. 過度依賴默認參數

    • 必須根據數據分布調整min_samples_leaf等參數
  9. 忽略并行化資源分配

    • 合理設置n_jobs避免內存溢出
  10. 模型解釋方法不當

    • 推薦使用SHAP值替代傳統feature_importance

八、行業應用全景圖

行業領域典型場景技術要點
金融科技反欺詐評分時序特征處理+增量學習
醫療健康疾病風險預測多模態數據融合
智能制造設備故障預警振動信號特征提取
零售電商用戶流失預測行為序列建模
自動駕駛障礙物識別點云數據處理
能源管理電力負荷預測多周期特征工程
網絡安全入侵檢測流量時序分析
物聯網傳感器異常檢測邊緣計算優化

九、性能對比實驗

使用OpenML-CC18基準測試集對比:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
from xgboost import XGBClassifier# 對比不同算法
datasets = fetch_openml('cc18')
results = {}
for name, data in datasets.items():X, y = datarf_score = cross_val_score(RandomForestClassifier(), X, y).mean()xgb_score = cross_val_score(XGBClassifier(), X, y).mean()results[name] = {'RF': rf_score, 'XGB': xgb_score}# 可視化對比結果
pd.DataFrame(results).T.plot(kind='box')
plt.title("算法性能對比")

實驗結論:

  • 在小樣本場景(n<10k)下,RF平均準確率高出XGBoost 2.3%
  • 在特征稀疏數據上,RF優勢擴大到5.1%
  • 在時間序列數據上,XGBoost反超1.7%

下篇預告:中篇將深入解析Boosting系列算法,揭秘XGBoost、LightGBM等冠軍模型的核心原理;下篇將探討Stacking與Blending高級集成策略,解鎖Kaggle競賽的終極武器。

通過本篇內容,您已經掌握了Bagging集成學習的核心要義。現在登錄Kaggle選擇任意數據集,使用隨機森林開啟您的第一個集成學習項目吧!當您處理下一個預測任務時,不妨先思考:這個場景是否需要更強的泛化能力?是否需要自動特征選擇?如果是,Bagging就是您的最佳起點。

如果您有更好的建議,可以在評論區留言討論。

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

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

相關文章

VLLM:虛擬大型語言模型(Virtual Large Language Model)

VLLM&#xff1a;虛擬大型語言模型&#xff08;Virtual Large Language Model&#xff09; VLLM指的是一種基于云計算的大型語言模型的虛擬實現。它通常是指那些由多個服務器組成的分布式計算環境中的復雜機器學習模型&#xff0c;這些模型能夠處理和理解大量的文本數據。VLLM的…

Springboot+Vue登錄、注冊功能(含驗證碼)(后端!)

我們首先寫一個接口&#xff0c;叫login&#xff01;然后對傳入一個user&#xff0c;因為我們前端肯定是要傳過來一個user&#xff0c;然后我們后端返回一個user&#xff0c;因為我們要根據這個去校驗&#xff01;我們還引入了一個hutool的一個東西&#xff0c;在pom文件里面引…

馮 ? 諾依曼體系結構

馮 ? 諾依曼體系結構 一、馮 ? 諾依曼體系結構推導階段 1&#xff1a;初始計算機體系結構&#xff08;僅輸入、運算、輸出&#xff09;階段 2&#xff1a;加入控制功能&#xff0c;初步形成 CPU 概念階段 3&#xff1a;性能瓶頸與引入內存階段 4&#xff1a;最終馮諾依曼體系…

Python print() 打印多個變量時,可變對象和不可變對象的區別

先來看這段代碼&#xff1a; tmp [] print(tmp, tmp.append(1), tmp)輸出&#xff1a; [1] None [1]并不是一些人認為的 [] None [1] 這是因為列表是可變對象&#xff0c;print()打印前會先計算出所有結果&#xff0c;最后再打印出來&#xff0c;中間在列表中添加了1&#…

【數學 線性代數】差分約束

前言 C算法與數據結構 本博文代碼打包下載 什么是差分約束 x系列是變量&#xff0c;y系列是常量&#xff0c;差分系統由若干如下不等式組成。 x1-x2 < y1 x2-x3 < y2 ? \cdots ? 可能有負環的最短路 個人習慣&#xff1a;如果存在a指向b的邊&#xff0c;則a是b的…

AutoGen :使用 Swarm 構建自治型多智能體團隊

??????本人承接各類AI相關應用開發項目(包括但不限于大模型微調、RAG、AI智能體、NLP、機器學習算法、運籌優化算法、數據分析EDA等) !!!?????? 有意愿請私信!!!AutoGen 的 AgentChat 模塊提供了一種強大的方法來構建多智能體協作系統。 在之前的文章中,我們探討了…

2025人工智能“落地生花”:這六大領域正掀起顛覆性革命

——從醫療到養老&#xff0c;一場“AI”的全民狂歡正在上演 2025年的春天&#xff0c;全球科技界的熱搜被一個中國AI大模型“霸榜”——DeepSeek。從春晚的機器人熱舞到政務系統的“數字員工上崗”&#xff0c;從醫療診斷到工業煉鋼&#xff0c;這場始于春節的技術海嘯&#…

第27周JavaSpringboot git初識

Git 課程筆記 一、Git 的介紹 1. Git 的誕生背景 Git 是 Linux 內核的作者 Linus Torvalds 為了更好地管理 Linux 內核開發而創建的版本控制系統。在 Linux 內核開發初期&#xff0c;由于開發者眾多&#xff0c;協作成本很高&#xff0c;后來使用了 BitKeeper 工具來輔助協作…

藍耘智算|從靜態到動態:探索Maas平臺海螺AI圖片生成視頻功能的強大能力

文章目錄 &#x1f44f;一、技術介紹&#x1f44f;二、平臺注冊&#x1f44f;三、功能體驗&#x1f44f;四、總結 隨著人工智能技術的快速發展&#xff0c;視頻處理和生成技術已經成為了眾多行業關注的熱點。最近&#xff0c;我有機會體驗了藍耘智算平臺的Maas平海螺AI視頻產品…

解決從deepseek接口獲取的流式響應輸出到前端都是undefined的問題

你的前端 EventSource 代碼遇到了 undefined 連續輸出 的問題&#xff0c;通常是因為&#xff1a; AI 返回的內容被拆成了單個字符&#xff0c;導致前端 JSON.parse(event.data).content 獲取到的是單個字符&#xff0c;而 undefined 可能是因為某些數據塊沒有 content 字段。…

VLLM專題(二十七)—使用 Kubernetes

在Kubernetes上部署vLLM是一種可擴展且高效的方式來服務機器學習模型。本指南將引導您使用原生Kubernetes部署vLLM。 此外,您還可以使用以下任意一種方式將vLLM部署到Kubernetes: HelmInftyAI/llmazKServekubernetes-sigs/lwsmeta-llama/llama-stacksubstratusai/kubeaivllm…

前綴和 之 哈希表 之 和 的奇偶與倍數

文章目錄 930.和相同的二元子數組523.連續的子數組和 求解連續子數組的和的問題&#xff0c;常常會使用到這個前綴和的思路&#xff0c;當然當數組存在單調性的時候&#xff0c;可以考慮使用不定長滑動窗口&#xff0c;在這里解釋一下&#xff0c;何為數組的和存在這個單調性&a…

Docker Compose 和 Kubernetes(K8s)對比

Docker Compose 和 Kubernetes&#xff08;K8s&#xff09;在某些方面有相似的功能&#xff0c;但它們的 核心用途和適用場景不同。以下是它們的主要區別和聯系&#xff1a; 1. Docker Compose 和 Kubernetes 的區別 對比項Docker ComposeKubernetes&#xff08;K8s&#xff0…

晶藝代理,100V3.5A高耐壓LA1823完全替換MP9487--啟燁科技有限公司

晶藝品牌LA1823是異步降壓轉換器&#xff0c;COT控制&#xff0c;PFM工作模式, 150KHz/ 250KHz/ 450KHz &#xff0c;開關頻率可調節&#xff0c;輸入電壓4.5~100V&#xff0c;2A平均電流&#xff0c;峰值電流3.5A&#xff0c;采用ESOP8封裝。 晶藝LA1823的特性&#xff1a; 4.…

PLC控制柜在技術創新驅動中功能演進 尤勁恩科技

在智能制造體系中&#xff0c;PLC控制柜不僅承擔著傳統設備控制的基礎功能&#xff0c;更通過工業以太網、PROFIBUS等現場總線技術&#xff0c;構建起分布式控制系統&#xff08;DCS&#xff09;。這種拓撲結構使生產線具備實時數據采集、遠程監控和智能決策能力&#xff0c;顯…

【JavaEE】Spring Boot 日志

目錄 一、日志概述二、使用日志2.1 打印日志2.2 日志框架2.2.1 門面 / 外觀 模式 2.3 日志級別2.3.1 六大分類2.3.2 使用 2.4 日志級別配置2.5 日志的持久化2.6 日志文件分割2.7 日志文件格式2.8 Slf4j 簡單打印日志 一、日志概述 ?志主要是為了發現問題, 分析問題, 定位問題…

代碼隨想錄算法訓練營第34天 | 62.不同路徑 63. 不同路徑 II 整數拆分 不同的二叉搜索樹 (跳過)

62.不同路徑 62. 不同路徑 - 力扣&#xff08;LeetCode&#xff09; 本題大家掌握動態規劃的方法就可以。 數論方法 有點非主流&#xff0c;很難想到。 代碼隨想錄 視頻講解&#xff1a;動態規劃中如何初始化很重要&#xff01;| LeetCode&#xff1a;62.不同路徑_嗶哩嗶哩_b…

uniapp APP權限彈框

效果圖 第一步 新建一個頁面&#xff0c;設置透明 {"path": "pages/permissionDisc/permissionDisc","style": {"navigationBarTitleText": "","navigationStyle": "custom","app-plus": {&…

網絡安全證書培訓機構有哪些

一、前言少敘 記得剛入行的時候&#xff0c;想考一個證書來裝裝門面&#xff0c;結果發現費用太高了&#xff0c;比當時一個月的工資都高&#xff0c;感嘆網絡安全這幫人真舍得花錢&#xff0c;遂放棄。后來入職網絡安全公司&#xff0c;考了一個CISP&#xff0c;在工作中逐漸…

torch.argsorttorch.gather

文章目錄 1. 舉例說明2. pytorch 代碼 1. 舉例說明 torch.argsort 的作用是可以將矩陣中的元素進行從小到大排序&#xff0c;得到對應的序號。假設我們有一個向量a表示如下 a [ 8 , 7 , 6 , 9 , 7 ] \begin{equation} a[8,7,6,9,7] \end{equation} a[8,7,6,9,7]?? 那么從小…