Spark MLlib 进阶
概述
Spark MLlib 是分布式机器学习库,基于 DataFrame 提供统一的 ML Pipeline API。本文覆盖特征工程算子、常用算法、Pipeline 机制与模型持久化,帮你掌握在 Spark 上做机器学习的完整姿势。
一、MLlib 与 ML Pipeline
1.1 定位
MLlib 特点:
分布式(跑在 Spark 集群)
基于 DataFrame API
统一的 Pipeline 抽象
覆盖特征/算法/评估
对比单机库:
数据量大 → MLlib 分布式
精度优先 → 单机 XGBoost/深度学习1.2 核心抽象
| 概念 | 说明 |
|---|---|
| Transformer | 转换器(fit 后 transform) |
| Estimator | 估计器(fit 产生模型) |
| Pipeline | 阶段串联 |
| Param | 参数 |
| Model | 训练结果 |
Pipeline 示例:
VectorAssembler → StandardScaler
→ LogisticRegression → 预测
阶段串联成一条流水线二、特征工程算子
2.1 特征提取
| 算子 | 作用 |
|---|---|
| TF-IDF | 文本向量化 |
| Word2Vec | 词向量 |
| CountVectorizer | 词频向量 |
| HashingTF | 哈希特征 |
文本处理流程:
分词 → TF-IDF/Word2Vec → 特征向量
用于文本分类/相似度2.2 特征转换
| 算子 | 作用 |
|---|---|
| VectorAssembler | 多列合并为向量 |
| StandardScaler | 标准化 |
| MinMaxScaler | 归一化 |
| OneHotEncoder | 类别独热 |
| StringIndexer | 字符串转索引 |
| Bucketizer | 连续值分箱 |
One-Hot vs 索引:
StringIndexer:类别 → 数字索引
OneHotEncoder:类别 → 稀疏向量
高基数类别考虑 Embedding/哈希2.3 特征选择
| 算子 | 作用 |
|---|---|
| ChiSqSelector | 卡方选择 |
| VectorSlicer | 向量切片 |
| Selector | 按重要性选择 |
选择思路:
相关性筛选(卡方/互信息)
重要性筛选(模型特征重要性)
降维(PCA)三、常用算法
3.1 分类算法
| 算法 | 特点 |
|---|---|
| LogisticRegression | 线性、可解释 |
| RandomForest | 集成、鲁棒 |
| GBDT | 强、精度高 |
| NaiveBayes | 简单、文本适用 |
| LinearSVC | 高维稀疏 |
| 多层感知机 | 简单 NN |
分类应用:
风控(欺诈识别)
用户分类(流失/活跃)
文本分类(情感/意图)3.2 回归算法
| 算法 | 特点 |
|---|---|
| LinearRegression | 线性回归 |
| RandomForestRegressor | 非线性 |
| GBDT Regressor | 精度高 |
| 广义线性回归 | 多样分布 |
回归应用:
销量/价格预测
时长/数值预估3.3 聚类算法
| 算法 | 特点 |
|---|---|
| KMeans | 经典、快 |
| Bisecting KMeans | 层次改进 |
| GMM | 概率聚类 |
| LDA | 主题模型 |
聚类应用:
用户分群
异常检测
主题挖掘3.4 推荐算法
| 算法 | 说明 |
|---|---|
| ALS | 交替最小二乘(协同过滤) |
| Item-based CF | 物品相似推荐 |
ALS 原理:
用户-物品矩阵分解
交替优化用户/物品隐因子
支持隐式反馈
应用:
协同过滤推荐
用户/物品向量3.5 算法选型建议
选型:
表格数据 → GBDT/随机森林
文本 → 朴素贝叶斯/线性 SVM
推荐 → ALS
大规模数据 → 分布式线性模型四、模型评估
4.1 评估器
| 任务 | 评估器 | 指标 |
|---|---|---|
| 分类 | BinaryClassificationEvaluator | AUC |
| 分类 | MulticlassClassificationEvaluator | 准确率/F1 |
| 回归 | RegressionEvaluator | RMSE/R² |
| 聚类 | ClusteringEvaluator | 轮廓系数 |
交叉验证:
CrossValidator(k 折)
参数网格搜索
选最优模型示例流程:
ParamGridBuilder 构建网格
CrossValidator 组合评估
返回最优模型五、Pipeline 深入
5.1 Pipeline 机制
Pipeline:
多个阶段(Transformer/Estimator)串联
执行:
fit:训练每个 Estimator
transform:数据流经每个阶段
好处:
统一流程
避免特征泄露
便于部署复用5.2 Pipeline 示例
流程示例:
阶段1:StringIndexer(类别 → 索引)
阶段2:OneHotEncoder(索引 → 向量)
阶段3:VectorAssembler(合并特征)
阶段4:RandomForestClassifier(训练)
一个 Pipeline 完成从原始数据到预测5.3 特征泄露问题
特征泄露:
训练数据包含未来信息 → 评估虚高
例子:
用全部数据做归一化(含测试集)
窗口特征用了未来数据
防护:
只 fit 训练集
时间切分
Pipeline 保证一致性六、模型持久化
6.1 保存与加载
模型保存:
model.save("路径") 或 write().save()
加载:
LogisticRegressionModel.load("路径")
PipelineModel.load("路径")
格式:
元数据(JSON)
参数/权重
依赖信息6.2 部署到生产
部署方式:
批处理:Spark 作业加载模型打分
流处理:Structured Streaming 使用模型
服务化:导出 PMML/ONNX 提供服务
注意:
模型与 Pipeline 一起保存
特征逻辑与训练时一致PMML 导出:
Spark 模型 → PMML 格式
→ 部署到 Java/规则引擎
(适合低延迟在线推理)6.3 模型版本管理
最佳实践:
模型注册(MLflow/模型库)
版本号管理
记录数据/代码/参数
灰度与回滚七、性能与调优
7.1 大数据量训练
数据量大:
使用稀疏向量(减少内存)
采样探索
分布式训练资源合理分配
缓存特征数据(persist)7.2 参数调优
关键参数:
迭代次数(maxIter)
树数量(numTrees)
深度(maxDepth)
正则(regParam)
并行(numBlocks/树并行)
方法:
网格搜索 + 交叉验证
经验基线 + 逐步调整7.3 常见问题
| 问题 | 处理 |
|---|---|
| 内存溢出 | 稀疏向量/增加资源 |
| 训练慢 | 并行度/数据量 |
| 过拟合 | 正则/树深度 |
| 评估虚高 | 防特征泄露 |
八、MLlib 局限与替代
8.1 局限
局限:
深度学习支持弱
单机模型精度通常更高
复杂特征工程能力有限
替代:
深度学习 → PyTorch/TensorFlow
单机强模型 → XGBoost/LightGBM
分布式深度 → Spark Deep Learning 插件8.2 混合架构
实践:
MLlib 做大规模特征工程与简单模型
XGBoost 做精排模型
PyTorch 做深度模型
数据管道统一在 Spark 上九、小结
Spark MLlib 的价值是在数据所在处做机器学习:数据量大不用搬来搬去,用 Pipeline 把特征、训练、评估串成统一流水线。掌握特征算子、核心算法(LR/GBDT/ALS)、Pipeline 与模型持久化,就能支撑大部分表格类机器学习场景;深度学习与极致精度再交给专业框架。