Skip to content

Commit 282b1b0

Browse files
authored
Merge pull request #1653 from VesnaT/confusion_matrix_output
[FIX] OWConfusionMatrix: Output None when no data is selected
2 parents c597742 + 3285d5d commit 282b1b0

File tree

2 files changed

+62
-43
lines changed

2 files changed

+62
-43
lines changed

Orange/widgets/evaluate/owconfusionmatrix.py

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -324,44 +324,46 @@ def commit(self):
324324
predicted = self.results.predicted[self.selected_learner[0]]
325325
selected = [i for i, t in enumerate(zip(actual, predicted))
326326
if t in indices]
327-
row_indices = self.results.row_indices[selected]
328-
329-
extra = []
330-
class_var = self.data.domain.class_var
331-
metas = self.data.domain.metas
332-
333-
if self.append_predictions:
334-
predicted = numpy.array(predicted[selected], dtype=object)
335-
extra.append(predicted.reshape(-1, 1))
336-
var = Orange.data.DiscreteVariable(
337-
"{}({})".format(class_var.name, learner_name),
338-
class_var.values
327+
if selected:
328+
row_indices = self.results.row_indices[selected]
329+
extra = []
330+
class_var = self.data.domain.class_var
331+
metas = self.data.domain.metas
332+
333+
if self.append_predictions:
334+
predicted = numpy.array(predicted[selected], dtype=object)
335+
extra.append(predicted.reshape(-1, 1))
336+
var = Orange.data.DiscreteVariable(
337+
"{}({})".format(class_var.name, learner_name),
338+
class_var.values
339+
)
340+
metas = metas + (var,)
341+
342+
if self.append_probabilities and \
343+
self.results.probabilities is not None:
344+
probs = self.results.probabilities[self.selected_learner[0],
345+
selected]
346+
extra.append(numpy.array(probs, dtype=object))
347+
pvars = [Orange.data.ContinuousVariable("p({})".format(value))
348+
for value in class_var.values]
349+
metas = metas + tuple(pvars)
350+
351+
X = self.data.X[row_indices]
352+
Y = self.data.Y[row_indices]
353+
M = self.data.metas[row_indices]
354+
row_ids = self.data.ids[row_indices]
355+
356+
M = numpy.hstack((M,) + tuple(extra))
357+
domain = Orange.data.Domain(
358+
self.data.domain.attributes,
359+
self.data.domain.class_vars,
360+
metas
339361
)
340-
metas = metas + (var,)
341-
342-
if self.append_probabilities and \
343-
self.results.probabilities is not None:
344-
probs = self.results.probabilities[self.selected_learner[0],
345-
selected]
346-
extra.append(numpy.array(probs, dtype=object))
347-
pvars = [Orange.data.ContinuousVariable("p({})".format(value))
348-
for value in class_var.values]
349-
metas = metas + tuple(pvars)
350-
351-
X = self.data.X[row_indices]
352-
Y = self.data.Y[row_indices]
353-
M = self.data.metas[row_indices]
354-
row_ids = self.data.ids[row_indices]
355-
356-
M = numpy.hstack((M,) + tuple(extra))
357-
domain = Orange.data.Domain(
358-
self.data.domain.attributes,
359-
self.data.domain.class_vars,
360-
metas
361-
)
362-
data = Orange.data.Table.from_numpy(domain, X, Y, M)
363-
data.ids = row_ids
364-
data.name = learner_name
362+
data = Orange.data.Table.from_numpy(domain, X, Y, M)
363+
data.ids = row_ids
364+
data.name = learner_name
365+
else:
366+
data = None
365367

366368
else:
367369
data = None

Orange/widgets/evaluate/tests/test_owconfusionmatrix.py

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
from Orange.widgets.evaluate.owconfusionmatrix import OWConfusionMatrix
77
from Orange.widgets.tests.base import WidgetTest
88

9-
class TestOWClassificationTree(WidgetTest):
9+
10+
class TestOWConfusionMatrix(WidgetTest):
1011
@classmethod
1112
def setUpClass(cls):
1213
super().setUpClass()
@@ -28,14 +29,30 @@ def test_selected_learner(self):
2829
"""Check learner and model for various values of all parameters
2930
when pruning parameters are not checked
3031
"""
31-
self.widget.set_results(self.results_2_iris)
32+
self.send_signal("Evaluation Results", self.results_2_iris)
3233
self.assertEqual(self.widget.selected_learner, [0])
3334
self.widget.selected_learner[:] = [1]
34-
self.widget.set_results(self.results_2_titanic)
35+
self.send_signal("Evaluation Results", self.results_2_titanic)
3536
self.widget.selected_learner[:] = [1]
36-
self.widget.set_results(self.results_1_iris)
37+
self.send_signal("Evaluation Results", self.results_1_iris)
3738
self.widget.selected_learner[:] = [0]
38-
self.widget.set_results(None)
39-
self.widget.set_results(self.results_1_iris)
39+
self.send_signal("Evaluation Results", None)
40+
self.send_signal("Evaluation Results", self.results_1_iris)
4041
self.widget.selected_learner[:] = [0]
4142

43+
def test_outputs(self):
44+
self.send_signal("Evaluation Results", self.results_1_iris)
45+
46+
# check selected data output
47+
self.assertIsNone(self.get_output("Selected Data"))
48+
49+
# select data instances
50+
self.widget.select_correct()
51+
52+
# check selected data output
53+
selected = self.get_output("Selected Data")
54+
self.assertGreater(len(selected), 0)
55+
56+
# check output when data is removed
57+
self.send_signal("Evaluation Results", None)
58+
self.assertIsNone(self.get_output("Selected Data"))

0 commit comments

Comments
 (0)