Spark MLlib线性回归算法

首先也是最重要的,发放MLlib机器学习数据集,没有给数据的都是耍流氓~

  • 下载地址:github mllib 数据集
  • 第一列是标签,也就y
  • 后面8列是x1、x2、x3...x8
  • 我们的目标是寻找 y =a1*x1 + a2*x2 + ... a8*x8 这样的一个线性方法
  • 这里面a1、a2、...a8是我们通过这一堆 【y和x1、x2、x3...x8 】训练得来的

8c0c9dd30b7d50245633af66f2706c13.png

  1. 构建spark对象(这其实是一句废话)
  2. 读取样本数据(这里需要对数据进行处理,先按照“,”都分割,然后按照“ ”分割,最后获得LabelPoint数据)
  3. 建立线性回归模型,并设置训练参数(LabelPoint数据,迭代次数,梯度下降的步长,其他默认参数)
  4. 对样本进行测试(这里直接把训练数据,拿过来进行预测了,差距还是挺大的)
  5. 计算测试误差(这里采用均方根误差,是观测值与真值偏差的平方和与观测次数比值的平方根,是用来衡量观测值同真值之间的偏差)
  6. 模型保存(方便冷启动,不需要重新训练了)

d822a6e144efd4a3f5041a49929df7bc.png
import org.apache.log4j.{Level, Logger}
import org.apache.spark
import org.apache.spark.SparkContext._
import org.apache.spark.SparkContext
import org.apache.spark.SparkConf

import org.apache.spark.mllib.util.{KMeansDataGenerator, LinearDataGenerator, LogisticRegressionDataGenerator, MLUtils}
import org.apache.spark.mllib.regression.{LabeledPoint, LinearRegressionWithSGD}

//向量
import org.apache.spark.mllib.linalg.Vector
//向量集
import org.apache.spark.mllib.linalg.Vectors
//稀疏向量
import org.apache.spark.mllib.linalg.SparseVector
//稠密向量
import org.apache.spark.mllib.linalg.DenseVector
//实例
import org.apache.spark.mllib.stat.{MultivariateStatisticalSummary, Statistics}
//矩阵
import org.apache.spark.mllib.linalg.{Matrix, Matrices}
//索引矩阵
import org.apache.spark.mllib.linalg.distributed.RowMatrix
//RDD
import org.apache.spark.rdd.RDD

object WordCount {

  def main(args: Array[String]) {
    // 构建Spark 对象
    Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)
    val conf = new SparkConf().setAppName("HACK-AILX10").setMaster("local")
    val sc = new SparkContext(conf)
    // 读取样本数据1
    val datapath1 = "C:\\study\\spark\\lpsa.data"
    val data1 = sc.textFile(datapath1)
    val ex = data1.map{
        line =>
          val parts= line.split(",")

          LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(" ").map(_.toDouble)))
    }.cache()
    val numEx = ex.count()

    // 新建线性回归模型,并设置训练参数

    val numIter = 100
    val stepSize = 1
    val miniBatch = 1.0     //随机梯度下降法SGD
    val model = LinearRegressionWithSGD.train(ex,numIter,stepSize,miniBatch)


    // 对样本进行测试  展示前10个数据
    val prediction = model.predict(ex.map(_.features))
    val prediction_and_label = prediction.zip(ex.map(_.label))
    val print_predict = prediction_and_label.take(10)
    println("预测结果"+"\t\t\t\t\t\t\t"+"标签")
    for(i <- 0 to print_predict.length -1){
      println(print_predict(i)._1 + "\t\t\t\t" + print_predict(i)._2)
    }

    //计算测试误差
    // (预测值 - 真实值)平法和,然后再除以样本数,最后开根号
    val loss = prediction_and_label.map{
      case (p,l) =>
        val err = p -l
        err * err
    }.reduce(_+_)

    val rmse = math.sqrt(loss/numEx)
    println(s"测试 RMSE= $rmse ")

    // 模型保存
    val modelpath = "C:\\study\\spark\\LinearReg"
    model.save(sc,modelpath)
    println("模型保存 ok")
  }
}

2018年研究过一段时间的Web安全机器学习,并且独立开发过基于Nginx的AI-WAF引擎,把Python和C语言混写,牛逼的一塌糊涂。而如今2020年,继续入坑Spark机器学习,希望自己在大数据安全领域,也能具备独立开发能力。加油,lets go ~

本篇完~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ailx10

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

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

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

打赏作者

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

抵扣说明:

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

余额充值