二分分类: SVM、逻辑回归、决策树、贝叶斯
多类分类:决策树、贝叶斯
回归:线性最小二乘法
聚类:kmeans、层次法(CURE、CHAMELEON)、网格算法(STING、WaveCluster)
与分类不同,分类是示例式学习,要求分类前指出各个类别,并断言每个元素映射到一个类别,儿聚类是观察式学习,在聚类前可以不知道类别甚至不给定类别数量,是无监督学习的一种。
二分分类
线性SVM
MLlib支持两个线性方法:线性支持向量机SVM和逻辑回归。在MLlib中,训练标签用1表示积极,用0表示消极。
线性SVM是大规模分类任务的标准方法。
L ( w ; x , y ) = max { 0 , 1 − y w T x }
线性SVM算法输出一个SVM模型,对于一个新数据x,模型通过wTx进行预测。
逻辑回归
L ( w ; x , y ) = log ( 1 + exp ( − y w T x ) )
加载测试数据
val data=MLUtils.loadLibSVMFile(sc,"svm_data.txt")
将测试数据划分为training和test (train,test)
val splits = data.randomSplit(Array(0.6,0.4) , seed=11L)
val training=splits(0).cache()
val test=splits(1)
训练模型
val numIterations =100
val model=SVMWithSGD.train(training,numIterations)
清除默认阈值
model.clearThreshold()
计算新模型在测试数据集的效果
val scoreAndLabels = test.map{ point =>
val score= model.predict(point.features)
(score,point.label)
}
得到评估指标
val metrics=new BinaryClassificationMetrics(scoreAndLabels)
val auROC=metrics.areaUnderROC()
SVMWithSGD.train()训练方法使用默认参数。如需配置算法,
val svmAlg=new SVMWithSGD()
svmAlg.optimizer.setNumIterations(200) .setRegParam(0.1).setUpdater(new L1Updater)
val modelL1 =svmAlg.run(training)
其他MLlib算法也支持这种方式自定义。
Kmeans
从文件加载数据
val data=sc.textFile("hdfs://")
使用spark util包中的generateKMeansRDD生成数据集,生成多个中心的混合高斯分布
val data=KMeansDataGenerator.generateKMeansRDD(sc,pointnumber,numClusters,k,r)
转换为RDD
val parseData=data.map( s=> Vectors.dense(s.split(' ').map(_.toDouble)))
生成模型
val model=KMeans.train(parseData , numClusters,numIterations,runs)
数据中心点
model.clusterCenters
预测新数据点
model.predict(Vectors.dense("1.0 2.0 3.0".split(' ').map(_.toDouble)))
数据方差和
model.computeCost(parseData)
kmeans算法的结果好坏依赖于对初始聚类中心的选择,容易陷入局部最优解,对异常数据较为敏感,只能处理数值属性的数据,聚类结构可能不平衡。