问题描述
我正在使用 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)