@@ -60,72 +60,75 @@ class MulticlassMetrics(predictionsAndLabels: RDD[(Double, Double)]) extends Log
60
60
* @param label the label.
61
61
* @return F1-measure.
62
62
*/
63
- def f1Measure (label : Double ): Double =
64
- 2 * precision(label) * recall(label) / (precision(label) + recall(label))
63
+ def f1Measure (label : Double ): Double = {
64
+ val p = precision(label)
65
+ val r = recall(label)
66
+ if ((p + r) == 0 ) 0 else 2 * p * r / (p + r)
67
+ }
65
68
66
69
/**
67
70
* Returns micro-averaged Recall
68
71
* (equals to microPrecision and microF1measure for multiclass classifier)
69
72
* @return microRecall.
70
73
*/
71
- def microRecall : Double =
72
- tpByClass.foldLeft(0L ){case (sum,(_, tp)) => sum + tp}.toDouble / labelCount.toDouble
74
+ lazy val microRecall : Double =
75
+ tpByClass.foldLeft(0L ){case (sum,(_, tp)) => sum + tp}.toDouble / labelCount
73
76
74
77
/**
75
78
* Returns micro-averaged Precision
76
79
* (equals to microPrecision and microF1measure for multiclass classifier)
77
80
* @return microPrecision.
78
81
*/
79
- def microPrecision : Double = microRecall
82
+ lazy val microPrecision : Double = microRecall
80
83
81
84
/**
82
85
* Returns micro-averaged F1-measure
83
86
* (equals to microPrecision and microRecall for multiclass classifier)
84
87
* @return microF1measure.
85
88
*/
86
- def microF1Measure : Double = microRecall
89
+ lazy val microF1Measure : Double = microRecall
87
90
88
91
/**
89
92
* Returns weighted averaged Recall
90
93
* @return weightedRecall.
91
94
*/
92
- def weightedRecall : Double = labelCountByClass.foldLeft(0.0 ){case (wRecall, (category, count)) =>
93
- wRecall + recall(category) * count.toDouble / labelCount.toDouble }
95
+ lazy val weightedRecall : Double = labelCountByClass.foldLeft(0.0 ){case (wRecall, (category, count)) =>
96
+ wRecall + recall(category) * count.toDouble / labelCount}
94
97
95
98
/**
96
99
* Returns weighted averaged Precision
97
100
* @return weightedPrecision.
98
101
*/
99
- def weightedPrecision : Double =
102
+ lazy val weightedPrecision : Double =
100
103
labelCountByClass.foldLeft(0.0 ){case (wPrecision, (category, count)) =>
101
- wPrecision + precision(category) * count.toDouble / labelCount.toDouble }
104
+ wPrecision + precision(category) * count.toDouble / labelCount}
102
105
103
106
/**
104
107
* Returns weighted averaged F1-measure
105
108
* @return weightedF1Measure.
106
109
*/
107
- def weightedF1Measure : Double =
110
+ lazy val weightedF1Measure : Double =
108
111
labelCountByClass.foldLeft(0.0 ){case (wF1measure, (category, count)) =>
109
- wF1measure + f1Measure(category) * count.toDouble / labelCount.toDouble }
112
+ wF1measure + f1Measure(category) * count.toDouble / labelCount}
110
113
111
114
/**
112
115
* Returns map with Precisions for individual classes
113
116
* @return precisionPerClass.
114
117
*/
115
- def precisionPerClass =
118
+ lazy val precisionPerClass =
116
119
labelCountByClass.map{case (category, _) => (category, precision(category))}.toMap
117
120
118
121
/**
119
122
* Returns map with Recalls for individual classes
120
123
* @return recallPerClass.
121
124
*/
122
- def recallPerClass =
125
+ lazy val recallPerClass =
123
126
labelCountByClass.map{case (category, _) => (category, recall(category))}.toMap
124
127
125
128
/**
126
129
* Returns map with F1-measures for individual classes
127
130
* @return f1MeasurePerClass.
128
131
*/
129
- def f1MeasurePerClass =
132
+ lazy val f1MeasurePerClass =
130
133
labelCountByClass.map{case (category, _) => (category, f1Measure(category))}.toMap
131
134
}
0 commit comments