我正在尝试使用scala在spark中构建一个简单的线性回归模型。为了测试该方法,我尝试使用测试数据集执行单个可变回归。 我的数据集如下。
x-1到100之间的整数
y-使用公式=RANDBETWEEN(-10,10)*RAND() + x_i
我已经使用python sklearn库对该数据集进行了回归,它为我提供了预期数据的最佳拟合线(r 2 = 0.98)。
但是,如果我使用spark进行回归,则我的预测对于数据集中的所有x值均具有恒定值,r 2 值为2e-16。 为什么这段代码没有给我最佳拟合线作为预测?我想念什么?
这是我正在使用的代码
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}")
答案 0 :(得分:1)
问题是使用了stringIndexer,它不应该在数字列上使用。就我而言,我不应该使用stringIndxer而是将y列重命名为label。这样可以解决问题。