【问题标题】:SparkR MLlib & spark.ml: least squares and glm optimizationSparkR MLlib 和 spark.ml:最小二乘和 glm 优化
【发布时间】:2016-11-13 17:39:15
【问题描述】:

谁能解释一下如何在 SparkR 操作glm 中指定优化方法?当我尝试用glm 拟合OLS 模型时,我只能指定"normal""auto" 作为求解器类型。 SparkR 无法解释求解器规范 "l-bfgs",这让我相信,当我指定 "auto" 时,SparkR 只是假设 "normal",然后使用 LS 正态方程分析估计模型系数。

在 SparkR 中是否不提供具有随机梯度下降和 L-BFGS 的 GLM 拟合,或者我是否错误地编写了以下评估?

m <- SparkR::glm(y ~ x1 + x2 + x3, data = df, solver = "l-bfgs")

Spark 中有大量关于使用迭代方法来拟合 GLM 的文档,例如LogisticRegressionWithLBFGSLinearRegressionWithSGD(讨论过 here),但我还没有找到 R API 的任何此类文档。这在 SparkR 中根本不可用(即 SparkR 用户是否受限于分析解决,因此受限于我们的数据大小),还是我在这里遗漏了一些重要的东西?如果目前在 SparkR 中不可用,是否应该与 SparkR 2.0.0 一起推出?

下面,我创建了一个玩具数据集并拟合了三个模型,每个模型都有不同的求解器规范:

x1 <- rnorm(n=200, mean=10, sd=2)
x2 <- rnorm(n=200, mean=17, sd=3)
x3 <- rnorm(n=200, mean=8, sd=1)
y <- 1 + .2 * x1 + .4 * x2 + .5 * x3 + rnorm(n=200, mean=0, sd=.1)
dat <- cbind.data.frame(y, x1, x2, x3)

df <- as.DataFrame(sqlContext, dat)

m1 <- SparkR::glm(y ~ x1 + x2 + x3, data = df, solver = "normal")
m2 <- SparkR::glm(y ~ x1 + x2 + x3, data = df, solver = "auto")
m3 <- SparkR::glm(y ~ x1 + x2 + x3, data = df, solver = "l-bfgs")

第一个和第二个模型产生相同的参数估计值(支持我的假设,即 SparkR 在拟合两个模型时正在求解正规方程,因此模型是等价的)。 SparkR 能够拟合第三个模型,但是当我尝试打印 GLM 的摘要时,我收到以下错误:

作为参考,我通过 AWS 执行此操作,并尝试了不同版本的 EMR,包括最新版本(以防万一)。另外,我使用的是 Spark 1.6.1 (R API)。

【问题讨论】:

  • 您使用的是哪个版本的 spark ?
  • @eliasah,我已经用我正在使用的 Spark 版本更新了我的帖子。感谢您的反馈!

标签: r apache-spark apache-spark-mllib sparkr


【解决方案1】:

Spark 1.6.2 API documentation is here

求解器:
用于优化的求解器算法,可以是“l-bfgs”、“normal”和“auto”。 “l-bfgs”表示Limited-memory BFGS,它是一种limited-memory quasi-Newton优化方法。 “正常”表示使用正态方程作为线性回归问题的解析解。默认值为“auto”,表示自动选择求解器算法。

对我来说 - 这看起来值得在 Apache Spark Jira site 上报告错误。

【讨论】:

  • 嗨@SpiritusPrana,感谢您的评论。我知道每个求解器都做了什么(保存汽车,这在定义上是模糊的),但你是说你认为我需要在 SparkR Jira 板上发帖,把它作为一个问题提出来?
  • 在你打开一个问题之前,你能用你试过的火花版本更新你的问题吗?所以我们可以重现错误
  • 嗨@kathystehl - 是的 - 你的代码在我看来格式正确,并且与 API 文档一致。由于它的行为不一致,因此值得作为一个错误进行研究。可能值得等待一段时间,看看以利亚是否会回来提供建议。作为一个没有 Apache 项目经验的 R 用户,我对记录 SparkR 错误感到有些畏惧,但我发现开发人员支持并愿意接受措辞清晰的错误报告。
  • 感谢您的评论@SpiritusPrana!是的我同意。此外,Spark 2.0.0(希望)很快就会发布,所以一旦我升级到最新版本,我的问题可能会得到解决。
  • afaik 为 glm 使用 bfgs 求解器的唯一方法是使用 optim(),它在 SparkR 中的任何地方都没有调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2015-09-26
  • 2014-09-05
  • 1970-01-01
  • 2013-06-12
  • 2021-08-14
相关资源
最近更新 更多