mlpack
f1_impl.hpp
Go to the documentation of this file.
1 
12 #ifndef MLPACK_CORE_CV_METRICS_F1_IMPL_HPP
13 #define MLPACK_CORE_CV_METRICS_F1_IMPL_HPP
14 
16 
17 namespace mlpack {
18 namespace cv {
19 
20 template<AverageStrategy AS, size_t PC /* PositiveClass */>
21 template<typename MLAlgorithm, typename DataType>
22 double F1<AS, PC>::Evaluate(MLAlgorithm& model,
23  const DataType& data,
24  const arma::Row<size_t>& labels)
25 {
26  return Evaluate<AS>(model, data, labels);
27 }
28 
29 template<AverageStrategy AS, size_t PC /* PositiveClass */>
30 template<AverageStrategy _AS, typename MLAlgorithm, typename DataType, typename>
31 double F1<AS, PC>::Evaluate(MLAlgorithm& model,
32  const DataType& data,
33  const arma::Row<size_t>& labels)
34 {
35  util::CheckSameSizes(data, labels, "F1<Binary>::Evaluate()");
36 
37  arma::Row<size_t> predictedLabels;
38  model.Classify(data, predictedLabels);
39 
40  size_t tp = arma::sum((labels == PC) % (predictedLabels == PC));
41  size_t numberOfPositivePredictions = arma::sum(predictedLabels == PC);
42  size_t numberOfPositiveClassInstances = arma::sum(labels == PC);
43 
44  double precision = double(tp) / numberOfPositivePredictions;
45  double recall = double(tp) / numberOfPositiveClassInstances;
46 
47  return (precision + recall == 0.0) ? 0.0 :
48  2.0 * precision * recall / (precision + recall);
49 }
50 
51 template<AverageStrategy AS, size_t PC /* PositiveClass */>
52 template<AverageStrategy _AS, typename MLAlgorithm, typename DataType, typename,
53  typename>
54 double F1<AS, PC>::Evaluate(MLAlgorithm& model,
55  const DataType& data,
56  const arma::Row<size_t>& labels)
57 {
58  util::CheckSameSizes(data, labels, "F1<Micro>::Evaluate()");
59 
60  // Microaveraged F1 is really the same as microaveraged precision and
61  // microaveraged recall, which are in turn the same as accuracy.
62  return Accuracy::Evaluate(model, data, labels);
63 }
64 
65 template<AverageStrategy AS, size_t PC /* PositiveClass */>
66 template<AverageStrategy _AS, typename MLAlgorithm, typename DataType, typename,
67  typename, typename>
68 double F1<AS, PC>::Evaluate(MLAlgorithm& model,
69  const DataType& data,
70  const arma::Row<size_t>& labels)
71 {
72  util::CheckSameSizes(data, labels, "F1<Macro>::Evaluate()");
73 
74  arma::Row<size_t> predictedLabels;
75  model.Classify(data, predictedLabels);
76 
77  size_t numClasses = arma::max(labels) + 1;
78 
79  arma::vec f1s = arma::vec(numClasses);
80  for (size_t c = 0; c < numClasses; ++c)
81  {
82  size_t tp = arma::sum((labels == c) % (predictedLabels == c));
83  size_t positivePredictions = arma::sum(predictedLabels == c);
84  size_t positiveLabels = arma::sum(labels == c);
85 
86  double precision = double(tp) / positivePredictions;
87  double recall = double(tp) / positiveLabels;
88  f1s(c) = (precision + recall == 0.0) ? 0.0 :
89  2.0 * precision * recall / (precision + recall);
90  }
91 
92  return arma::mean(f1s);
93 }
94 
95 } // namespace cv
96 } // namespace mlpack
97 
98 #endif
Linear algebra utility functions, generally performed on matrices or vectors.
Definition: cv.hpp:1
static double Evaluate(MLAlgorithm &model, const DataType &data, const arma::Row< size_t > &labels)
Run classification and calculate F1.
Definition: f1_impl.hpp:22
static double Evaluate(MLAlgorithm &model, const DataType &data, const arma::Row< size_t > &labels)
Run classification and calculate accuracy.
Definition: accuracy_impl.hpp:19
AverageStrategy
This enum declares possible strategies for averaging that can be used in some metrics like precision...
Definition: average_strategy.hpp:25