PySpark 中的 ParamGridBuilder 不适用于 LinearRegressionSGD
ParamGridBuilder in PySpark does not work with LinearRegressionSGD
我想弄清楚为什么 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参数也无法传入(比如iterations或者minibatchfraction)
谢谢!!
那是因为您试图混合来自两个不同库的功能:LinearRegressionWithSGD
来自 pyspark.mllib
(即旧的 RDD-based API), while both LinearRegression
& ParamGridBuilder
come from pyspark.ml
(the new, dataframe-based API)。
的确,在你引用的 documentation 中的代码片段之前的几行(顺便说一句,将来最好也提供一个 link)你会发现这一行:
from pyspark.ml.regression import LinearRegression
而对于 LinearRegressionWithSGD
你使用了 something like:
from pyspark.mllib.regression import LabeledPoint, LinearRegressionWithSGD, LinearRegressionModel
这两个库不兼容:pyspark.mllib
将LabeledPoint
的RDD作为输入,与[=17]中使用的数据帧不兼容=];由于 ParamGridBuilder
是后者的一部分,它只能与数据帧一起使用,而不能与 pyspark.mllib
中包含的算法一起使用(查看上面提供的文档 links)。
此外,请记住 LinearRegressionWithSGD
在 Spark 2 中是 deprecated:
Note: Deprecated in 2.0.0. Use ml.classification.LogisticRegression or LogisticRegressionWithLBFGS.
更新:感谢@rvisio 在下面的评论,我们现在知道,尽管 undocumented, one can actually use solver='sgd'
for LinearRegression
in pyspark.ml
; here is a short example 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'
我想弄清楚为什么 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参数也无法传入(比如iterations或者minibatchfraction)
谢谢!!
那是因为您试图混合来自两个不同库的功能:LinearRegressionWithSGD
来自 pyspark.mllib
(即旧的 RDD-based API), while both LinearRegression
& ParamGridBuilder
come from pyspark.ml
(the new, dataframe-based API)。
的确,在你引用的 documentation 中的代码片段之前的几行(顺便说一句,将来最好也提供一个 link)你会发现这一行:
from pyspark.ml.regression import LinearRegression
而对于 LinearRegressionWithSGD
你使用了 something like:
from pyspark.mllib.regression import LabeledPoint, LinearRegressionWithSGD, LinearRegressionModel
这两个库不兼容:pyspark.mllib
将LabeledPoint
的RDD作为输入,与[=17]中使用的数据帧不兼容=];由于 ParamGridBuilder
是后者的一部分,它只能与数据帧一起使用,而不能与 pyspark.mllib
中包含的算法一起使用(查看上面提供的文档 links)。
此外,请记住 LinearRegressionWithSGD
在 Spark 2 中是 deprecated:
Note: Deprecated in 2.0.0. Use ml.classification.LogisticRegression or LogisticRegressionWithLBFGS.
更新:感谢@rvisio 在下面的评论,我们现在知道,尽管 undocumented, one can actually use solver='sgd'
for LinearRegression
in pyspark.ml
; here is a short example 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'