2016-01-05 1 views
2

Я установил для параметра пороговое значение моей логистической регрессии значение 0,5, прежде чем использовать его для подсчета очков. Теперь я хочу получить точность, напомнить, оценка f1 для этого значения. К сожалению, когда я пытаюсь сделать это, единственными пороговыми значениями, которые я вижу, являются 1.0 и 0.0. Как получить показатели для других, чем 0 и 1.MLlib: вычисление точности и повторного вызова для нескольких пороговых значений

Для примера здесь является о/р пороговых значений:

Порог: 1,0, точность составляет: 0,85

Порог: 0,0, точность is: 0.312641

Я не получаю точность для порога 0,5. Вот соответствующий код.

// Я устанавливаю пороговое значение моей модели логистической регрессии.

model.setThreshold(0.5) 

// Compute the score and generate an RDD with prediction and label values. 
val predictionAndLabels = data.map { 
    case LabeledPoint(label, features) => (model.predict(features), label) 
} 

// Теперь я хочу вычислить точность и отзыв и другие показатели. Поскольку я установил порог модели в 0.5, я хочу получить PR по этому значению.

val metrics = new BinaryClassificationMetrics(predictionAndLabels) 
val precision = metrics.precisionByThreshold() 

precision.foreach { 
    case (t, p) => { 
    println(s"Threshold is: $t, Precision is: $p") 

    if (t == 0.5) { 
     println(s"Desired: Threshold is: $t, Precision is: $p")   
    } 
} 
+0

Я просто ответил на аналогичный вопрос здесь http://stackoverflow.com/questions/34216481/spark-regression-model-threshold-and-precision/36063766#36063766 – nDakota

ответ

1

Метод precisionByThreshold() на самом деле пытается различные пороги и давать соответствующие значения точности. Поскольку вы уже установили свои данные, у вас есть только 0 и 1.

Допустим, у вас есть: [0 0 0 1 1 1] после пороговым и реальные этикетки [f f f f t t].

Тогда пороговый с 0 у вас есть [t t t t t t], который дает вам 4 ложноположительных и 2 истинную положительная, следовательно, точность 2/(2 + 4) = 1/3

Теперь пороговому с 1 у вас есть [f f f t t t], который и дают 1 ложноположительных и 2 истинную положительной, следовательно, точность 2 /(2 + 1) = 2/3

Вы можете видеть, что с использованием порога 0,5 теперь вы получите [f f f t t t], то же самое, что и пороговое значение с 1, так что это точность для порога 1, которую вы ищете.

Это немного сбивает с толку, потому что вы уже породили ваши прогнозы. Если вы не порождаете своих прогнозов, и предположим, что у вас есть [.3 .4 .4 .6 .8 .9] (чтобы оставаться в соответствии с используемым мной [0 0 0 1 1 1]).

Тогда precisionByThreshold() предоставит вам значения префикса для пороговых значений 0, .3, .4, .6 .8 .9, поскольку все они являются пороговыми значениями, дающими разные результаты и, следовательно, различные прецизионности и для получения значения для порога. 5, вы по-прежнему принимаете значение для следующего большего порога (.6), потому что опять-таки это даст одни и те же предсказания, следовательно, такую ​​же точность.

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