【问题标题】:ParamGridBuilder in PySpark does not work with LinearRegressionSGDPySpark 中的 ParamGridBuilder 不适用于 LinearRegressionSGD
【发布时间】:2018-04-10 05:29:39
【问题描述】:

我试图弄清楚为什么 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参数也无法传入(如迭代或minibatchfraction)。

谢谢!!

【问题讨论】:

  • 答案没有用吗?如果是,请接受 - 谢谢

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


【解决方案1】:

那是因为您试图混合来自两个不同库的功能:LinearRegressionWithSGD 来自 pyspark.mllib(即旧的 RDD-based API),而 LinearRegressionParamGridBuilder 都来自 pyspark.ml(新的,dataframe-based API)。

确实,在您引用的documentation 中的代码 sn-p 前几行(顺便说一句,将来最好也提供一个链接),您会找到以下行:

from pyspark.ml.regression import LinearRegression

而对于LinearRegressionWithSGD,你使用了something like

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

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

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

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

更新:感谢@rvisio 在下方的评论,我们现在知道,虽然undocumented,实际上可以在@987654346 中使用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'

【讨论】:

  • 弃用警告的错误链接Deprecation 但看起来使用LinearRegression 您可以设置solver=sgd 并从那里继续工作,就像您使用LinearRegressionWithSGD 一样?
  • @rvisio 1) 看不到您的观点 - 我们的两个链接指针是相同的 2) 根据source code(文档在此方面毫无帮助) ,solver 唯一可接受的参数是 "l-bfgs""normal""auto";你真的尝试过solver="sgd" 并且成功了吗?
  • 您的链接将我带到 LogisticRegression 与 LinearRegression(弃用说明也引用了 Logistic)。只提一下,因为最初的问题与 LinearRegression 有关,所以我可以在没有错误的情况下执行 newLR = LinearRegression(maxIter=10, solver="sgd") 之类的操作,然后使用 newLR 构建 ParamGrid 但尚未测试使用 CrossValidator 运行
  • @rvisio oopsss...你是正确的链接(更正),以及solver='sgd'(很好的捕获) - 请参阅更新
  • 我不认为solver='sgd'实际上工作...以下代码对我来说也很好:(lr = LinearRegression(maxIter=5, regParam=0.0, solver="madeup", weightCol="weight")model = lr.fit(df)>>> lr.getSolver() 'madeup'你对交叉验证有什么建议吗Spark中的LinearRegressionSGD?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多