From fb41ee39948332a1450b7b782d5ffe76c230d3ea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Primo=C5=BE=20Godec?=
Date: Wed, 21 Feb 2018 11:29:54 +0100
Subject: [PATCH] Fixing binary scores in Test and Score widget to average in
case of no target selected
---
Orange/widgets/evaluate/owtestlearners.py | 6 ++--
.../evaluate/tests/test_owtestlearners.py | 31 ++++++++++++++++++-
2 files changed, 33 insertions(+), 4 deletions(-)
diff --git a/Orange/widgets/evaluate/owtestlearners.py b/Orange/widgets/evaluate/owtestlearners.py
index d375d2d3b8d..c83b70d3b47 100644
--- a/Orange/widgets/evaluate/owtestlearners.py
+++ b/Orange/widgets/evaluate/owtestlearners.py
@@ -567,7 +567,7 @@ def _update_stats_model(self):
# Cell variable is used immediatelly, it's not stored
# pylint: disable=cell-var-from-loop
- stats = [Try(scorer_caller(scorer, ovr_results))
+ stats = [Try(scorer_caller(scorer, ovr_results, target=1))
for scorer in self.scorers]
else:
stats = None
@@ -950,9 +950,9 @@ def onDeleteWidget(self):
super().onDeleteWidget()
-def scorer_caller(scorer, ovr_results):
+def scorer_caller(scorer, ovr_results, target=None):
if scorer.is_binary:
- return lambda: scorer(ovr_results, target=1, average='weighted')
+ return lambda: scorer(ovr_results, target=target, average='weighted')
else:
return lambda: scorer(ovr_results)
diff --git a/Orange/widgets/evaluate/tests/test_owtestlearners.py b/Orange/widgets/evaluate/tests/test_owtestlearners.py
index 466586edbe8..f5eec880e05 100644
--- a/Orange/widgets/evaluate/tests/test_owtestlearners.py
+++ b/Orange/widgets/evaluate/tests/test_owtestlearners.py
@@ -7,7 +7,7 @@
from AnyQt.QtWidgets import QMenu
from AnyQt.QtCore import QPoint
-from Orange.classification import MajorityLearner
+from Orange.classification import MajorityLearner, LogisticRegressionLearner
from Orange.data import Table, Domain, DiscreteVariable, ContinuousVariable
from Orange.evaluation import Results, TestOnTestData
from Orange.evaluation.scoring import ClassificationScore, RegressionScore, \
@@ -247,6 +247,35 @@ class NewRegressionScore(RegressionScore):
del Score.registry["NewClassificationScore"]
del Score.registry["NewRegressionScore"]
+ def test_target_changing(self):
+ data = Table("iris")
+ w = self.widget #: OWTestLearners
+
+ w.n_folds = 2
+ self.send_signal(self.widget.Inputs.train_data, data)
+ self.send_signal(self.widget.Inputs.learner,
+ LogisticRegressionLearner(), 0, wait=5000)
+
+ average_auc = float(w.view.model().item(0, 1).text())
+
+ w.class_selection = "Iris-setosa"
+ w._on_target_class_changed()
+ setosa_auc = float(w.view.model().item(0, 1).text())
+
+ w.class_selection = "Iris-versicolor"
+ w._on_target_class_changed()
+ versicolor_auc = float(w.view.model().item(0, 1).text())
+
+ w.class_selection = "Iris-virginica"
+ w._on_target_class_changed()
+ virginica_auc = float(w.view.model().item(0, 1).text())
+
+ self.assertGreater(average_auc, versicolor_auc)
+ self.assertGreater(average_auc, virginica_auc)
+ self.assertLess(average_auc, setosa_auc)
+ self.assertGreater(setosa_auc, versicolor_auc)
+ self.assertGreater(setosa_auc, virginica_auc)
+
class TestHelpers(unittest.TestCase):
def test_results_one_vs_rest(self):