diff --git a/modules/base/pymod/table.py b/modules/base/pymod/table.py index 87a425ebcf9e61852e8709ca26ab6bee526b0ce7..fa76ceaed422da2de86c513ceb5cc59c88a0b745 100644 --- a/modules/base/pymod/table.py +++ b/modules/base/pymod/table.py @@ -1252,6 +1252,11 @@ class Table: fp += 1 x.append(fp) y.append(tp) + + # if no false positives or false negatives values are found return None + if x[-1]==0 or y[-1]==0: + return None + x = [float(v)/x[-1] for v in x] y = [float(v)/y[-1] for v in y] return x,y @@ -1265,10 +1270,12 @@ class Table: try: import numpy as np - rocx, rocy = self.ComputeROC(score_col, class_col, score_dir, - class_dir, class_cutoff) + roc = self.ComputeROC(score_col, class_col, score_dir, + class_dir, class_cutoff) - return np.trapz(rocy, rocx) + if not roc: + return None + return np.trapz(roc[1], roc[0]) except ImportError: LogError("Function needs numpy, but I could not import it.") raise @@ -1284,9 +1291,14 @@ class Table: try: import matplotlib.pyplot as plt - enrx, enry = self.ComputeROC(score_col, class_col, score_dir, + roc = self.ComputeROC(score_col, class_col, score_dir, class_dir, class_cutoff) + if not roc: + return None + + enrx, enry = roc + if not title: title = 'ROC of %s'%score_col diff --git a/modules/base/tests/test_table.py b/modules/base/tests/test_table.py index 4220de12fd65d5caa7d83b7d8a9973916dee24b4..e2a3060c62ae341f9f822a6d76403bd29e0cf8e5 100644 --- a/modules/base/tests/test_table.py +++ b/modules/base/tests/test_table.py @@ -985,7 +985,15 @@ class TestTable(unittest.TestCase): img1 = Image.open(os.path.join("testfiles","roc-out.png")) img2 = Image.open(os.path.join("testfiles","roc.png")) self.CompareImages(img1, img2) - #pl.show() + + # no true positives + tab = Table(['classific', 'score'], 'bf', + classific=[False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], + score=[0.9, 0.8, 0.7, 0.6, 0.55, 0.54, 0.53, 0.52, 0.51, 0.505, 0.4, 0.39, 0.38, 0.37, 0.36, 0.35, 0.34, 0.33, 0.30, 0.1]) + pl = tab.PlotROC(score_col='score', score_dir='+', + class_col='classific', + save=os.path.join("testfiles","roc-out.png")) + self.assertEquals(pl, None) def testPlotROCSameValues(self): if not HAS_MPL or not HAS_PIL: @@ -1011,7 +1019,14 @@ class TestTable(unittest.TestCase): auc = tab.ComputeROCAUC(score_col='score', score_dir='+', class_col='classific') self.assertAlmostEquals(auc, auc_ref) - def testCalcROC(self): + # no true positives + tab = Table(['classific', 'score'], 'bf', + classific=[False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False], + score=[0.9, 0.8, 0.7, 0.6, 0.55, 0.54, 0.53, 0.52, 0.51, 0.505, 0.4, 0.39, 0.38, 0.37, 0.36, 0.35, 0.34, 0.33, 0.30, 0.1]) + auc = tab.ComputeROCAUC(score_col='score', score_dir='+', class_col='classific') + self.assertEquals(auc, None) + + def testCalcROCAUCWithCutoff(self): if not HAS_NUMPY: return tab = Table(['classific', 'score'], 'ff', @@ -1020,6 +1035,10 @@ class TestTable(unittest.TestCase): auc = tab.ComputeROCAUC(score_col='score', class_col='classific', class_cutoff=0.5) self.assertEquals(auc, 1.0) + # no true positives + auc = tab.ComputeROCAUC(score_col='score', class_col='classific', class_cutoff=1.0) + self.assertEquals(auc, None) + def testCalcROCFromFile(self): tab = Table.Load(os.path.join('testfiles','roc_table.dat')) auc = tab.ComputeROCAUC(score_col='prediction', class_col='reference', class_cutoff=0.4)