前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站:https://www.captainai.net/dongkelun

前言

本文是讲如何使用spark ml进行线性回归,不涉及线性回归的原理。

1、数据格式

1.1 普通标签格式

1.1.1 格式为:

标签,特征值1 特征值2 特征值3...
1,1.9
2,3.1
3,4
3.5,4.45
4,5.02
9,9.97
-2,-0.98

1.1.2 spark 读取

1、Rdd
旧版(mllib)的线性回归要求传入的参数类型为RDD[LabeledPoint]

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPointval data_path = "files/ml/linear_regression_data1.txt"
val data = sc.textFile(data_path)
val training = data.map { line =>val arr = line.split(',')LabeledPoint(arr(0).toDouble, Vectors.dense(arr(1).split(' ').map(_.toDouble)))
}.cache()
training.foreach(println)

结果:

(1.0,[1.9])
(2.0,[3.1])
(3.0,[4.0])
(3.5,[4.45])
(4.0,[5.02])
(9.0,[9.97])
(-2.0,[-0.98])

一共有两列,第一列可以通过.label获得(类型为Double),第二列可以通过.features获得(类型为Vector[Double])
2、 DataFrame
新版(ml)的线性回归要求传入的参数类型为Dataset[_]

import org.apache.spark.ml.linalg.Vectors
import org.apache.spark.sql.Row
import spark.implicits._
val data_path = "files/ml/linear_regression_data1.txt"
val data = spark.read.text(data_path)
val training = data.map {case Row(line: String) =>var arr = line.split(',')(arr(0).toDouble, Vectors.dense(arr(1).split(' ').map(_.toDouble)))
}.toDF("label", "features")
training.show()

结果:

+-----+--------+
|label|features|
+-----+--------+
|  1.0|   [1.9]|
|  2.0|   [3.1]|
|  3.0|   [4.0]|
|  3.5|  [4.45]|
|  4.0|  [5.02]|
|  9.0|  [9.97]|
| -2.0| [-0.98]|
+-----+--------+

其中列名"label", "features"固定,不能改为其他列名。

1.2 LIBSVM格式

1.2.1 格式为:

label index1:value1 index2:value2 ...

其中每一行的index必须为升序
为了便于理解,造几条多维数据:

1 1:1.9 2:2 4:2 100:3 101:6
2 1:3.1 2:2 4:2 100:3 101:6
3 1:4 2:2 4:2 100:3 101:6
3.5 1:4.45 2:2 4:2 100:3 101:6
4 1:5.02 2:2 4:2 100:3 101:6
9 1:9.97 4:2 100:3 101:6
-2 1:-0.98 2:2 4:2 100:3 201:6

1.2.2 spark 读取

1、Rdd

import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.mllib.util.MLUtils
val data_path = "files/ml/linear_regression_data2.txt"
val training = MLUtils.loadLibSVMFile(sc, data_path)
training.foreach(println)

结果:

(1.0,(201,[0,1,3,99,100],[1.9,2.0,2.0,3.0,6.0]))
(2.0,(201,[0,1,3,99,100],[3.1,2.0,2.0,3.0,6.0]))
(3.0,(201,[0,1,3,99,100],[4.0,2.0,2.0,3.0,6.0]))
(3.5,(201,[0,1,3,99,100],[4.45,2.0,2.0,3.0,6.0]))
(4.0,(201,[0,1,3,99,100],[5.02,2.0,2.0,3.0,6.0]))
(9.0,(201,[0,3,99,100],[9.97,2.0,3.0,6.0]))
(-2.0,(201,[0,1,3,99,200],[-0.98,2.0,2.0,3.0,6.0]))

返回类型为RDD[LabeledPoint],其中第一列为label,第二列vector的第一个值为max(index),第二个index-1组成的数组,第三个为value组成的数组。
2、DataFrame

val data_path = "files/ml/linear_regression_data2.txt"
val data = spark.read.text(data_path)
val training = spark.read.format("libsvm").load(data_path)
training.show(false)

结果:

+-----+--------------------------------------------+
|label|features                                    |
+-----+--------------------------------------------+
|1.0  |(201,[0,1,3,99,100],[1.9,2.0,2.0,3.0,6.0])  |
|2.0  |(201,[0,1,3,99,100],[3.1,2.0,2.0,3.0,6.0])  |
|3.0  |(201,[0,1,3,99,100],[4.0,2.0,2.0,3.0,6.0])  |
|3.5  |(201,[0,1,3,99,100],[4.45,2.0,2.0,3.0,6.0]) |
|4.0  |(201,[0,1,3,99,100],[5.02,2.0,2.0,3.0,6.0]) |
|9.0  |(201,[0,3,99,100],[9.97,2.0,3.0,6.0])       |
|-2.0 |(201,[0,1,3,99,200],[-0.98,2.0,2.0,3.0,6.0])|
+-----+--------------------------------------------+

2、线性回归代码

2.1 数据

用libsvm格式的数据:

1 1:1.9
2 1:3.1
3 1:4
3.5 1:4.45
4 1:5.02
9 1:9.97
-2 1:-0.98

2.2 旧版代码

package com.dkl.leanring.spark.mlimport org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.mllib.regression.LinearRegressionWithSGD
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LinearRegressionModelobject OldLinearRegression {def main(args: Array[String]) {// 构建Spark对象val conf = new SparkConf().setAppName("OldLinearRegression").setMaster("local")val sc = new SparkContext(conf)Logger.getRootLogger.setLevel(Level.WARN)//读取样本数据val data_path = "files/ml/linear_regression_data3.txt"val training = MLUtils.loadLibSVMFile(sc, data_path)val numTraing = training.count()// 新建线性回归模型,并设置训练参数val numIterations = 10000val stepSize = 0.5val miniBatchFraction = 1.0//书上的代码 intercept 永远为0//val model = LinearRegressionWithSGD.train(examples, numIterations, stepSize, miniBatchFraction)var lr = new LinearRegressionWithSGD().setIntercept(true)lr.optimizer.setNumIterations(numIterations).setStepSize(stepSize).setMiniBatchFraction(miniBatchFraction)val model = lr.run(training)println(model.weights)println(model.intercept)// 对样本进行测试val prediction = model.predict(training.map(_.features))val predictionAndLabel = prediction.zip(training.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 - lerr * err}.reduce(_ + _)val rmse = math.sqrt(loss / numTraing)println(s"Test RMSE = $rmse.")}}

其中注释的第30行代码为书上的写法,但这样写intercept一直为0,也就是只适用于y=a*x的形式,不适用于y=ax+b,改为31、32替代即可。

结果:

[0.992894785953067]
-0.9446037936869749
prediction  label
0.9418962996238525  1.0
2.133370042767533   2.0
3.0269753501252934  3.0
3.473778003804174   3.5
4.039728031797421   4.0
8.954557222265104   9.0
-1.9176406839209805 -2.0
Test RMSE = 0.06866615969192089.

即a=0.992894785953067,b=-0.9446037936869749,y=0.992894785953067*x-0.9446037936869749

2.2 新版代码

package com.dkl.leanring.spark.mlimport org.apache.spark.ml.regression.LinearRegression
import org.apache.spark.sql.SparkSessionobject NewLinearRegression {def main(args: Array[String]): Unit = {val spark = SparkSession.builder.appName("NewLinearRegression").master("local").getOrCreate()val data_path = "files/ml/linear_regression_data3.txt"import spark.implicits._import org.apache.spark.ml.linalg.Vectorsimport org.apache.spark.sql.Rowval training = spark.read.format("libsvm").load(data_path)val lr = new LinearRegression().setMaxIter(10000).setRegParam(0.3).setElasticNetParam(0.8)val lrModel = lr.fit(training)println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}")val trainingSummary = lrModel.summaryprintln(s"numIterations: ${trainingSummary.totalIterations}")println(s"objectiveHistory: [${trainingSummary.objectiveHistory.mkString(",")}]")trainingSummary.residuals.show()println(s"RMSE: ${trainingSummary.rootMeanSquaredError}")println(s"r2: ${trainingSummary.r2}")trainingSummary.predictions.show()spark.stop()}
}

结果:

Coefficients: [0.9072296333951224] Intercept: -0.630360819004294
numIterations: 3
objectiveHistory: [0.5,0.41543560544030766,0.08269406021049913]
+--------------------+
|           residuals|
+--------------------+
| -0.0933754844464385|
|-0.18205104452058585|
|0.001442285423804...|
| 0.09318895039599973|
| 0.07606805936077965|
|  0.5852813740549223|
| -0.4805541402684861|
+--------------------+RMSE: 0.2999573166705823
r2: 0.9906296595124621
+-----+---------------+------------------+
|label|       features|        prediction|
+-----+---------------+------------------+
|  1.0|  (1,[0],[1.9])|1.0933754844464385|
|  2.0|  (1,[0],[3.1])| 2.182051044520586|
|  3.0|  (1,[0],[4.0])|2.9985577145761955|
|  3.5| (1,[0],[4.45])|3.4068110496040003|
|  4.0| (1,[0],[5.02])|3.9239319406392204|
|  9.0| (1,[0],[9.97])| 8.414718625945078|
| -2.0|(1,[0],[-0.98])|-1.519445859731514|
+-----+---------------+------------------+

spark ML算法之线性回归使用相关推荐

  1. spark.ml支持算法总结

    文章目录 spark支持算法总结 推荐模型 协同过滤 分类模型 1.逻辑回归 2.决策树 3.朴素贝叶斯 4. 随机森林 5. 梯度提升决策树回归 6. 多层感知器分类 7. 一对多分类 8. 支持向 ...

  2. spark 逻辑回归算法案例_黄美灵的Spark ML机器学习实战

    原标题:黄美灵的Spark ML机器学习实战 本课程主要讲解基于Spark 2.x的ML,ML是相比MLlib更高级的机器学习库,相比MLlib更加高效.快捷:ML实现了常用的机器学习,如:聚类.分类 ...

  3. Spark ML - 聚类算法

    http://ihoge.cn/2018/ML2.html Spark ML - 聚类算法 1.KMeans快速聚类 首先到UR需要的包: import org.apache.spark.ml.clu ...

  4. Spark排序算法系列之(MLLib、ML)LR使用方式介绍(模型训练、保存、加载、预测)

    转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thi ...

  5. 4.Spark 学习成果转化—机器学习—使用Spark ML的线性回归来预测房屋价格 (线性回归问题)

    本文目录如下: 第4例 使用Spark ML的线性回归来预测房屋价格 4.1 数据准备 4.1.1 数据集文件准备 4.1.2 数据集字段解释(按列来划分) 4.2 使用 Spark ML 实现代码 ...

  6. 用户画像之Spark ML实现

    用户画像之Spark ML实现 1 Spark ML简单介绍 Spark ML是面向DataFrame编程的.Spark的核心开发是基于RDD(弹性分布式数据集),但是RDD,但是RDD的处理并不是非 ...

  7. Interview之AI:人工智能领域岗位求职面试—人工智能算法工程师知识框架及课程大纲(AI基础之数学基础/数据结构与算法/编程学习基础、ML算法简介、DL算法简介)来理解技术交互流程

    Interview之AI:人工智能领域岗位求职面试-人工智能算法工程师知识框架及课程大纲(AI基础之数学基础/数据结构与算法/编程学习基础.ML算法简介.DL算法简介)来理解技术交互流程 目录 一.A ...

  8. 谷歌AutoML新进展,进化算法加持,仅用数学运算自动找出ML算法

    机器之心报道 参与:魔王.杜伟.小舟 授权转载自公众号机器之心 仅使用基础数学运算就能自动搜索机器学习算法?谷歌 Quoc V. Le 等人提出了 AutoML-Zero 方法. AutoML-Zer ...

  9. 基于Spark ML 聚类分析实战的KMeans

    2019独角兽企业重金招聘Python工程师标准>>> 聚类分析是一个无监督学习 (Unsupervised Learning) 过程, 一般是用来对数据对象按照其特征属性进行分组, ...

最新文章

  1. 万亿级企业MySQL海量存储分库分表设计实践
  2. 原理:什么是Quadtrees?(转)
  3. QThread: Destroyed while thread is still running
  4. 开发效率提升15倍!批流融合实时平台在好未来的应用实践
  5. Docker ASP.NET Core (5):Docker Compose
  6. 在最美好的年华里,不要辜负最美的自己
  7. java semaphorewa_Java并发(十五):并发工具类——信号量Semaphore
  8. 软件测试基础课程学习笔记1--软件测试简介
  9. python简单文件读写
  10. JDBC——连接数据库
  11. java 容器类 面试_校招面试之Java容器
  12. 【GIMP】免费开源图像处理软件
  13. java从JDK里提取全球数据,包含国家(名称、二字代码、三字代码)、币种(名称和代码)、和语言种类的数据
  14. 计算机中的逻辑与或非,与或非运算(与或非逻辑运算口诀)
  15. discuz招商加盟门户整站模板
  16. kernel启动流程第二阶段
  17. 湖南现代物流职业技术学院校历课表
  18. Kafka 使用SASL接入点PLAIN机制收发消息(集成Spring Boot)
  19. android中适配器的作用,适配器模式 在Android中的简单理解
  20. STM32入门之LCD1602驱动

热门文章

  1. Mybatis中的OGNL使用总结=
  2. Android解决ViewPager页面滑动空白bug和图片点击bug
  3. 如何完成计算机的安装程序,如何安装计算机系统程序.doc
  4. 性能服务器主板开机进bios,台式机华硕主板开机就进入bios?
  5. 百度网盘取消自动续费(详细过程)
  6. 利用simulink分析系统各种传递函数的BODE图、阶跃响应、单位脉冲响应
  7. 微信刷卡 sdk java_微信支付 Java SDK
  8. matlab实现牛顿下山法
  9. 微信小程序——Web学习day4
  10. c执行cmd pdf2swf_SWFTOOLS PDF2SWF 参数详解