集成学习、随机森林与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 语法格式

# 核心库导入
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_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)  # 回归MSE
r2 = r2_score(y_test, y_pred_reg)  # 回归R²

2.4 实战案例

案例1:随机森林分类(鸢尾花数据集)
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
from sklearn.datasets import load_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:随机森林回归(加州房价数据集)
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import fetch_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 语法格式

# 核心库导入
from sklearn.ensemble import AdaBoostClassifier, AdaBoostRegressor
from sklearn.tree import DecisionTreeClassifier, 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分类(鸢尾花数据集)
import pandas as pd
from sklearn.ensemble import AdaBoostClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier

# 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回归(加州房价数据集)
from sklearn.ensemble import AdaBoostRegressor
from sklearn.datasets import fetch_california_housing
from sklearn.tree import DecisionTreeRegressor

# 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,并通过交叉验证调参。

更多推荐