pyspark ML LabeledPoint 不适用于 LinearRegression

pyspark ML LabeledPoint not working with 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,size:int,indices:array<int>,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)

对于学习同一 LI 学习课程的任何其他人,基于对上面接受的答案的一些修改以与我在课程中看到的内容更加一致,Cmd 4 单元格应该如下所示:

# convenience for specifying schema
from pyspark.ml.feature import VectorAssembler
 
data = VectorAssembler(inputCols=['OrderMonthYear'], outputCol='features').transform(results.select("OrderMonthYear", "SaleAmount")).drop('OrderMonthYear').withColumnRenamed('SaleAmount', 'label')
  
display(data)

或者,您可以使用以下同样有效的方法:

from pyspark.ml.linalg import Vectors
data = results.rdd.map(lambda r: (Vectors.dense(r[0]), r[1])).toDF(["features","label"])
display(data)

那么你应该可以开始了。请注意,您还需要对笔记本 4.4 和 4.5 中的 Cmd 4 进行相同的更改。希望这对您有所帮助!