我使用 ML PipeLine 运行逻辑回归模型,但由于某些原因,我得到的结果比 R 更差。我做了一些研究,发现与此问题相关的唯一帖子是this。似乎Spark Logistic Regression 返回的模型使损失函数最小化,而 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)
如果您需要任何其他信息,请随时告诉我。谢谢!
编辑 2015 年 9 月 18 日我尝试增加最大迭代次数并显着降低容差。不幸的是,它并没有改善预测。该模型似乎收敛到局部最小值而不是全局最小值。