spark ml LinearRegression预测对于所有观察值都是常数

时间:2018-12-26 19:04:08

标签: scala apache-spark linear-regression

我正在尝试使用scala在spark中构建一个简单的线性回归模型。为了测试该方法,我尝试使用测试数据集执行单个可变回归。 我的数据集如下。

x-1到100之间的整数
y-使用公式=RANDBETWEEN(-10,10)*RAND() + x_i

从excel生成的随机值

我已经使用python sklearn库对该数据集进行了回归,它为我提供了预期数据的最佳拟合线(r 2 = 0.98)。

但是,如果我使用spark进行回归,则我的预测对于数据集中的所有x值均具有恒定值,r 2 值为2e-16。 为什么这段代码没有给我最佳拟合线作为预测?我想念什么?

这是我正在使用的代码

有效的Python代码

x = np.array(df['x'])
y = np.array(df['x'])
x = x.reshape(-1,1)
y = y.reshape(-1,1)

clf = LinearRegression(normilize=True)
clf.fit(x,y)
y_predictions = clf.predict(x)
print(r2_score(y, y_predictions))

Here's a plot from the python regression.

给出恒定预测的标量代码

val labelCol = "y"
val assembler = new VectorAssembler()
    .setInputCols(Array("x"))
    .setOutputCol("features")

val df2 = assembler.transform(df)

val labelIndexer = new StringIndexer().setInputCol(labelCol).setOutputCol("label")
val df3 = labelIndexer.fit(df2).transform(df2)

val regressor = new LinearRegression()
    .setMaxIter(10)
    .setRegParam(1.0)
    .setElasticNetParam(1.0)

val model = regressor.fit(df3)
val predictions = model.transform(df3)

val modelSummary = model.summary
println(s"r2 = ${modelSummary.r2}")

1 个答案:

答案 0 :(得分:1)

问题是使用了stringIndexer,它不应该在数字列上使用。就我而言,我不应该使用stringIndxer而是将y列重命名为label。这样可以解决问题。