集成学习实战:使用随机森林、AdaBoost和Stacking模型对鸢尾花数据进行分类与性能评估

1次阅读
没有评论

共计 2313 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景与痛点

集成学习通过组合多个弱学习器来构建一个强学习器,能够显著提升模型的泛化能力和鲁棒性。在实际的分类任务中,单一模型往往难以兼顾准确性和稳定性,而集成方法通过不同策略整合多个模型的优势,成为解决这一痛点的有效手段。鸢尾花数据集作为经典的分类数据集,非常适合用来演示不同集成方法的特性。

集成学习实战:使用随机森林、AdaBoost 和 Stacking 模型对鸢尾花数据进行分类与性能评估

技术选型对比

  1. 随机森林
  2. 优点:并行训练效率高、抗过拟合能力强、能处理高维特征
  3. 缺点:解释性较差、对噪声敏感
  4. 适用场景:特征维度高、需要快速 baseline 的场景

  5. AdaBoost

  6. 优点:对异常值敏感度低、可逐步优化模型
  7. 缺点:对噪声数据敏感、训练时间较长
  8. 适用场景:分类边界清晰、数据质量较好的情况

  9. Stacking

  10. 优点:模型组合灵活、通常能获得最佳性能
  11. 缺点:实现复杂、计算成本高
  12. 适用场景:追求最高准确率且计算资源充足的场景

核心实现细节

随机森林配置

  1. 设置 n_estimators=100 保证足够多的决策树参与投票
  2. bootstrap=True 启用放回抽样(Bagging)
  3. 采用默认的 Gini 不纯度作为分裂标准

AdaBoost 调参

  1. n_estimators=100 控制迭代次数
  2. learning_rate=0.1 防止过拟合的保守学习率
  3. 使用决策树桩(max_depth=1)作为基分类器

Stacking 架构

  1. 第一层基分类器:决策树(max_depth=3)和 KNN(n_neighbors=5)
  2. 元学习器:逻辑回归(C=1.0)
  3. 采用 5 折交叉验证生成元特征

代码实现

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
from sklearn.ensemble import StackingClassifier

# 数据加载与分割
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

# 随机森林
rf = RandomForestClassifier(n_estimators=100, bootstrap=True)
rf.fit(X_train, y_train)

# AdaBoost
ada = AdaBoostClassifier(n_estimators=100, learning_rate=0.1)
ada.fit(X_train, y_train)

# Stacking
base_models = [('dt', DecisionTreeClassifier(max_depth=3)),
    ('knn', KNeighborsClassifier(n_neighbors=5))
]
stack = StackingClassifier(
    estimators=base_models,
    final_estimator=LogisticRegression())
stack.fit(X_train, y_train)

# 评估函数
def evaluate(model, name):
    y_pred = model.predict(X_test)
    print(f"{name} 评估结果:")
    print(classification_report(y_test, y_pred, target_names=iris.target_names))

# 执行评估
evaluate(rf, "随机森林")
evaluate(ada, "AdaBoost")
evaluate(stack, "Stacking")

性能评估

通过对比测试集上的评估指标,我们发现:

  1. 准确率对比
  2. Stacking > 随机森林 > AdaBoost
  3. Stacking 的准确率达到 96.7%

  4. 类别细分表现

  5. 随机森林在 setosa 类别上表现完美(precision=1.0)
  6. AdaBoost 在 virginica 类别上召回率最高
  7. Stacking 在各个类别上表现均衡

  8. 计算效率

  9. 随机森林训练速度最快(0.08s)
  10. Stacking 由于需要训练多层模型,耗时最长(0.15s)

避坑指南

  1. 数据标准化问题
  2. KNN 对特征尺度敏感,实际应用中应先做标准化
  3. 示例代码为简化流程未包含此步骤

  4. 类别不平衡处理

  5. 当各类别样本量差异大时,建议设置 class_weight=’balanced’
  6. 鸢尾花数据集本身是平衡的故未使用

  7. Stacking 过拟合

  8. 发现验证集表现远差于训练集时:
  9. 减少基分类器数量
  10. 使用更简单的元学习器
  11. 增加交叉验证折数

总结与拓展

通过本次实验,我们可以得出以下实践建议:

  1. 当需要快速获得不错的结果时,优先选择随机森林
  2. 当数据质量较好且愿意花时间调参时,AdaBoost 是不错的选择
  3. 当追求最高准确率且资源允许时,应该尝试 Stacking

这些方法可以轻松迁移到其他分类任务,例如:
– 使用相同的流程处理葡萄酒分类数据集
– 将基分类器替换为 SVM 处理文本分类
– 增加 XGBoost 作为新的基学习器

最终选择哪种方法,需要根据具体场景在准确率和计算成本之间做出权衡。

正文完
 0
评论(没有评论)