首页 > 解决方案 > spark ml LinearRegression 预测是所有观测值的常数

问题描述

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

x - 1 到 100 的整数
y - 使用公式从 excel 生成的随机值=RANDBETWEEN(-10,10)*RAND() + x_i

我已经使用 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))

这是python回归的图。

给出恒定预测的 Scala 代码

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}")

标签: scalaapache-sparklinear-regression

解决方案


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


推荐阅读