SparkMLlib线性回归算法案例

SparkMLlib线性回归算法案例

一、SparkMLlib线性回归模型


MLlib的线性回归模型采用随机梯度下降算法来优化目标函数。MLlib实现了分布式的随机梯度下降算法,其分布方法是:在每次迭代中,随机抽取一定比例的样本作为当前迭代的计算样本;对计算样本中的每一个样本分别计算梯度(分布式计算每个样本的梯度);然后再通过聚合函数对样本的梯度进行累加,得到该样本的平均梯度及损失;最后根据最新的梯度及上次迭代的权重进行权重的更新。

MLlib线性回归模型方程:
在这里插入图片描述

线性回归模型的损失函数是:
在这里插入图片描述
在这里插入图片描述

二、案例实现


  1. 数据格式说明:
    在这里插入图片描述

  2. 测试数据所在位置:测试数据集

  3. 具体实现代码如下:

    package com.spark.ml
    
    import org.apache.log4j.{Level, Logger}
    import org.apache.spark.mllib.linalg.Vectors
    import org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionModel, LinearRegressionWithSGD}
    import org.apache.spark.rdd.RDD
    import org.apache.spark.{SparkConf, SparkContext}
    
    object LinearRegression {
    
      def main(args: Array[String]) {
        // 构建Spark对象
        val conf = new SparkConf().setAppName("LinearRegressionWithSGD").setMaster("local[*]")
        val sc = new SparkContext(conf)
        Logger.getRootLogger.setLevel(Level.WARN)
    
        //读取样本数据
        val data_path1 = "testdatas/lpsa.data"
        val data = sc.textFile(data_path1)
        val examples = data.map { line =>
          val parts = line.split(',')
          LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))
        }.cache()
        // 触发Job实现缓存
        val numExamples = examples.count()
    
        // 新建线性回归模型,并设置训练参数
        val numIterations = 200
        val stepSize = 1
        val miniBatchFraction = 0.5
        val model = LinearRegressionWithSGD.train(examples, numIterations, stepSize, miniBatchFraction)
        val weights = model.weights // 权重
        val intercept = model.intercept // 偏置
        println("权重:" + weights.toArray + "-,偏置:" + intercept)
    
        // 对样本进行测试
        predictByModel(model,examples,numExamples)
    
        // 模型保存
        val ModelPath = "testdatas/model/LinearRegressionModel"
        model.save(sc, ModelPath)
      }
    
      def predictByModel(model: LinearRegressionModel,examples:RDD[LabeledPoint],numExamples:Long): Unit ={
        // 对样本进行测试
        val prediction = model.predict(examples.map(_.features))
        val predictionAndLabel = prediction.zip(examples.map(_.label))
        val print_predict = predictionAndLabel.take(20)
        println("prediction" + "\t" + "label")
        for (i <- 0 to print_predict.length - 1) {
          println(print_predict(i)._1 + "\t" + print_predict(i)._2)
        }
        // 计算测试误差
        val loss = predictionAndLabel.map {
          case (p, l) =>
            val err = p - l
            err * err
        }.reduce(_ + _)
        val rmse = math.sqrt(loss / numExamples)
        println(s"Test RMSE = $rmse.")
      }
    }
    
    

    注意:可不断调整模型参数以便于得到最优的模型

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若兰幽竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值