分类算法属于<mark>监督式学习</mark>,根据已知标签的样本应用到分类模型中,能把数据库中未知的类标签数据进行归类。
<br/>
分类在数据挖掘中是一项重要的任务,目前在商业上应用最多,常见的典型应用场景有流失预测、精确营销、客户获取、个性偏好等。
<br/>
MLlib 目前支持分类算法有:逻辑回归、支持向量机(SVM)、朴素贝叶斯和决策树。
<br/>
**1. 支持向量机(SVM)**
(1)数据`$SPARK_HOME/data/mllib/sample_libsvm_data.txt`
```txt
0 128:51 129:159 130:253 131:159 ...
1 159:124 160:253 161:255 162:63 ...
```
(2)代码
```scala
import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.rdd.RDD
object SVMAlgorithm {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]")
.setAppName(this.getClass.getName)
val sc: SparkContext = SparkContext.getOrCreate(conf)
val data: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "F:/mlib/sample_libsvm_data.txt")
// 将数据随机分成两份,一份占60%,另一份占40%
val splits: Array[RDD[LabeledPoint]] = data.randomSplit(Array(0.6, 0.4), seed = 11L)
// 将60%数据作为训练集
val training: RDD[LabeledPoint] = splits(0).cache()
// 将40%数据作为测试集
val test: RDD[LabeledPoint] = splits(1)
// 迭代次数为100次
val numIterations = 100
// 进行模型训练
val model: SVMModel = SVMWithSGD.train(training, numIterations)
// 可以选择将模型保存
// 路径会自动创建,如果路径已经存在是会报错的;路径不能指定到文件,只能指定到目录
// model.save(sc, "F:/mlib/model/svm")
// 可以调用load加载模型
// val model:SVMModel = SVMModel.load(sc, "F:/mlib/model/svm")
// 进行模型预测
val scoreAndLabels: RDD[Tuple2[Double, Double]] = test.map {
point =>
val score: Double = model.predict(point.features)
(score, point.label)
}
// 统计分类错误的样本比例
val trainErr:Double = scoreAndLabels.filter(r => r._1 != r._2).count().toDouble / data.count()
println(trainErr) // 0.01
}
}
```