一、Spark MLlib 简介
Spark MLlib 是 Apache Spark 的机器学习库,提供了丰富的机器学习算法和工具,支持大规模数据分布式处理。Spark MLlib 主要包含两套 API:
- RDD-based API(已过时,建议新项目用 DataFrame-based API)
- DataFrame-based API(spark.ml):基于 DataFrame,适合管道(Pipeline)操作和参数调优
二、聚类(Clustering)
聚类是一种无监督学习方法,将数据划分为若干组,使得同组数据相似度高,不同组之间相似度低。
1. 常见聚类算法
(1)K-Means(K均值)
- 原理:指定聚类中心数 K,初始随机选择 K 个中心,迭代分配样本到最近的中心,再更新中心,直到收敛。
- 适用场景:用户分群、市场细分、图像分割等。
API 示例(DataFrame-based):
import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.ml.linalg.Vectors
val data = Seq(
(0, Vectors.dense(0.0, 0.0)),
(1, Vectors.dense(1.0, 1.0)),
(2, Vectors.dense(9.0, 8.0))
).toDF("id", "features")
val kmeans = new KMeans().setK(2).setSeed(1L)
val model = kmeans.fit(data)
val predictions = model.transform(data)
predictions.show()
(2)Gaussian Mixture Model(高斯混合模型,GMM)
- 原理:假设数据由多个高斯分布组成,使用 EM 算法估计参数。
- 适用场景:软聚类、异常检测。
API 示例:
import org.apache.spark.ml.clustering.GaussianMixture
val gmm = new GaussianMixture().setK(2)
val model = gmm.fit(data)
val predictions = model.transform(data)
(3)Bisecting K-Means(二分K均值)
- 原理:层次化聚类方法,每次将一个聚类分成两个,直到达到 K 个聚类。
- 适用场景:层次化聚类需求。
API 示例:
import org.apache.spark.ml.clustering.BisectingKMeans
val bkm = new BisectingKMeans().setK(2)
val model = bkm.fit(data)
三、分类(Classification)
分类是监督学习方法,通过学习已标注数据,将新样本分配到已有类别。
1. 常见分类算法
(1)Logistic Regression(逻辑回归)
- 原理:利用 Sigmoid 函数将线性回归输出映射到 [0, 1],适合二分类和多分类。
- 适用场景:广告点击预测、信用评分。
API 示例:
import org.apache.spark.ml.classification.LogisticRegression
val training = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt")
val lr = new LogisticRegression()
val model = lr.fit(training)
val predictions = model.transform(training)
(2)Decision Tree(决策树)
- 原理:通过特征分裂构建树状结构,适合分类和回归。
- 适用场景:特征可解释性强的任务。
API 示例:
import org.apache.spark.ml.classification.DecisionTreeClassifier
val dt = new DecisionTreeClassifier()
val model = dt.fit(training)
(3)Random Forest(随机森林)
- 原理:多个决策树集成,投票决定分类结果,抗过拟合能力强。
- 适用场景:高维特征、复杂数据。
API 示例:
import org.apache.spark.ml.classification.RandomForestClassifier
val rf = new RandomForestClassifier()
val model = rf.fit(training)
(4)Gradient-Boosted Trees(GBDT,梯度提升树)
- 原理:通过集成多个弱分类器(决策树),不断优化残差。
- 适用场景:高精度分类需求。
API 示例:
import org.apache.spark.ml.classification.GBTClassifier
val gbt = new GBTClassifier()
val model = gbt.fit(training)
(5)支持向量机(SVM)
- 原理:寻找超平面最大化类别间隔。
- API:仅支持线性 SVM。
四、聚类与分类算法的评估
1. 聚类评估
- 轮廓系数(Silhouette)
Spark 支持 KMeans 聚类的轮廓系数评估。import org.apache.spark.ml.evaluation.ClusteringEvaluator val evaluator = new ClusteringEvaluator() val silhouette = evaluator.evaluate(predictions)
2. 分类评估
-
准确率、召回率、F1-score、AUC
Spark 提供MulticlassClassificationEvaluator、BinaryClassificationEvaluator等。import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator val evaluator = new MulticlassClassificationEvaluator() .setLabelCol("label") .setPredictionCol("prediction") .setMetricName("accuracy") val accuracy = evaluator.evaluate(predictions)
五、实际应用建议
- 特征工程:利用
VectorAssembler、StringIndexer、OneHotEncoder等进行特征转换。 - 流水线(Pipeline):将特征处理、模型训练、预测封装成 Pipeline,便于复用和调参。
- 参数调优:用
CrossValidator或TrainValidationSplit进行超参数搜索。 - 分布式处理:MLlib 支持大数据分布式训练,适合大规模数据场景。
六、聚类与分类的高级用法
1. 聚类算法高级参数与模型分析
KMeans 主要参数
k: 聚类中心数量maxIter: 最大迭代次数initMode: 初始化方式(如 “k-means||”、“random”)seed: 随机种子featuresCol: 特征列名
示例:
val kmeans = new KMeans()
.setK(5)
.setMaxIter(50)
.setInitMode("k-means||")
.setSeed(1234L)
模型分析
model.clusterCenters: 查看每个聚类中心的坐标model.computeCost(data): 计算聚类误差(SSE)
GaussianMixture 参数
k: 高斯分布个数maxIter: 最大迭代次数tol: 收敛容忍度
BisectingKMeans 参数
k: 聚类数maxIter: 最大迭代次数
2. 分类算法高级参数与模型分析
LogisticRegression 主要参数
maxIter: 最大迭代次数regParam: 正则化参数elasticNetParam: 弹性网络参数(L1/L2混合)family: “binomial”(二分类)或 “multinomial”(多分类)
示例:
val lr = new LogisticRegression()
.setMaxIter(20)
.setRegParam(0.01)
.setElasticNetParam(0.8)
DecisionTreeClassifier 参数
maxDepth: 最大树深maxBins: 最大分箱数impurity: 不纯度指标(如 “gini”, “entropy”)
RandomForestClassifier 参数
numTrees: 树的数量maxDepth: 最大深度featureSubsetStrategy: 特征采样策略
GBTClassifier 参数
maxIter: 弱分类器数量maxDepth: 最大深度stepSize: 学习率
七、特征工程与数据预处理
1. 特征转换
VectorAssembler: 合并多个特征列为一个向量列StringIndexer: 类别特征转为数字索引OneHotEncoder: 独热编码StandardScaler: 标准化MinMaxScaler: 区间缩放
示例:
import org.apache.spark.ml.feature.VectorAssembler
val assembler = new VectorAssembler()
.setInputCols(Array("feature1", "feature2"))
.setOutputCol("features")
val output = assembler.transform(data)
2. Pipeline 管道构建
Pipeline 可以将特征处理、模型训练、预测等步骤串联起来,便于复用和自动化。
示例:
import org.apache.spark.ml.{Pipeline, PipelineStage}
val stages = Array(indexer, assembler, kmeans)
val pipeline = new Pipeline().setStages(stages)
val model = pipeline.fit(data)
val result = model.transform(data)
八、模型调参与评估
1. 交叉验证(CrossValidator)
用于自动搜索最优参数组合。
示例:
import org.apache.spark.ml.tuning.{CrossValidator, ParamGridBuilder}
val paramGrid = new ParamGridBuilder()
.addGrid(kmeans.k, Array(2, 3, 4, 5))
.build()
val evaluator = new ClusteringEvaluator()
val cv = new CrossValidator()
.setEstimator(kmeans)
.setEvaluator(evaluator)
.setEstimatorParamMaps(paramGrid)
.setNumFolds(3)
val cvModel = cv.fit(data)
2. 分类模型评估
BinaryClassificationEvaluator(AUC、准确率等)MulticlassClassificationEvaluator(准确率、F1等)
九、实际项目常见问题与优化建议
1. 数据倾斜
- 处理方法:适当采样、特征归一化、分桶等。
2. 特征选择
- 使用
ChiSqSelector、PCA等进行特征降维和筛选。
3. 大数据场景下性能优化
- 合理设置分区数(
repartition) - 使用缓存(
persist/cache)加速多次迭代 - 控制模型复杂度防止过拟合
4. 多模型集成
- 可以用 Voting、Stacking 等方式集成多个模型提升准确率(需自定义实现)。
十、聚类与分类实际应用案例
聚类案例:用户分群
- 特征:消费频率、金额、活跃度
- 流程:特征工程 → KMeans 聚类 → 分群结果分析 → 个性化营销
分类案例:信用风险预测
- 特征:年龄、收入、历史违约记录等
- 流程:数据预处理 → 特征工程 → 分类模型(如逻辑回归、随机森林)→ 模型评估 → 风险分级
2057

被折叠的 条评论
为什么被折叠?



