当我使用weka,python和spark关于线性回归时,为什么我得到了不同的结果?

时间:2016-08-04 13:55:07

标签: scikit-learn weka linear-regression apache-spark-mllib

我使用了weka和python关于线性回归来预测价格数据。我得到了与附件相同的结果。linear-regression in weka linear-regression in python

我用来预测的数据如下:

英尺,床,浴缸,车库,年龄,价格

1048,2,1,1,30,104900

1052,2,2,1,20,128750

1057,2,1,1,32,102900

1060,2,2,1,31,114900

1072,2,2,1,31,119500

1076,2,1,1,24,110500

但是当我使用spark(1.6)mllib来分析这些数据时,我得到了不同的结果。我已经改变了交互的价值和步骤。但结果远离weka和python的结果。

我将数据格式化为以下类型。

104900,1048 2 1 1 30

128750,1052 2 2 1 20

102900,1057 2 1 1 32

代码是这样的:

import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.regression.LinearRegressionModel
import org.apache.spark.mllib.regression.LinearRegressionWithSGD

// Load and parse the data
val data = sc.textFile("/root/data/house.data")
val parsedData = data.map { line =>
  val parts = line.split(',')
  LabeledPoint(parts(0).toDouble, Vectors.dense(parts(1).split(' ').map(_.toDouble)))
}.cache()

// Building the model
val numIterations = 2000
val stepSize = 0.00000001
val algorithm = new LinearRegressionWithSGD()
algorithm.setIntercept(true)
algorithm.optimizer.setNumIterations(numIterations)
algorithm.optimizer.setStepSize(stepSize)

val model = algorithm.run(parsedData)

println(model.weights)
println(model.intercept)

1 个答案:

答案 0 :(得分:0)

我的第一个猜测是你的stepSize太小了。 首先,尝试使用stepSize 0.1,检查结果是否发生了变化。

Weka和Python使用封闭形式的解决方案,因此结果是相同的。在Spark中你用StochasticGradientDescent迭代,所以 结果不一样,但应该接近。

如果结果不均匀,请尝试检查一些非常简单的数据代码。例如,对于像[(1,1),(2,2),(3,3),(4,4),...]这样的数据,你得到截距0和系数1吗?您是否还检查了所有内容是否都已正确解析以及RDD的外观如何?