当前位置: 首页 > 知识库问答 >
问题:

使用Spark MLlib的线性回归只返回单调预测

李光华
2023-03-14

检查问题底部的更新

摘要:我有一个不是线性行为的数据集。我试图使用Spark的MLlib(V1.5.2)来拟合一个更像多项式函数的模型,但结果总是得到线性模型。我不知道是否不可能使用线性回归来获得非线性模型。

我正试图拟合一个模型,该模型能充分反映以下数据:

object LinearRegressionTest {

   def main(args: Array[String]): Unit = {
      val sc = new SparkContext("local[2]", "Linear Regression")
      val data = sc.textFile("data2.csv")
      val parsedData = data.map { line =>
         val parts = line.split(',')
         LabeledPoint(parts(1).toDouble, Vectors.dense(parts(2).toDouble))
       }.cache()

      val numIterations = 1000
      val stepSize = 0.001

      val model = LinearRegressionWithSGD.train(parsedData, numIterations, stepSize)
      sc.stop
   }
}

更新问题是由我们使用的spark和spark-ml库的版本引起的。出于某种原因,尽管我提供了更多的特性(输入数据的平方或立方版本),但版本1.5.2并没有拟合出更好的曲线。在升级到2.0.0版本并从主API(不是RDD API)的不推荐的LinearRegressionWithSGD切换到LinearRegression之后,算法的行为与预期一致。用这种新方法,模型拟合出了正确的曲线。

共有1个答案

魏硕
2023-03-14

这里没有什么出乎意料的。你使用形式的线性模型

Y = βx + ε

因此,拟合的结果将始终形成一条穿过原点的线(与例如R不同,Spark默认情况下不符合截距),只要模型至少是稍微正常的,它就应该增加到数据的近似分布。

虽然StackOverflow的细节可能与主题无关,但您应该从添加更多特性开始。很明显,这里的近似必须是二次的,所以让我们一步一步地来说明。我们将从一个非常粗略的数据近似值开始:

y <- c(0.6, 0.6, 0.6, 0.6, 0.575, 0.55, 0.525, 0.475, 0.45, 0.40, 0.35, 0.30)
df <- data.frame(y=c(y, rev(y)), x=0:23)
plot(df$x, df$y)
lm1 <- lm(y ~ x + 0, df)
lines(df$x, predict(lm1, df), col='red')
lm2 <- lm(y ~ x, df)
lines(df$x, predict(lm2, df), col='blue')
df$x2 <- df$x ** 2
lm3 <- lm(y ~ x + x2, df)
lines(df$x, predict(lm3, df), col='green')

>

  • 在创建模型时使用setintercept(true)linearregressionmodel
  • 在模型中加入一些非线性特征。

    val x = arts(2).toDouble
    LabeledPoint(parts(1).toDouble, Vectors.dense(x, x*x))
    

  •  类似资料:
    • 线性回归是最简单的回归方法,它的目标是使用超平面拟合数据集,即学习一个线性模型以尽可能准确的预测实值输出标记。 单变量模型 模型 $$f(x)=w^Tx+b$$ 在线性回归问题中,一般使用最小二乘参数估计($$L_2$$损失),定义目标函数为 $$J={\arg min}{(w,b)}\sum{i=1}^{m}(y_i-wx_i-b)^2$$ 均方误差(MSE) $$MSE = \frac{1}{

    • 线性回归输出是一个连续值,因此适用于回归问题。回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。 由于线性回归和softmax回归都是单层神经网络,它们涉及的概念和技术同样适用于大多数的深度学习模型。我们首先

    • 本例仅使用糖尿病数据集的第一个特征,来展示线性回归在二维空间上的表现。下图中的直线, 即是线性回归所确定的一个界限,其目标是使得数据集中的实际值与线性回归所得的预测值之间的残差平方和最小。 同时也计算了回归系数、残差平方和以及解释方差得分,来判断该线性回归模型的质量。 原文解释和代码不符合: 实际上计算了回归系数, 均方误差(MSE),判定系数(r2_score) 判定系数和解释方差得分并不绝对相

    • 在本章中,将重点介绍使用TensorFlow进行线性回归实现的基本示例。逻辑回归或线性回归是用于对离散类别进行分类的监督机器学习方法。在本章中的目标是构建一个模型,用户可以通过该模型预测预测变量与一个或多个自变量之间的关系。 这两个变量之间的关系是线性的。如果是因变量的变化而变化,那么可将认为是自变量,那么两个变量的线性回归关系将如下式所示: 接下来将设计一种线性回归算法。需要了解以下两个重要概念

    • 在本章中,我们将重点介绍使用TensorFlow进行线性回归实现的基本示例。逻辑回归或线性回归是用于对离散类别进行分类的监督机器学习方法。在本章中的目标是构建一个模型,用户可以通过该模型预测预测变量与一个或多个自变量之间的关系。 如果是因变量而变化,则认为是自变量。两个变量之间的这种关系可认为是线性的。两个变量的线性回归关系看起来就像下面提到的方程式一样 - 接下来,我们将设计一个线性回归算法,有

    • 线性回归可以说是机器学习中最基本的问题类型了,这里就对线性回归的原理和算法做一个小结。 1. 线性回归的模型函数和损失函数 线性回归遇到的问题一般是这样的。我们有m个样本,每个样本对应于n维特征和一个结果输出,如下: $$(x{(0)}_1,x{(0)}_2,...x{(0)}_n,y_0),(x{(1)}_1,x{(1)}_2,...x{(1)}_n,y_1),...(x{(m)}_1,x{(m