pyspark ML LabeledPoint 不适用于 LinearRegression

问题描述

我正在使用 pyspark 研究 Spark 3.0.1,并使用

为简单的 OLS 回归设置了一些数据
data = results.select('OrderMonthYear','SaleAmount').rdd.map(lambda row: LabeledPoint(row[1],[row[0]])).toDF()

OrderMonthYear 是我的特征列 (int),而 SaleAmount 是响应 (float)。 LabeledPoint 方法是从 pyspark.mllib.regression 导入的。然后我尝试用

拟合回归模型
from pyspark.ml.regression import LinearRegression
lr = LinearRegression()
modelA = lr.fit(data,{lr.regParam:0.0})

得到这个异常

IllegalArgumentException: requirement Failed: Column features must be of type struct<type:tinyint,size:int,indices:array<int>,values:array<double>> but was actually struct<type:tinyint,values:array<double>>.

这显然不是很有帮助,因为所需和传递的功能似乎是相同的结构。我在网上搜索过,只找到了 Java 或自己构建结构的人的这个问题的答案。该异常是从一个 util 函数抛出的,该函数只是抛出了一个 java 异常 (#Hide where the exception came from that shows a non-Pythonic JVM exception message.),所以我无法进一步调试。

解决方法

不推荐使用 MLlib 和基于 RDD 的 MLlib 函数。我建议使用 ML 的向量汇编器:

from pyspark.ml.feature import VectorAssembler
from pyspark.ml.regression import LinearRegression

data = spark.createDataFrame([[0,1],[1,2],[2,3]]).toDF('OrderMonthYear','SaleAmount')

va = VectorAssembler(inputCols=['SaleAmount'],outputCol='features')
data2 = va.transform(data)

lr = LinearRegression(labelCol='OrderMonthYear')
model = lr.fit(data2)