Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef CONTINGENCYTABLEEVALUATION_H_
00012 #define CONTINGENCYTABLEEVALUATION_H_
00013
00014 #include <shogun/evaluation/BinaryClassEvaluation.h>
00015 #include <shogun/labels/Labels.h>
00016 #include <shogun/mathematics/Math.h>
00017 #include <shogun/io/SGIO.h>
00018
00019 namespace shogun
00020 {
00021
00022 class CLabels;
00023
00025 enum EContingencyTableMeasureType
00026 {
00027 ACCURACY = 0,
00028 ERROR_RATE = 10,
00029 BAL = 20,
00030 WRACC = 30,
00031 F1 = 40,
00032 CROSS_CORRELATION = 50,
00033 RECALL = 60,
00034 PRECISION = 70,
00035 SPECIFICITY = 80,
00036 CUSTOM = 999
00037 };
00038
00070 class CContingencyTableEvaluation: public CBinaryClassEvaluation
00071 {
00072
00073 public:
00074
00076 CContingencyTableEvaluation() :
00077 CBinaryClassEvaluation(), m_type(ACCURACY), m_computed(false) {};
00078
00082 CContingencyTableEvaluation(EContingencyTableMeasureType type) :
00083 CBinaryClassEvaluation(), m_type(type), m_computed(false) {};
00084
00086 virtual ~CContingencyTableEvaluation() {};
00087
00093 virtual float64_t evaluate(CLabels* predicted, CLabels* ground_truth);
00094
00095 EEvaluationDirection get_evaluation_direction();
00096
00098 virtual const char* get_name() const
00099 {
00100 return "ContingencyTableEvaluation";
00101 }
00102
00106 inline float64_t get_accuracy() const
00107 {
00108 if (!m_computed)
00109 SG_ERROR("Uninitialized, please call evaluate first");
00110
00111 return (m_TP+m_TN)/m_N;
00112 };
00113
00117 inline float64_t get_error_rate() const
00118 {
00119 if (!m_computed)
00120 SG_ERROR("Uninitialized, please call evaluate first");
00121
00122 return (m_FP + m_FN)/m_N;
00123 };
00124
00128 inline float64_t get_BAL() const
00129 {
00130 if (!m_computed)
00131 SG_ERROR("Uninitialized, please call evaluate first");
00132
00133 return 0.5*(m_FN/(m_FN + m_TP) + m_FP/(m_FP + m_TN));
00134 };
00135
00139 inline float64_t get_WRACC() const
00140 {
00141 if (!m_computed)
00142 SG_ERROR("Uninitialized, please call evaluate first");
00143
00144 return m_TP/(m_FN + m_TP) - m_FP/(m_FP + m_TN);
00145 };
00146
00150 inline float64_t get_F1() const
00151 {
00152 if (!m_computed)
00153 SG_ERROR("Uninitialized, please call evaluate first");
00154
00155 return (2*m_TP)/(2*m_TP + m_FP + m_FN);
00156 };
00157
00161 inline float64_t get_cross_correlation() const
00162 {
00163 if (!m_computed)
00164 SG_ERROR("Uninitialized, please call evaluate first");
00165
00166 return (m_TP*m_TN-m_FP*m_FN)/CMath::sqrt((m_TP+m_FP)*(m_TP+m_FN)*(m_TN+m_FP)*(m_TN+m_FN));
00167 };
00168
00172 inline float64_t get_recall() const
00173 {
00174 if (!m_computed)
00175 SG_ERROR("Uninitialized, please call evaluate first");
00176
00177 return m_TP/(m_TP+m_FN);
00178 };
00179
00183 inline float64_t get_precision() const
00184 {
00185 if (!m_computed)
00186 SG_ERROR("Uninitialized, please call evaluate first");
00187
00188 return m_TP/(m_TP+m_FP);
00189 };
00190
00194 inline float64_t get_specificity() const
00195 {
00196 if (!m_computed)
00197 SG_ERROR("Uninitialized, please call evaluate first");
00198
00199 return m_TN/(m_TN+m_FP);
00200 };
00201
00205 float64_t get_TP() const
00206 {
00207 return m_TP;
00208 }
00212 float64_t get_FP() const
00213 {
00214 return m_FP;
00215 }
00219 float64_t get_TN() const
00220 {
00221 return m_TN;
00222 }
00226 float64_t get_FN() const
00227 {
00228 return m_FN;
00229 }
00230
00234 virtual float64_t get_custom_score()
00235 {
00236 SG_NOTIMPLEMENTED;
00237 return 0.0;
00238 }
00239
00243 virtual EEvaluationDirection get_custom_direction()
00244 {
00245 SG_NOTIMPLEMENTED;
00246 return ED_MAXIMIZE;
00247 }
00248
00249 protected:
00250
00252 void compute_scores(CBinaryLabels* predicted, CBinaryLabels* ground_truth);
00253
00255 EContingencyTableMeasureType m_type;
00256
00258 bool m_computed;
00259
00261 int32_t m_N;
00262
00264 float64_t m_TP;
00265
00267 float64_t m_FP;
00268
00270 float64_t m_TN;
00271
00273 float64_t m_FN;
00274 };
00275
00285 class CAccuracyMeasure: public CContingencyTableEvaluation
00286 {
00287 public:
00288
00289 CAccuracyMeasure() : CContingencyTableEvaluation(ACCURACY) {};
00290
00291 virtual ~CAccuracyMeasure() {};
00292
00293 virtual const char* get_name() const { return "AccuracyMeasure"; };
00294 };
00295
00305 class CErrorRateMeasure: public CContingencyTableEvaluation
00306 {
00307 public:
00308
00309 CErrorRateMeasure() : CContingencyTableEvaluation(ERROR_RATE) {};
00310
00311 virtual ~CErrorRateMeasure() {};
00312
00313 virtual const char* get_name() const { return "ErrorRateMeasure"; };
00314 };
00315
00325 class CBALMeasure: public CContingencyTableEvaluation
00326 {
00327 public:
00328
00329 CBALMeasure() : CContingencyTableEvaluation(BAL) {};
00330
00331 virtual ~CBALMeasure() {};
00332
00333 virtual const char* get_name() const { return "BALMeasure"; };
00334 };
00335
00345 class CWRACCMeasure: public CContingencyTableEvaluation
00346 {
00347 public:
00348
00349 CWRACCMeasure() : CContingencyTableEvaluation(WRACC) {};
00350
00351 virtual ~CWRACCMeasure() {};
00352
00353 virtual const char* get_name() const { return "WRACCMeasure"; };
00354 };
00355
00365 class CF1Measure: public CContingencyTableEvaluation
00366 {
00367 public:
00368
00369 CF1Measure() : CContingencyTableEvaluation(F1) {};
00370
00371 virtual ~CF1Measure() {};
00372
00373 virtual const char* get_name() const { return "F1Measure"; };
00374 };
00375
00385 class CCrossCorrelationMeasure: public CContingencyTableEvaluation
00386 {
00387 public:
00388
00389 CCrossCorrelationMeasure() : CContingencyTableEvaluation(CROSS_CORRELATION) {};
00390
00391 virtual ~CCrossCorrelationMeasure() {};
00392
00393 virtual const char* get_name() const { return "CrossCorrelationMeasure"; };
00394 };
00395
00405 class CRecallMeasure: public CContingencyTableEvaluation
00406 {
00407 public:
00408
00409 CRecallMeasure() : CContingencyTableEvaluation(RECALL) {};
00410
00411 virtual ~CRecallMeasure() {};
00412
00413 virtual const char* get_name() const { return "RecallMeasure"; };
00414 };
00415
00425 class CPrecisionMeasure: public CContingencyTableEvaluation
00426 {
00427 public:
00428
00429 CPrecisionMeasure() : CContingencyTableEvaluation(PRECISION) {};
00430
00431 virtual ~CPrecisionMeasure() {};
00432
00433 virtual const char* get_name() const { return "PrecisionMeasure"; };
00434 };
00435
00445 class CSpecificityMeasure: public CContingencyTableEvaluation
00446 {
00447 public:
00448
00449 CSpecificityMeasure() : CContingencyTableEvaluation(SPECIFICITY) {};
00450
00451 virtual ~CSpecificityMeasure() {};
00452
00453 virtual const char* get_name() const { return "SpecificityMeasure"; };
00454 };
00455 }
00456 #endif