PySpark 中的 ParamGridBuilder 不适用于 LinearRegressionSGD

ParamGridBuilder in PySpark does not work with LinearRegressionSGD

我想弄清楚为什么 LinearRegressionWithSGD 不适用于 Spark 的 ParamGridBuilder。来自 Spark 文档:

lr = LinearRegression(maxIter=10)
paramGrid = ParamGridBuilder()\
.addGrid(lr.regParam, [0.1, 0.01]) \
.addGrid(lr.fitIntercept, [False, True])\
.addGrid(lr.elasticNetParam, [0.0, 0.5, 1.0])\
.build()

然而,将LinearRegression更改为LinearRegressionWithSGD根本行不通。后续SGD参数也无法传入(比如iterations或者minibatchfraction)

谢谢!!

那是因为您试图混合来自两个不同库的功能:LinearRegressionWithSGD 来自 pyspark.mllib(即旧的 RDD-based API), while both LinearRegression & ParamGridBuilder come from pyspark.ml (the new, dataframe-based API)。

的确,在你引用的 documentation 中的代码片段之前的几行(顺便说一句,将来最好也提供一个 link)你会发现这一行:

from pyspark.ml.regression import LinearRegression

而对于 LinearRegressionWithSGD 你使用了 something like:

from pyspark.mllib.regression import LabeledPoint, LinearRegressionWithSGD, LinearRegressionModel

这两个库兼容:pyspark.mllibLabeledPoint的RDD作为输入,与[=17]中使用的数据帧不兼容=];由于 ParamGridBuilder 是后者的一部分,它只能与数据帧一起使用,而不能与 pyspark.mllib 中包含的算法一起使用(查看上面提供的文档 links)。

此外,请记住 LinearRegressionWithSGD 在 Spark 2 中是 deprecated

Note: Deprecated in 2.0.0. Use ml.classification.LogisticRegression or LogisticRegressionWithLBFGS.

更新:感谢@rvisio 在下面的评论,我们现在知道,尽管 undocumented, one can actually use solver='sgd' for LinearRegression in pyspark.ml; here is a short example adapted from the docs:

spark.version
# u'2.2.0'

from pyspark.ml.linalg import Vectors
from pyspark.ml.regression import LinearRegression

df = spark.createDataFrame([
     (1.0, 2.0, Vectors.dense(1.0)),
     (0.0, 2.0, Vectors.sparse(1, [], []))], ["label", "weight", "features"])
lr = LinearRegression(maxIter=5, regParam=0.0, solver="sgd", weightCol="weight") # solver='sgd'
model = lr.fit(df) # works OK
lr.getSolver()
# 'sgd'