spark之线性回归、分类、逻辑回归、流线性回归

线性回归(linear regression)
线性回归是预测定量响应变量的工具。
1.简单线性回归
根据单一的预测变量X预测定量响应变量Y,假定X与Y存在线性关系。
通过大量样本数据估算出截距和斜率的估计值。使用最小二乘方法最终得估计值。

分类
最常见的分类类型是二元分类,二元分类有两种分类,通常命名为正和负。如果有两个以上的分类,就被称为多元分类。MLlib支持两种线性方法分类:线性支持向量机和逻辑回归。线性支持向量机仅支持二元分类,而逻辑回归对二元分类和多元分类都支持。MLlib支持L1和L2正规化变体。MLlib中使用RDD[LabeledPoint]代表训练数据集。
1.线性支持向量机(SVM)
SVM是用于大规模分类任务的标准方法。

import org.apache.spark.mllib.classification.{SVMModel, SVMWithSGD}
import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics
import org.apache.spark.mllib.optimization.L1Updater
import org.apache.spark.{SparkContext, SparkConf}
import org.apache.spark.mllib.util.MLUtils

val conf = new SparkConf().setMaster("master").setAppName("MLlibSVM")
val sc = new SparkContext(conf)

val data = MLUtils.loadLibSVMFile(sc,"data/mllib/sample_libsvm_data.txt")  //加载LIBSVM格式的训练数据
val splits = data.randomSplit(Array(0.6,0.4),seed = 11L) //将数据切分为训练数据(60%)和测试数据(40%)
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()
println("Area under ROC = "+auROC)

//保存和加载模型
model.save(sc,"myModelPath")
val sameModel = SVMModel.load(sc,"myModelPath")

逻辑回归
MLlib实现了两种算法来实解决逻辑回归分析:mini-batch梯度下降和L-BFGS。推荐L-BFGS,因为其收敛更快。

//进行训练算法构建模型
val model = new LogisticRegressionWithLBFGS().setNumClasses(10).run(training)
//在测试数据上计算原始分数
val predictionAndLabels = test.map{case LabeledPoint(label,features) =>
  val prediction = model.predict(features)
  (prediction,label)
}
//获取评估指标
val metrics = new MulticlassMetrics(predictionAndLabels)
val precision = metrics.precision
println("precision = "+precision)
//保存和加载模型
model.save(sc,"myModelPath")
val sameModel = LogisticRegressionModel.load(sc,"myModelPath")

回归
1.线性最小二乘。套索和岭回归
普通最小二乘或线性最小二乘使用非正规化;岭回归使用L2正规化,套索使用L1正规化。

val conf = new SparkConf().setMaster("master").setAppName("MLlibLR")
val sc = new SparkContext(conf)
//加载解析数据
val data = sc.textFile("data/mllib/ridge-data/lpsa.data")
val parsedData = data.map{ line => 
  val parts = line.split(",")
  LabeledPoint(parts(0).toDouble,Vectors.dense(parts(1).split(" ").map(_.toDouble)))
}.cache()

//构建模型
val numIterations = 100
val model = LinearRegressionWithSGD.train(parsedData,numIterations)
//使用训练样本计算模型并且计算训练误差
val valuesAndPreds = parsedData.map{ point =>
  val prediction = model.predict(point.features)
  (point.label,prediction)
}
val MSE = valuesAndPreds.map{ case(v,p) => math.pow((v-p),2) }.mean()
println("training Mean Squared Error = "+MSE)
//保存和加载模型
model.save(sc,"myModelPath")
val sameModel = LinearRegressionModel.load(sc,"myModelPath")

2.流线性回归
流式数据可以适用于线上的回归模型,每当有新数据达到时,更新模型的参数,MLlib目前使用普通的最小二乘支持流线性回归。除了每批数据到达时,模型更新的数据外,实际上与线下的执行时类似的。

val numFeatures = 3
val model = new StreamingLinearRegressionWithSGD().setInitialWeights(Vectors.zeros(numFeatures))
model.trainOn(trainingData)
model.predictOnValues(testData.map(lp => (lp.label,lp.features) )).print()
ssc.start()
ssc.awaitTermination()

猜你喜欢

转载自blog.csdn.net/bigdata_mining/article/details/81123013