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):