首页 > 解决方案 > 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,size:int,indices:array<int>,values:array<double>>.

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

标签: pythonapache-sparkpysparkapache-spark-mllibapache-spark-ml

解决方案


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)

推荐阅读