PySpark中的ParamGridBuilder无法与LinearRegressionSGD配合使用

问题描述:

我试图弄清楚为什么LinearRegressionWithSGD不适用于Spark的ParamGridBuilder。从火花文档:PySpark中的ParamGridBuilder无法与LinearRegressionSGD配合使用

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() 

然而,改变LinearRegressionLinearRegressionWithSGD根本不起作用。随后SGD参数也无法传入(例如迭代或minibatchfraction)。

谢谢!

+0

对此答案有帮助吗?如果是的话,请接受它 - 谢谢 – desertnaut

那是因为你正试图从两个不同的库混合功能:LinearRegressionWithSGD来自pyspark.mllib(即旧的,RDD-based API),同时兼具LinearRegression & ParamGridBuilder来自pyspark.ml(新,dataframe-based API)。

事实上,在你引用(顺便说一句,在未来这将是很好提供一个链接,太),你会发现行documentation的代码片段之前的几行:

from pyspark.ml.regression import LinearRegression 

LinearRegressionWithSGD您使用something like

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

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

而且,记住,LinearRegressionWithSGD是Spark 2 deprecated

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

UPDATE:感谢以下@ rvisio的评论,我们现在知道,虽然undocumented,一个可实际使用pyspark.mlsolver='sgd'LinearRegression;这里是一个简短的例子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' 
+0

错误链接的弃用警告[弃用](http://spark.apache.org/docs/latest/api/python/pyspark.mllib.html?highlight=linearregressionwithsgd#pyspark.mllib。回归线性回归与SDG) 但它看起来像使用'LinearRegression'你可以设置'solver = sgd'并继续从那里工作,就好像你正在使用'LinearRegressionWithSGD'? – rvisio

+0

@rvisio 1)看不到你的观点 - 我们的链接指针是相同的2)根据[源代码](https://github.com/apache/spark/blob/master/mllib/src/main /阶/组织/阿帕奇/火花/毫升/回归/线性回归。scala#L62)(文档*无望无用*),'solver'唯一可接受的参数是''l-bfgs'',''normal''和'“auto'';你真的尝试过'solver =“sgd”',它工作吗? – desertnaut

+1

您的链接将我带至LogisticRegression vs. LinearRegression(弃用注释也引用Logistic)。只提到自原来的问题是与LinearRegression 我能够做'newLR = LinearRegression(maxIter = 10,solver =“sgd”)'没有错误,然后使用newLR构建一个ParamGrid,但尚未测试使用'CrossValidator'运行# – rvisio