【问题标题】:Spark ML Pipeline Logistic Regression Produces Much Worse Predictions Than R GLMSpark ML Pipeline Logistic 回归产生比 R GLM 更糟糕的预测
【发布时间】:2015-12-15 01:23:52
【问题描述】:

我使用 ML PipeLine 运行逻辑回归模型,但由于某些原因,我得到的结果比 R 更差。我进行了一些研究,发现与此问题相关的唯一帖子是 this。似乎Spark Logistic Regression returns models that minimize loss function 而 R glm 函数使用最大似然。 Spark 模型只得到了 71.3% 的正确记录,而 R 可以正确预测 95.55% 的案例。我想知道我是否在设置上做错了什么,是否有办法改进预测。下面是我的 Spark 代码和 R 代码-

火花代码

partial model_input  
label,AGE,GENDER,Q1,Q2,Q3,Q4,Q5,DET_AGE_SQ  
1.0,39,0,0,1,0,0,1,31.55709342560551  
1.0,54,0,0,0,0,0,0,83.38062283737028  
0.0,51,0,1,1,1,0,0,35.61591695501733



def trainModel(df: DataFrame): PipelineModel = {  
  val lr  = new LogisticRegression().setMaxIter(100000).setTol(0.0000000000000001)  
  val pipeline = new Pipeline().setStages(Array(lr))  
  pipeline.fit(df)  
}

val meta =  NominalAttribute.defaultAttr.withName("label").withValues(Array("a", "b")).toMetadata

val assembler = new VectorAssembler().
  setInputCols(Array("AGE","GENDER","DET_AGE_SQ",
 "QA1","QA2","QA3","QA4","QA5")).
  setOutputCol("features")

val model = trainModel(model_input)
val pred= model.transform(model_input)  
pred.filter("label!=prediction").count

R 代码

lr <- model_input %>% glm(data=., formula=label~ AGE+GENDER+Q1+Q2+Q3+Q4+Q5+DET_AGE_SQ,
          family=binomial)
pred <- data.frame(y=model_input$label,p=fitted(lr))
table(pred $y, pred $p>0.5)

如果您需要任何其他信息,请随时告诉我。谢谢!

编辑 9/18/2015 我已尝试增加最大迭代次数并显着降低容差。不幸的是,它并没有改善预测。该模型似乎收敛到局部最小值而不是全局最小值。

【问题讨论】:

  • This 可能是相关的,因为 Spark 使用与 sklearn 类似的算法。值得在运行 LR 之前尝试规范化您的数据。您也可以尝试LBFGS instead of SGD,但在这种情况下,您必须使用 MLLib 而不是 ML。

标签: r scala apache-spark apache-spark-ml


【解决方案1】:

Spark Logistic Regression 似乎返回最小化损失函数的模型,而 R glm 函数使用最大似然。

损失函数的最小化几乎是线性模型的定义,glmml.classification.LogisticRegression 在这里没有什么不同。这两者之间的根本区别在于实现方式。

来自 ML/MLlib 的所有线性模型都基于 Gradient descent 的一些变体。使用这种方法生成的模型的质量因具体情况而异,并且取决于梯度下降和正则化参数。

另一方面,R 计算一个精确的解决方案,考虑到它的时间复杂度,它不太适合大型数据集。

正如我上面提到的,使用 GS 生成的模型的质量取决于输入参数,因此改进它的典型方法是执行超参数优化。不幸的是,与 MLlib 相比,这里的 ML 版本相当有限,但对于初学者来说,您可以增加迭代次数。

【讨论】:

  • 我已经尝试过了。但是您认为可以将 Rformula 与 Spark 1.5 一起应用来改进质量模型吗?
  • 我不这么认为。据我了解,它在后台使用 MLlib。尽管如此,由于逻辑回归损失函数是凸调整参数应该绰绰有余。
  • 好的,对我来说听起来很合乎逻辑!这只是一个突然出现在我脑海中的想法。
猜你喜欢
  • 2016-01-25
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多