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()
然而,改变LinearRegression
到LinearRegressionWithSGD
根本不起作用。随后SGD参数也无法传入(例如迭代或minibatchfraction)。
谢谢!
那是因为你正试图从两个不同的库混合功能: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.ml
为solver='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'
错误链接的弃用警告[弃用](http://spark.apache.org/docs/latest/api/python/pyspark.mllib.html?highlight=linearregressionwithsgd#pyspark.mllib。回归线性回归与SDG) 但它看起来像使用'LinearRegression'你可以设置'solver = sgd'并继续从那里工作,就好像你正在使用'LinearRegressionWithSGD'? – rvisio
@rvisio 1)看不到你的观点 - 我们的链接指针是相同的2)根据[源代码](https://github.com/apache/spark/blob/master/mllib/src/main /阶/组织/阿帕奇/火花/毫升/回归/线性回归。scala#L62)(文档*无望无用*),'solver'唯一可接受的参数是''l-bfgs'',''normal''和'“auto'';你真的尝试过'solver =“sgd”',它工作吗? – desertnaut
您的链接将我带至LogisticRegression vs. LinearRegression(弃用注释也引用Logistic)。只提到自原来的问题是与LinearRegression 我能够做'newLR = LinearRegression(maxIter = 10,solver =“sgd”)'没有错误,然后使用newLR构建一个ParamGrid,但尚未测试使用'CrossValidator'运行# – rvisio
对此答案有帮助吗?如果是的话,请接受它 - 谢谢 – desertnaut