2015-09-18 1 views
2

Я использовал ML PipeLine для запуска моделей логистической регрессии, но по некоторым причинам я получил худшие результаты, чем R. Я провел несколько исследований и единственное сообщение, которое, как мне показалось, связано к этому вопросу this. Кажется, что Spark Logistic Regression returns models that minimize loss function, а функция R glm использует максимальный правдоподобие. Модель Spark получила только 71,3% записей, в то время как R может предсказать 95,55% случаев правильно. Мне было интересно, не сделал ли я что-то неправильно в настройке и если есть способ улучшить прогноз. Ниже мой Спарк код и R code-Spark ML Pipeline Logistic Regression производит гораздо худшие прогнозы, чем R GLM

Спарк Код

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 Я попытался увеличить максимальную итерацию и резко уменьшить допустимость. К сожалению, это не улучшило прогноз. Кажется, что модель сходится к локальному минимуму вместо глобального минимума.

+0

[This] (http://stackoverflow.com/questions/28747019/comparison-of-r-statmodels-sklearn-for-a-classification-task-with-logistic-reg) может иметь значение, поскольку Spark использует аналогичные алгоритмы для sklearn. Стоит попытаться нормализовать ваши данные перед запуском LR. Также вы можете попробовать [LBFGS вместо SGD] (http://spark.apache.org/docs/latest/api/python/pyspark.mllib.html#pyspark.mllib.classification.LogisticRegressionWithLBFGS), но в этом случае вам нужно используйте MLLib вместо ML. – max

ответ

3

Похоже, что Spark Logistic Regression возвращает модели, которые минимизируют функцию потерь, в то время как функция R glm использует максимальный правдоподобие.

Минимизация функции потерь в значительной степени определение линейных моделей и как glm и ml.classification.LogisticRegression не отличаются здесь. Фундаментальное различие между этими двумя способами заключается в том, как это достигается.

Все линейные модели от ML/MLlib основаны на некоторых вариантах Gradient descent. Качество модели, сгенерированной с использованием этого подхода, варьируется в каждом конкретном случае и зависит от параметров градиентного спуска и регуляризации.

R, с другой стороны, вычисляет точное решение, которое, учитывая его временную сложность, плохо подходит для больших наборов данных.

Как я уже упоминал выше, качество модели, сгенерированной с использованием GS, зависит от входных параметров, поэтому типичным способом его улучшения является выполнение оптимизации гиперпараметров. К сожалению, версия ML довольно ограничена здесь по сравнению с MLlib, но для начинающих вы можете увеличить количество итераций.

+0

Я пробовал это еще. Но как вы думаете, можно было бы применить Rformula с Spark 1.5 для улучшения модели качества? – eliasah

+0

Я так не думаю. Насколько я понимаю, он использует MLlib под капотом. Тем не менее, поскольку функция потери логистической регрессии - это выпуклые параметры настройки, должно быть более чем достаточно. – zero323

+0

Хорошо, звучит логично для меня! Это просто идея, которая появилась у меня в голове. – eliasah

Смежные вопросы