2016-01-05 17 views
2

我將邏輯迴歸的閾值設置爲0.5,然後將其用於評分。我現在想要獲得精確度,回想一下f1分值。不幸的是,當我嘗試這樣做時,我看到的唯一閾值是1.0和0.0。如何獲得對除0以外和1MLlib:計算多個閾值的精度和調用

例如這裏是O/P的閾值指標:

閾值是:1.0,精確度是:0.85

閾值是:0.0,精密是:0.312641

我沒有得到閾值0.5的精度。這是相關的代碼。

//我在這裏設置Logistic迴歸模型的閾值。

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

您可以看到,使用.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)的值取出來,因爲它再次會給出相同的預測,因此具有相同的精度。