news 2026/6/14 7:35:16

【机器学习】2.集成学习、随机森林与AdaBoost

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【机器学习】2.集成学习、随机森林与AdaBoost

集成学习、随机森林与AdaBoost 系统梳理

本文将从集成学习基础随机森林(Bagging代表)AdaBoost(Boosting代表)三个核心模块,结合语法、表格、实战案例,系统讲解相关知识,并补充扩展算法与对比分析。

1. 集成学习基础

1.1 定义与核心思想

集成学习(Ensemble Learning)是将多个基学习器(如决策树、逻辑回归等)通过特定策略组合,以提升模型的泛化能力(准确性、稳定性)的方法。
核心思想:“弱学习器集成强学习器”,通过降低方差(Bagging)、降低偏差(Boosting)或融合优势(Stacking),解决单一模型的过拟合/欠拟合问题。

1.2 集成学习三大范式

维度Bagging(自助聚合)Boosting(自适应提升)Stacking(堆叠)
训练方式并行(所有基学习器同时训练)串行(基学习器按顺序训练)分层(并行+串行)
样本策略有放回Bootstrap抽样(生成不同样本子集)全样本,动态调整样本权重(聚焦错误样本)全样本,基学习器预测结果作为新特征
权重规则基学习器等权(投票/平均)样本/基学习器权重动态调整(错误率越低,权重越高)元学习器学习权重
核心目标降低方差(抗过拟合)降低偏差(提升拟合能力)融合多模型优势(提升泛化)
代表算法随机森林、BaggingClassifierAdaBoost、GBDT、XGBoostStackingClassifier
过拟合风险高(易过拟合)中(需调参)
计算效率高(并行)低(串行)低(多层训练)

2. 随机森林(Random Forest, RF)

随机森林是Bagging的改进版,基学习器为决策树,核心改进是样本+特征双随机,是工业界最常用的基准模型。

2.1 核心原理

  1. 样本随机:对训练集做Bootstrap抽样(有放回),生成多个样本子集(子集大小与原训练集一致);
  2. 特征随机:训练每棵决策树时,随机选择部分特征(如sqrt(总特征数)),仅用这些特征找最优分割点;
  3. 最终预测:分类用“多数投票制”,回归用“平均值”。

2.2 关键参数(sklearn)

参数名类型作用默认值
n_estimatorsint决策树数量(基学习器个数)100
criterionstr分裂准则:分类用gini(基尼系数)/entropy(信息熵);回归用mse/mae分类:gini;回归:mse
max_depthint决策树最大深度(None表示不限制)None
max_featuresstr/int每棵树随机选择的特征数:分类sqrt(n_features);回归n_features/3分类:sqrt
bootstrapbool是否使用Bootstrap抽样True
oob_scorebool是否用“袋外样本”(未被抽样的样本)评估模型False
n_jobsint并行CPU核心数(-1表示全部)None
random_stateint随机种子(保证结果可复现)None

2.3 语法格式

# 核心库导入fromsklearn.ensembleimportRandomForestClassifier,RandomForestRegressorfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score,mean_squared_error,r2_score# 1. 数据拆分X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)# 2. 分类模型初始化与训练rf_clf=RandomForestClassifier(n_estimators=100,max_depth=5,max_features='sqrt',oob_score=True,random_state=42,n_jobs=-1)rf_clf.fit(X_train,y_train)# 3. 回归模型初始化与训练rf_reg=RandomForestRegressor(n_estimators=100,max_depth=8,max_features='sqrt',random_state=42,n_jobs=-1)rf_reg.fit(X_train,y_train)# 4. 预测与评估y_pred_clf=rf_clf.predict(X_test)acc=accuracy_score(y_test,y_pred_clf)# 分类准确率y_pred_reg=rf_reg.predict(X_test)mse=mean_squared_error(y_test,y_pred_reg)# 回归MSEr2=r2_score(y_test,y_pred_reg)# 回归R²

2.4 实战案例

案例1:随机森林分类(鸢尾花数据集)
importpandasaspdfromsklearn.ensembleimportRandomForestClassifierfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score,classification_reportfromsklearn.datasetsimportload_iris# 1. 加载数据iris=load_iris()X=pd.DataFrame(iris.data,columns=iris.feature_names)y=pd.Series(iris.target,name='species')# 2. 分层拆分数据(保证类别分布)X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42,stratify=y)# 3. 训练模型rf_clf=RandomForestClassifier(n_estimators=100,max_depth=3,oob_score=True,random_state=42,n_jobs=-1)rf_clf.fit(X_train,y_train)# 4. 评估y_pred=rf_clf.predict(X_test)print(f"测试集准确率:{accuracy_score(y_test,y_pred):.4f}")print(f"袋外样本准确率:{rf_clf.oob_score_:.4f}")print("\n分类报告:")print(classification_report(y_test,y_pred,target_names=iris.target_names))# 特征重要性feat_importance=pd.DataFrame({'feature':iris.feature_names,'importance':rf_clf.feature_importances_}).sort_values('importance',ascending=False)print("\n特征重要性:\n",feat_importance)

结果解释

  • 测试集准确率≈1.0(鸢尾花数据集简单),袋外准确率≈0.95,说明模型泛化能力强;
  • 特征重要性显示“花瓣长度(petal length)”是分类核心特征。
案例2:随机森林回归(加州房价数据集)
fromsklearn.ensembleimportRandomForestRegressorfromsklearn.datasetsimportfetch_california_housing# 1. 加载数据cal_housing=fetch_california_housing()X=pd.DataFrame(cal_housing.data,columns=cal_housing.feature_names)y=pd.Series(cal_housing.target,name='median_house_value')# 2. 拆分数据X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)# 3. 训练模型rf_reg=RandomForestRegressor(n_estimators=100,max_depth=8,random_state=42,n_jobs=-1)rf_reg.fit(X_train,y_train)# 4. 评估y_pred=rf_reg.predict(X_test)print(f"测试集MSE:{mean_squared_error(y_test,y_pred):.4f}")print(f"测试集R²:{r2_score(y_test,y_pred):.4f}")# 特征重要性feat_importance=pd.DataFrame({'feature':cal_housing.feature_names,'importance':rf_reg.feature_importances_}).sort_values('importance',ascending=False)print("\n特征重要性:\n",feat_importance)

结果解释

  • R²≈0.85(越接近1越好),说明模型拟合效果优异;
  • 特征重要性显示“MedInc(收入)”是房价最核心影响因素。

2.5 优缺点

优点缺点
抗过拟合能力强(双随机)对噪声过大的数据集敏感
无需特征归一化,处理高维数据回归对极值的拟合不如Boosting
输出特征重要性,可解释性好深度过深仍可能过拟合
并行训练,计算效率高-
对缺失值/异常值不敏感-

3. AdaBoost(Adaptive Boosting)

AdaBoost是Boosting的经典算法,核心是自适应调整样本权重和基学习器权重,聚焦错误样本提升拟合能力。

3.1 核心原理(二分类为例)

  1. 初始化权重:所有样本权重相等,D1(i)=1/ND_1(i) = 1/ND1(i)=1/N(N为样本数);
  2. 迭代训练基学习器
    • 用当前权重训练基学习器hm(x)h_m(x)hm(x)
    • 计算错误率ϵm=∑Dm(i)⋅I(hm(xi)≠yi)\epsilon_m = \sum D_m(i) \cdot I(h_m(x_i) \neq y_i)ϵm=Dm(i)I(hm(xi)=yi)
    • 计算基学习器权重αm=12ln⁡(1−ϵmϵm)\alpha_m = \frac{1}{2}\ln(\frac{1-\epsilon_m}{\epsilon_m})αm=21ln(ϵm1ϵm)(错误率越低,权重越高);
    • 更新样本权重:错误样本权重升高,正确样本权重降低(归一化保证权重和为1);
  3. 最终预测H(x)=sign(∑αm⋅hm(x))H(x) = sign(\sum \alpha_m \cdot h_m(x))H(x)=sign(αmhm(x))(符号函数)。

3.2 关键参数(sklearn)

参数名类型作用默认值
base_estimatorobject基学习器(默认决策树桩:DecisionTreeClassifier(max_depth=1)决策树桩
n_estimatorsint基学习器个数50
learning_ratefloat缩放基学习器权重(越小需更多基学习器)1.0
algorithmstr分类算法:SAMME(离散)/SAMME.R(实数,更快更准)SAMME.R
lossstr回归损失函数:linear/square/exponentiallinear
random_stateint随机种子None

3.3 语法格式

# 核心库导入fromsklearn.ensembleimportAdaBoostClassifier,AdaBoostRegressorfromsklearn.treeimportDecisionTreeClassifier,DecisionTreeRegressor# 1. 数据拆分(同随机森林)X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)# 2. 分类模型初始化与训练ada_clf=AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_depth=2),# 自定义基学习器n_estimators=50,learning_rate=0.8,algorithm='SAMME.R',random_state=42)ada_clf.fit(X_train,y_train)# 3. 回归模型初始化与训练ada_reg=AdaBoostRegressor(base_estimator=DecisionTreeRegressor(max_depth=2),n_estimators=50,learning_rate=0.5,loss='square',random_state=42)ada_reg.fit(X_train,y_train)# 4. 预测与评估(同随机森林)y_pred_clf=ada_clf.predict(X_test)y_pred_reg=ada_reg.predict(X_test)

3.4 实战案例

案例1:AdaBoost分类(鸢尾花数据集)
importpandasaspdfromsklearn.ensembleimportAdaBoostClassifierfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score,classification_reportfromsklearn.datasetsimportload_irisfromsklearn.treeimportDecisionTreeClassifier# 1. 加载数据iris=load_iris()X=pd.DataFrame(iris.data,columns=iris.feature_names)y=pd.Series(iris.target,name='species')# 2. 拆分数据X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42,stratify=y)# 3. 训练模型ada_clf=AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_depth=1),# 决策树桩(弱学习器)n_estimators=100,learning_rate=0.8,algorithm='SAMME.R',random_state=42)ada_clf.fit(X_train,y_train)# 4. 评估y_pred=ada_clf.predict(X_test)print(f"测试集准确率:{accuracy_score(y_test,y_pred):.4f}")print("\n分类报告:")print(classification_report(y_test,y_pred,target_names=iris.target_names))# 基学习器权重(前5个)print("\n前5个基学习器权重:\n",ada_clf.estimator_weights_[:5])

结果解释

  • 准确率≈1.0,说明弱学习器经AdaBoost集成后拟合能力显著提升;
  • 基学习器权重越高,对最终预测的贡献越大。
案例2:AdaBoost回归(加州房价数据集)
fromsklearn.ensembleimportAdaBoostRegressorfromsklearn.datasetsimportfetch_california_housingfromsklearn.treeimportDecisionTreeRegressor# 1. 加载数据cal_housing=fetch_california_housing()X=pd.DataFrame(cal_housing.data,columns=cal_housing.feature_names)y=pd.Series(cal_housing.target,name='median_house_value')# 2. 拆分数据X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)# 3. 训练模型ada_reg=AdaBoostRegressor(base_estimator=DecisionTreeRegressor(max_depth=3),n_estimators=100,learning_rate=0.5,loss='square',random_state=42)ada_reg.fit(X_train,y_train)# 4. 评估y_pred=ada_reg.predict(X_test)print(f"测试集MSE:{mean_squared_error(y_test,y_pred):.4f}")print(f"测试集R²:{r2_score(y_test,y_pred):.4f}")

结果解释

  • R²≈0.75(略低于随机森林),调整n_estimators/max_depth可提升至0.8+;
  • 学习率越小(如0.5),需更多基学习器(如100)才能达到相同效果。

3.5 优缺点

优点缺点
简单易实现,无需特征归一化对噪声/异常值敏感(放大错误样本)
对弱学习器集成效果显著易过拟合(基学习器复杂/数量多)
支持分类/回归串行训练,计算效率低
模型复杂度可控多分类处理不如随机森林

4. 随机森林 vs AdaBoost 核心对比

维度随机森林AdaBoost
集成范式Bagging(并行)Boosting(串行)
基学习器决策树(可深)弱学习器(如决策树桩)
权重策略等权,无样本权重调整动态调整样本/基学习器权重
过拟合风险
计算效率
噪声敏感性
适用场景高维数据、需抗过拟合低维数据、需提升拟合能力
调参核心n_estimators/max_depth/max_featuresn_estimators/learning_rate/base_estimator

5. 扩展算法(简要)

算法核心改进特点
GBDT基于梯度下降拟合残差拟合能力强,易过拟合
XGBoostGBDT+正则化+列抽样+并行优化速度快、效果好,工业界主流
LightGBM直方图优化+单边采样+互斥特征内存小、速度极快,适合大数据
Stacking分层训练(基学习器+元学习器)融合多模型优势,复杂度高

6. 总结

  1. 集成学习的核心是“弱学习器集成强学习器”,Bagging降方差、Boosting降偏差、Stacking融优势;
  2. 随机森林是Bagging的代表,抗过拟合、效率高,是工业界基准模型;
  3. AdaBoost是Boosting的代表,拟合能力强,但需注意过拟合和噪声问题;
  4. 实际应用中,优先用随机森林做基准,若拟合不足(偏差高),再尝试AdaBoost/XGBoost,并通过交叉验证调参。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 0:24:19

【量子计算新手必看】:R中qubit初始化从零到精通的7步法则

第一章:R中qubit初始化的核心概念在量子计算的R语言实现中,qubit(量子比特)的初始化是构建量子算法的第一步。与经典比特只能处于0或1不同,qubit可以处于叠加态,其状态由复数系数表示的概率幅决定。在R中&a…

作者头像 李华
网站建设 2026/6/14 6:16:31

AI大模型训练师:普通人如何拿下年薪90w?揭秘入局黄金期的秘诀!

一、 趋势已定:AI大模型训练师成为黄金赛道 近年来,AI的火爆程度有目共睹。从日常使用的智能语音助手、推荐算法,到企业中的智能客服、数据分析工具,AI技术的应用场景不断拓展。 随着技术的不断迭代,AI大模型的能力越…

作者头像 李华
网站建设 2026/6/10 18:08:22

C++ 重载运算符和重载函数

C 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个重…

作者头像 李华
网站建设 2026/6/13 16:42:38

matlab如何生成自定义的msg消息以及对应的格式,具体方法(推荐)

总结: 1,创建文件,其中必须注意大小写 位置1,必须是小写,并且有下划线,位置2,必须是大写开头没有下划线 2,然后运行:注意路径必须是在joy_stick_msg之前的文件夹,否则会报错,因为ros的消息的命名严格遵循大小写 ros2genmsg(‘E:\workspaceMatlab\robotSystem_Pro\…

作者头像 李华
网站建设 2026/6/13 5:56:01

【流程】——Wordpress零代码快速建站

声明:此篇博客参考了B站博主小枫学长的视频:参考链接 1. 本地建站学习 1.1. 本地部署WordPress 下载小皮面板 下载地址:phpStudy - Windows 一键部署 PHP 开发环境 | 免费本地建站工具 小皮出品 我下载的是v8.1的64版 打开小皮默认网页 安…

作者头像 李华