PySpark中的ParamGridBuilder不适用于LinearRegressionSGD

时间:2017-10-28 21:53:26

标签: machine-learning pyspark linear-regression apache-spark-mllib apache-spark-ml

我试图找出为什么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参数也无法传入(例如迭代或小批量分数)。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是因为您尝试混合来自两个不同库的功能:Request URL:http://example.com/index.php?post Request Method:POST Status Code:200 OK Remote Address:x.x.x.x:xxx Referrer Policy:no-referrer-when-downgrade 来自LinearRegressionWithSGD(即旧RDD-based API),而pyspark.mllibLinearRegression都来自ParamGridBuilderpyspark.ml来自from pyspark.ml.regression import LinearRegression (新的,dataframe-based API)。

确实,在您引用的documentation中的代码段之前的几行(BTW,将来也提供链接也很好),您将找到该行:

 
LinearRegressionWithSGD

而对于from pyspark.mllib.regression import LabeledPoint, LinearRegressionWithSGD, LinearRegressionModel ,您使用了something like

pyspark.mllib

这两个库兼容:LabeledPointpyspark.ml的RDD作为输入,与ParamGridBuilder中使用的数据帧不兼容};由于pyspark.mllib是后者的一部分,因此它只能用于数据框,而不能用于LinearRegressionWithSGD中包含的算法(请查看上面提供的文档链接)。

此外,请记住,Spark 2中的solver='sgd'deprecated

  

注意:在2.0.0中已弃用。使用ml.classification.LogisticRegression或LogisticRegressionWithLBFGS。

更新:感谢@ rvisio的评论,我们现在知道,虽然 undocumented ,但实际上可以使用{{1} } LinearRegression中的pyspark.ml;这是一个简短的例子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'