我试图找出为什么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参数也无法传入(例如迭代或小批量分数)。
谢谢!
答案 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.mllib
和LinearRegression
都来自ParamGridBuilder
。 pyspark.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
这两个库不兼容:LabeledPoint
将pyspark.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'