Skip to content

Commit

Permalink
Merge pull request #5859 from janezd/calibration-no-foldss
Browse files Browse the repository at this point in the history
[FIX] Calibration: Fix crash on empty folds
  • Loading branch information
VesnaT authored Feb 25, 2022
2 parents 5c5c3be + b817423 commit 2779699
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 2 deletions.
2 changes: 1 addition & 1 deletion Orange/widgets/evaluate/owcalibrationplot.py
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ def commit(self):
if results is not None:
problems = [
msg for condition, msg in (
(len(results.folds) > 1,
(results.folds is not None and len(results.folds) > 1,
"each training data sample produces a different model"),
(results.models is None,
"test results do not contain stored models - try testing "
Expand Down
3 changes: 2 additions & 1 deletion Orange/widgets/evaluate/owpredictions.py
Original file line number Diff line number Diff line change
Expand Up @@ -687,7 +687,8 @@ def _commit_evaluation_results(self):
nanmask = numpy.isnan(self.data.get_column_view(self.class_var)[0])
data = self.data[~nanmask]
results = Results(data, store_data=True)
results.folds = None
results.folds = [...]
results.models = numpy.array([[p.predictor for p in self.predictors]])
results.row_indices = numpy.arange(len(data))
results.actual = data.Y.ravel()
results.predicted = numpy.vstack(
Expand Down
17 changes: 17 additions & 0 deletions Orange/widgets/evaluate/tests/test_owcalibrationplot.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import copy
import warnings
import unittest
from unittest.mock import Mock, patch

import numpy as np
Expand Down Expand Up @@ -637,3 +638,19 @@ def test_warn_nan_probabilities(self, *_):
self.assertTrue(widget.Warning.omitted_nan_prob_points.is_shown())
self._set_list_selection(widget.controls.selected_classifiers, [0, 2])
self.assertFalse(widget.Warning.omitted_folds.is_shown())

@patch("Orange.widgets.evaluate.owcalibrationplot.ThresholdClassifier")
@patch("Orange.widgets.evaluate.owcalibrationplot.CalibratedLearner")
def test_no_folds(self, *_):
"""Don't crash on malformed Results with folds=None"""
widget = self.widget

self.results.folds = None
self.send_signal(widget.Inputs.evaluation_results, self.results)
widget.selected_classifiers = [0]
widget.commit.now()
self.assertIsNotNone(self.get_output(widget.Outputs.calibrated_model))


if __name__ == "__main__":
unittest.main()
4 changes: 4 additions & 0 deletions Orange/widgets/evaluate/tests/test_owpredictions.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

from Orange.base import Model
from Orange.classification import LogisticRegressionLearner, NaiveBayesLearner
from Orange.classification.majority import ConstantModel
from Orange.data.io import TabReader
from Orange.evaluation.scoring import TargetScore
from Orange.preprocess import Remove
Expand Down Expand Up @@ -507,6 +508,9 @@ def test_multi_inputs(self):
def check_evres(expected):
out = self.get_output(w.Outputs.evaluation_results)
self.assertSequenceEqual(out.learner_names, expected)
self.assertEqual(out.folds, [...])
self.assertEqual(out.models.shape, (1, len(out.learner_names)))
self.assertIsInstance(out.models[0, 0], ConstantModel)

check_evres(["P1", "P2", "P3"])

Expand Down

0 comments on commit 2779699

Please sign in to comment.