大数据-275 Spark MLib-集成学习:从Bagging到Boosting的群体智慧

TL;DR

  • 场景:机器学习中单一模型性能受限时,需要通过模型集成提升泛化能力
  • 结论:Bagging通过并行平权投票降方差,Boosting通过串行加权提升弱学习器降偏差,两者互补
  • 产出:掌握Bagging(随机森林)、Boosting(AdaBoost/GBDT/XGBoost/LightGBM)核心原理与实践要点

版本矩阵

功能 状态 说明
Bagging 原理 ✅ 已验证 Bootstrap Sampling + 平权投票,并行化提升稳定性
随机森林 ✅ 已验证 Bagging + 决策树,输出类别众数,天然支持并行
Boosting 原理 ✅ 已验证 串行加权训练,逐步提升弱学习器,从AdaBoost到GBDT演进
XGBoost4J-Spark ✅ 已验证 嵌入Spark Executor,支持GPU/CPU分布式,API兼容ML Pipeline
LightGBM-Spark ⚠️ 待验证 基于直方图与Leaf-wise growth,训练速度快,依赖SynapseML
Spark GBT ⚠️ 待验证 纯原生Java/Scala实现,功能与速度距现代框架有差距

集成学习

不指望单个弱模型"包打天下",而是构造一簇互补的基学习器并让它们投票/加权,用"群体智慧"提升泛化能力、稳定性和鲁棒性。

基本定义

集成学习通过建立几个模型来解决单一预测问题,它的工作原理是生成多个分类器/模型,各自独立的学习和做出预测,这些预测最后结合成组合预测,因为优于任何一个单分类的做出预测。

集成学习分类

● 任务一:如何优化训练数据 - 主要用于解决欠拟合问题 ● 任务二:如何提升泛化性能 - 主要用于解决过拟合问题

只要单分类器的表现不太差,集成学习的结果总是要好于单分类器的。

Bagging

集成原理

目标

把下面的圈和方块进行分类

采集不同的数据集

训练分类器

平权投票

获取最终结果

随机森林

在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由所有树输出的类别的众数而定。

随机森林 = Bagging + 决策树

例如,如果你训练了5个树,其中有4个树的结果是True,1个树的结果是False,那么最终投票的结果就是True,随机森林构造过程中的关键步骤(M表示特征数目):

● 一次随机选出部分样本,有放回的抽样,重复N次(有可能出现重复的样本) ● 随机去选出 m 个特征,m << M,建立决策树

Boosting

基本概念

随着学习的积累从弱到强,简而言之:每新加入一个弱学习器,整体能力就会得到提升

代表算法:Adaboost、GBDT、XGBoost、LightGBM

Spark MLlib 的 GBT 相当于 "纯原生 Java/Scala 实现的 GBDT",功能和速度距现代竞赛级框架(XGBoost / LightGBM / CatBoost)仍有差距。工业界常用以下两条路线把先进算法接进 Spark Pipeline:

  • XGBoost4J‑Spark:将每个 XGBoost worker 嵌入 Spark executor,天然支持 GPU / CPU 分布式;API 兼容 ML Pipeline,可与 VectorAssembler、ParamGridBuilder 协同工作。
  • LightGBM‑Spark(microsoft/synapseml):基于 LightGBM 的梯度直方、Leaf‑wise growth,训练速度较快,支持类别特征原生处理与分布式训练。

使用方式大体一致: 把 XGBoostClassifier 或 LightGBMRegressor 替换到 Pipeline 里,并确保 依赖 JAR 与 native lib 在所有 executor 可见。常见踩坑点:

  • 内存分配:XGBoost 需要 executor 拥有足够的 off‑heap;通过 spark.executor.memoryOverhead 和 spark.executor.cores 调整。
  • 数据格式:必须把特征向量转成 Dense 或 Sparse Vector; 并避免 StringIndexer 将类别特征过度 one‑hot,使维度爆炸。
  • GPU 调度:需要 spark.task.resource.gpu.amount=1 并在 YARN/K8s 上配置 spark.executor.resource.gpu.amount。

实现过程

训练第一个学习器

调整数据分布

训练第二个学习器

再次调整数据分布

学习器训练及数据分布调整

整体过程


错误速查卡

症状 根因 定位 修复
XGBoost4J-Spark OOM executor off-heap 不足 检查 spark.executor.memoryOverhead 配置 增大 memoryOverhead 或减少 executor 并发任务数
特征维度爆炸 StringIndexer 过度 one-hot 检查 VectorAssembler 输入特征维度 使用 LabelEncoder 或保留类别特征原始值
Spark GBT 训练慢 纯 JVM 实现无向量化优化 对比 XGBoost/LightGBM 训练时间 切换至 XGBoost4J-Spark 或 LightGBM-Spark
GPU 任务未调度 YARN/K8s 未配置 GPU 资源 检查 spark.executor.resource.gpu.amount 配置 spark.task.resource.gpu.amount=1
随机森林投票偏向多数类 类别不平衡时多数类主导 检查各树输出分布 使用加权投票或调参 classWeight
Boosting 过拟合 弱学习器数量过多/学习率过大 查看验证集曲线 减少迭代次数,降低学习率,增加正则
相关推荐
SimonKing2 小时前
国产开源富文本编辑器 wangEditor,本姓编辑器
java·后端·程序员
Moment2 小时前
面试官:LangChain中 TS 和 Python 版本有什么差别,什么时候选TS ❓❓❓
前端·javascript·后端
ATCH IERV2 小时前
如何在 Spring Boot 中配置数据库?
数据库·spring boot·后端
观测云2 小时前
观测云 x AI Agent:运维智能化的范式跃迁实践
大数据·运维·人工智能
fqrj20262 小时前
网站建设公司怎么选?国内口碑网站建设公司推荐哪家?
大数据·人工智能·html·网站开发
IT_陈寒2 小时前
React状态管理这个坑,我终于爬出来了
前端·人工智能·后端
newsxun2 小时前
布局大湾区“黄金内湾”,HECHTER CAFE亚洲首店落子万象滨海购物村
大数据·人工智能
源码之家2 小时前
计算机毕业设计:Python股票数据可视化与LSTM股价预测系统 Flask框架 LSTM Keras 数据分析 可视化 深度学习 大数据 爬虫(建议收藏)✅
大数据·python·深度学习·信息可视化·django·lstm·课程设计
juniperhan2 小时前
Flink 系列第14篇:Flink Metrics 监控指标详解(生产环境版)
大数据·数据仓库·分布式·flink