Spark实现了三类线性回归方法:
1、LinearRegression:普通线性回归模型
2、LassoRegression:加L1正则化的线性回归
3、RidgeRegression:加L2正则化的线性回归
Spark采用了模型和训练分离定义的方式,模型和模型的迭代计算都很清晰:

如LinearRegressionModel和LinearRegressionWithSGD,LassoModel和LassoWithSGD,RidgeRegressionModel和RidgeRegressionWithSGD。其中Model继承自GeneralizedLinearModel和RegressionModel,为了便于模型的保存和输出,还继承了Saveable、Loader和PMMLExportable类,XXXWithSGD继承自GeneralizedLinearAlgorithm,并实现来模型训练的train方法其通过调用父类GeneralizedLinearAlgorithm的run方法来实现模型参数求解的逻辑。

LinearRegression(普通线性回归模型)
三类线性回归模型的实现都大同小异,在此以普通的线性回归LinearRegressionModel和LinearRegressionWithSGD为例来说明。LinearRegressionModel继承了大量的类,但本身实现比较简单,即覆写来父类的predictPoint、save和load方法。代码简单,在此不述。

RidgeRegressionWithSGD继承了GeneralizedLinearAlgorithm类,其主要实现了一个方法train,并定义来自己的Gradient类型和Updater类型为模型训练做准备,另外train实现了重载:

def train(
    input: RDD[LabeledPoint],
    numIterations: Int,
    stepSize: Double,
    regParam: Double,
    miniBatchFraction: Double,
    initialWeights: Vector): RidgeRegressionModel = {
  new RidgeRegressionWithSGD(stepSize, numIterations, regParam, miniBatchFraction).run(
    input, initialWeights)
}
def train(
    input: RDD[LabeledPoint],
    numIterations: Int,
    stepSize: Double,
    regParam: Double,
    miniBatchFraction: Double): RidgeRegressionModel = {
  new RidgeRegressionWithSGD(stepSize, numIterations, regParam, miniBatchFraction).run(input)
}
def train(
    input: RDD[LabeledPoint],
    numIterations: Int,
    stepSize: Double,
    regParam: Double): RidgeRegressionModel = {
  train(input, numIterations, stepSize, regParam, 1.0)
}
def train(
    input: RDD[LabeledPoint],
    numIterations: Int): RidgeRegressionModel = {
  train(input, numIterations, 1.0, 0.01, 1.0)
}
不同train方法的区别主要是初始化参数值,从这里也可以看到Spark使用来哪些默认的参数值进行模型的初始化。train方法内部调用了父类的run方法。

我们再来看看父类GeneralizedLinearAlgorithm的run方法干来啥?

run方法首先进行了特征值的 Scaling,这里对特征值的方差进行来归一化:

//run方法的特征值Scaling过程
val scaler = if (useFeatureScaling) {
  new StandardScaler(withStd = true, withMean = false).fit(input.map(_.features))
} else {
  null
}
 
// Prepend an extra variable consisting of all 1.0's for the intercept.
// TODO: Apply feature scaling to the weight vector instead of input data.
val data =
  if (addIntercept) {
    if (useFeatureScaling) {
      input.map(lp => (lp.label, appendBias(scaler.transform(lp.features)))).cache()
    } else {
      input.map(lp => (lp.label, appendBias(lp.features))).cache()
    }
  } else {
    if (useFeatureScaling) {
      input.map(lp => (lp.label, scaler.transform(lp.features))).cache()
    } else {
      input.map(lp => (lp.label, lp.features))
    }
  }
特征值的 Scaling过程是由用户决定是否需要Scaling,一般来说,用户可以在数据预处理的步骤中进行特征值的Scaling,也可以交给Spark在这里进行。关于

为什么要做特征值的Scaling,在知乎上看到的一个图片能很好的说明问题:

没有进过归一化,寻找最优解的过程

经过归一化,把各个特征的尺度控制在相同的范围内:

另外,本人也有3遍介绍归一化的博文:数据预处理之归一化、机器学习中的归一化方法、时间序列的归一化方法、也可以看看来自知乎的问答,结合具体的机器学习算法,还有很多特定的特征Scaling方法。

说完特征值的Scaling,再回过头来看run方法。run方法除了特征值的Scaling外,还做来一些训练数据的整理、模型参数初始化的过程,之后调用了Optimizer类实例来求解模型参数并在最后调用createModel方法返回一个RegressionModel:

val weightsWithIntercept = optimizer.optimize(data, initialWeightsWithIntercept)
//val intercept = 这里省略了一些代码
//var weights =
createModel(weights, intercept)
总结,Spark模型和训练算法模块分离,对模型应用还是训练来说,都是算法思路清晰、模块算法低耦合的特点,同时,对算法开发人员也比较友好,可以单独实现自己的优化算法或者单独实现上层的模型。
————————————————
版权声明:本文为CSDN博主「大愚若智_」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zbc1090549839/article/details/65437345

spark.mllib:回归算法相关推荐

  1. Spark MLlib回归算法------线性回归、逻辑回归、SVM和ALS

    Spark MLlib回归算法------线性回归.逻辑回归.SVM和ALS 1.线性回归: (1)模型的建立: 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多 ...

  2. Spark MLlib机器学习 | 算法综合实战(一)(史上最详细)

    ==========                         ========= 8.1.1 什么是机器学习 机器学习可以看做是一门人工智能的科学,该领域的主要研究对象是人工智能.机器学习利用 ...

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

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

  4. Spark MLlib FPGrowth算法

    1.1 FPGrowth算法 1.1.1 基本概念 关联规则挖掘的一个典型例子是购物篮分析.关联规则研究有助于发现交易数据库中不同商品(项)之间的联系,找出顾客购买行为模式,如购买了某一商品对购买其他 ...

  5. 大数据Spark MLlib推荐算法

    目录 1 相似度算法 1.1 欧几里德距离算法 1.2 基于夹角余弦相似度算法 2 最近邻域 3 交替最小二乘法 3.1 最小二乘法 3.2 交替最小二乘法 3.3 ALS算法流程 3.4 ALS算法 ...

  6. spark mllib推荐算法使用

    2019独角兽企业重金招聘Python工程师标准>>> 一.pom.xml <!-- 机器学习包 --><dependency><groupId> ...

  7. mllib调参 spark_从Spark MLlib到美图机器学习框架实践

    MLlib 是 Apache Spark 的可扩展机器学习库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模的数据集. 机器学习简介 在深入介绍 Spark MLlib 之前先了解机器学习,根据 ...

  8. 机器学习_机器不学习:从Spark MLlib到美图机器学习框架实践

    / 机器学习简介 / 在深入介绍 Spark MLlib 之前先了解机器学习,根据维基百科的介绍,机器学习有下面几种定义: 机器学习是一门人工智能的科学,该领域的主要研究对象是人工智能,特别是如何在经 ...

  9. 从Spark MLlib到美图机器学习框架实践

    MLlib 是 Apache Spark 的可扩展机器学习库,旨在简化机器学习的工程实践工作,并方便扩展到更大规模的数据集. 机器学习简介 在深入介绍 Spark MLlib 之前先了解机器学习,根据 ...

  10. 梯度迭代树回归(GBDT)算法介绍及Spark MLlib调用实例(Scala/Java/python)

    梯度迭代树回归 算法简介: 梯度提升树是一种决策树的集成算法.它通过反复迭代训练决策树来最小化损失函数.决策树类似,梯度提升树具有可处理类别特征.易扩展到多分类问题.不需特征缩放等性质.Spark.m ...

最新文章

  1. JS-DOM-元素节点
  2. 互联网的中层管理,一个庞大且易脆的群体
  3. PAT 1052. Linked List Sorting
  4. ubuntu自动挂载NTFS的方法
  5. 防止IE6出现BUG的十种常见解决方法
  6. 中使用js修改变量值_谈一谈css-in-js在React项目中的使用
  7. 角色动作系统概述:战斗、3C相关
  8. 20100412 最近在看加密解密
  9. 训练日志 2019.4.24
  10. 曾经一手好牌,但如今却被网友怼或已堕落
  11. 女子在朋友圈辱骂前男友被起诉,最后法院判决结果舒适...
  12. big sur 黑苹果_苹果宣布11日再开发布会!自研芯片届时或将发布!
  13. 好想找一个灵魂伴侣,然后带着他一起周游世界,会实现吗?
  14. 微博python爬虫,每日百万级数据
  15. 斐波那契数列c语言while,C语言数据结构递归之斐波那契数列
  16. 汇编语言与接口技术——期末设计
  17. java 解压7z_实例展示使用Java压缩和解压缩7z文件的方法
  18. 【Java】认识Sring、String的常见操作和StringBuffer 和StringBuilder的区别【字符串详解】
  19. Strawberry Perl 所有版本链接
  20. Unity3D-VR《静夜诗》5-李白吟诗

热门文章

  1. java导入excel 实例_Java数据导入功能之读取Excel文件实例
  2. 用php求n个分数的和,php关于数组n个随机数分成x组,使每组值相近的算法
  3. 最完整的Win7快捷键
  4. selenium自动化测试框架_selenium自动化测试框架之PO设计模式
  5. 电机驱动板连线_伺服驱动器的工作原理和内部结构是什么?
  6. 华三服务器怎么设置系统启动模式,H3C 开局设置
  7. java和tornado_TornadoJ
  8. .hpp文件_3 OpenCV的头文件说明及第一个示例程序
  9. android应用启动次数,应用统计: APP启动次数,软件用时统计,用量提醒
  10. 山大计算机上机复试题目,2010年计算机复试上机 回忆