|
32 | 32 | from Orange.evaluation import Results |
33 | 33 | from Orange.preprocess.preprocess import Preprocess |
34 | 34 | import Orange.regression |
| 35 | +from Orange.statistics.util import unique |
35 | 36 | from Orange.widgets import gui, settings, widget |
36 | 37 | from Orange.widgets.evaluate.utils import \ |
37 | 38 | usable_scorers, ScoreTable, learner_name, scorer_caller |
@@ -189,17 +190,14 @@ class Outputs: |
189 | 190 | class Error(OWWidget.Error): |
190 | 191 | train_data_empty = Msg("Train dataset is empty.") |
191 | 192 | test_data_empty = Msg("Test dataset is empty.") |
192 | | - class_required = Msg("Train data input requires a target variable.") |
193 | | - too_many_classes = Msg("Too many target variables.") |
194 | 193 | class_required_test = Msg("Test data input requires a target variable.") |
195 | 194 | too_many_folds = Msg("Number of folds exceeds the data size") |
196 | 195 | class_inconsistent = Msg("Test and train datasets " |
197 | 196 | "have different target variables.") |
198 | 197 | memory_error = Msg("Not enough memory.") |
199 | | - no_class_values = Msg("Target variable has no values.") |
200 | | - only_one_class_var_value = Msg("Target variable has only one value.") |
201 | 198 | test_data_incompatible = Msg( |
202 | 199 | "Test data may be incompatible with train data.") |
| 200 | + data_error = Msg("{}") |
203 | 201 |
|
204 | 202 | class Warning(OWWidget.Warning): |
205 | 203 | missing_data = \ |
@@ -383,25 +381,29 @@ def set_train_data(self, data): |
383 | 381 | self.cancel() |
384 | 382 | self.Information.data_sampled.clear() |
385 | 383 | self.Error.train_data_empty.clear() |
386 | | - self.Error.class_required.clear() |
387 | | - self.Error.too_many_classes.clear() |
388 | | - self.Error.no_class_values.clear() |
389 | | - self.Error.only_one_class_var_value.clear() |
| 384 | + self.Error.data_error.clear() |
| 385 | + |
390 | 386 | if data is not None and not data: |
391 | 387 | self.Error.train_data_empty() |
392 | 388 | data = None |
393 | 389 | if data: |
394 | | - conds = [not data.domain.class_vars, |
395 | | - len(data.domain.class_vars) > 1, |
396 | | - np.isnan(data.Y).all(), |
397 | | - data.domain.has_discrete_class and len(data.domain.class_var.values) == 1] |
398 | | - errors = [self.Error.class_required, |
399 | | - self.Error.too_many_classes, |
400 | | - self.Error.no_class_values, |
401 | | - self.Error.only_one_class_var_value] |
402 | | - for cond, error in zip(conds, errors): |
| 390 | + data_errors = [ |
| 391 | + ( |
| 392 | + "Train data input requires a target variable.", |
| 393 | + not data.domain.class_vars |
| 394 | + ), |
| 395 | + ("Too many target variables.", len(data.domain.class_vars) > 1), |
| 396 | + ("Target variable has no values.", np.isnan(data.Y).all()), |
| 397 | + ( |
| 398 | + "Target variable has only one value.", |
| 399 | + data.domain.has_discrete_class and len(unique(data.Y)) < 2 |
| 400 | + ), |
| 401 | + ("Data has no features to learn from.", data.X.shape[1] == 0), |
| 402 | + ] |
| 403 | + |
| 404 | + for error_msg, cond in data_errors: |
403 | 405 | if cond: |
404 | | - error() |
| 406 | + self.Error.data_error(error_msg) |
405 | 407 | data = None |
406 | 408 | break |
407 | 409 |
|
|
0 commit comments