scala - 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))
给出恒定预测的 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}")
解决方案
问题是使用不应在数字列上使用的 stringIndexer。就我而言,我不应该使用 stringIndxer,而应该将 y 列重命名为 label。这解决了问题。
推荐阅读
- python - 如何使中心点成为我方的中心?
- .net - 如何从 swagger 中动态获取枚举信息
- python - 成功完成 celery 任务后的操作
- c++ - 为什么这个基于范围的 for 循环会导致减法问题?
- r - R Markdown,GGplot显示在标题上方
- android - 如何在 Android 应用程序中通过 UPD 套接字接收数据
- batch-file - MD 命令创建通用文件而不是目录
- bash - 在 justfile 中通过 sudo 通过 SSH 以不同用户身份执行命令
- r - 在 R 中,在字符串的循环中编写循环的最佳方法是什么?
- javascript - 遍历 Object 属性以动态创建 Array