Skip to content

Commit 89aa265

Browse files
authored
Merge pull request #4207 from janezd/fss-no-nice-features
[FIX] Fix crash in Preprocess' Select Relevant Features when there are no features
2 parents 562ebb2 + 7f5c9da commit 89aa265

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

Orange/preprocess/fss.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,9 @@ def __call__(self, data):
9191
return data.transform(domain)
9292

9393
def score_only_nice_features(self, data, method):
94+
# dtype must be defined because array can be empty
9495
mask = np.array([isinstance(a, method.feature_type)
95-
for a in data.domain.attributes])
96+
for a in data.domain.attributes], dtype=np.bool)
9697
features = [f for f in data.domain.attributes
9798
if isinstance(f, method.feature_type)]
9899
scores = [method(data, f) for f in features]
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import unittest
2+
from unittest.mock import Mock
3+
4+
import numpy as np
5+
6+
from Orange.data import Domain, Table, DiscreteVariable, ContinuousVariable
7+
from Orange.preprocess import fss
8+
9+
10+
class SelectBestFeaturesTest(unittest.TestCase):
11+
def test_no_nice_features(self):
12+
method = Mock()
13+
method.feature_type = DiscreteVariable
14+
selector = fss.SelectBestFeatures(method, 5)
15+
16+
domain = Domain([])
17+
data = Table.from_numpy(domain, np.zeros((100, 0)))
18+
selection = selector.score_only_nice_features(data, method)
19+
self.assertEqual(selection.size, 0)
20+
method.assert_not_called()
21+
22+
domain = Domain([ContinuousVariable("x")])
23+
data = Table.from_numpy(domain, np.zeros((100, 1)))
24+
selector.decreasing = True
25+
selection = selector.score_only_nice_features(data, method)
26+
np.testing.assert_equal(selection, [float('-inf')])
27+
method.assert_not_called()
28+
29+
selector.decreasing = False
30+
selection = selector.score_only_nice_features(data, method)
31+
np.testing.assert_equal(selection, [float('inf')])
32+
method.assert_not_called()
33+
34+
35+
if __name__ == "__main__":
36+
unittest.main()

0 commit comments

Comments
 (0)