Regressão logística do pipeline Spark ML produz previsões muito piores do que o R GLM
Usei o ML PipeLine para executar modelos de regressão logística, mas por algumas razões obtive piores resultados do que R. Fiz algumas pesquisas e o único post que achei relacionado a esse problema éesta . Parece queRegressão logística Spark retorna modelos que minimizam a função de perda enquanto a função R glm usa a probabilidade máxima. O modelo Spark apenas acertou 71,3% dos registros, enquanto R pode prever 95,55% dos casos corretamente. Fiquei me perguntando se fiz algo errado na configuração e se há uma maneira de melhorar a previsão. Abaixo está o meu código Spark e código R-
Código Spark
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
Código 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)
Sinta-se à vontade para me informar se precisar de outras informações. Obrigado!
Editar 18/09/2015 Eu tentei aumentar a iteração máxima e diminuir drasticamente a tolerância. Infelizmente, não melhorou a previsão. Parece que o modelo convergiu para um mínimo local em vez do mínimo global.