|
1 | 1 | from collections import OrderedDict |
2 | 2 | import io |
| 3 | +import itertools |
3 | 4 | import os |
4 | 5 | from typing import Any, List, Optional, Set, Tuple, Union, TYPE_CHECKING # noqa F401 |
5 | 6 | import warnings |
@@ -395,125 +396,119 @@ def _run_task_get_arffcontent( |
395 | 396 | # TODO use different iterator to only provide a single iterator (less |
396 | 397 | # methods, less maintenance, less confusion) |
397 | 398 | num_reps, num_folds, num_samples = task.get_split_dimensions() |
398 | | - classes = None |
399 | | - |
400 | | - n_fit = 0 |
401 | | - for rep_no in range(num_reps): |
402 | | - for fold_no in range(num_folds): |
403 | | - for sample_no in range(num_samples): |
404 | | - n_fit += 1 |
405 | | - |
406 | | - train_indices, test_indices = task.get_train_test_split_indices( |
407 | | - repeat=rep_no, fold=fold_no, sample=sample_no) |
408 | | - if isinstance(task, OpenMLSupervisedTask): |
409 | | - x, y = task.get_X_and_y(dataset_format='array') |
410 | | - train_x = x[train_indices] |
411 | | - train_y = y[train_indices] |
412 | | - test_x = x[test_indices] |
413 | | - test_y = y[test_indices] |
414 | | - if isinstance(task, (OpenMLClassificationTask, OpenMLClassificationTask)): |
415 | | - classes = task.class_labels |
416 | | - elif isinstance(task, OpenMLClusteringTask): |
417 | | - x = task.get_X(dataset_format='array') |
418 | | - train_x = train_indices |
419 | | - train_y = None |
420 | | - test_x = test_indices |
421 | | - test_y = None |
422 | | - else: |
423 | | - raise NotImplementedError(task.task_type) |
424 | | - |
425 | | - config.logger.info( |
426 | | - "Going to execute flow '%s' on task %d for repeat %d fold %d sample %d.", |
427 | | - flow.name, task.task_id, rep_no, fold_no, sample_no, |
428 | | - ) |
429 | 399 |
|
430 | | - ( |
431 | | - pred_y, |
432 | | - proba_y, |
433 | | - user_defined_measures_fold, |
434 | | - trace, |
435 | | - ) = extension._run_model_on_fold( |
436 | | - model=model, |
437 | | - task=task, |
438 | | - X_train=train_x, |
439 | | - y_train=train_y, |
440 | | - rep_no=rep_no, |
441 | | - fold_no=fold_no, |
442 | | - X_test=test_x, |
| 400 | + for n_fit, (rep_no, fold_no, sample_no) in enumerate(itertools.product( |
| 401 | + range(num_reps), |
| 402 | + range(num_folds), |
| 403 | + range(num_samples), |
| 404 | + )): |
| 405 | + |
| 406 | + train_indices, test_indices = task.get_train_test_split_indices( |
| 407 | + repeat=rep_no, fold=fold_no, sample=sample_no) |
| 408 | + if isinstance(task, OpenMLSupervisedTask): |
| 409 | + x, y = task.get_X_and_y(dataset_format='array') |
| 410 | + train_x = x[train_indices] |
| 411 | + train_y = y[train_indices] |
| 412 | + test_x = x[test_indices] |
| 413 | + test_y = y[test_indices] |
| 414 | + elif isinstance(task, OpenMLClusteringTask): |
| 415 | + x = task.get_X(dataset_format='array') |
| 416 | + train_x = x[train_indices] |
| 417 | + train_y = None |
| 418 | + test_x = None |
| 419 | + test_y = None |
| 420 | + else: |
| 421 | + raise NotImplementedError(task.task_type) |
| 422 | + |
| 423 | + config.logger.info( |
| 424 | + "Going to execute flow '%s' on task %d for repeat %d fold %d sample %d.", |
| 425 | + flow.name, task.task_id, rep_no, fold_no, sample_no, |
| 426 | + ) |
| 427 | + |
| 428 | + ( |
| 429 | + pred_y, |
| 430 | + proba_y, |
| 431 | + user_defined_measures_fold, |
| 432 | + trace, |
| 433 | + ) = extension._run_model_on_fold( |
| 434 | + model=model, |
| 435 | + task=task, |
| 436 | + X_train=train_x, |
| 437 | + y_train=train_y, |
| 438 | + rep_no=rep_no, |
| 439 | + fold_no=fold_no, |
| 440 | + X_test=test_x, |
| 441 | + ) |
| 442 | + if trace is not None: |
| 443 | + traces.append(trace) |
| 444 | + |
| 445 | + # add client-side calculated metrics. These is used on the server as |
| 446 | + # consistency check, only useful for supervised tasks |
| 447 | + def _calculate_local_measure(sklearn_fn, openml_name): |
| 448 | + user_defined_measures_fold[openml_name] = sklearn_fn(test_y, pred_y) |
| 449 | + |
| 450 | + if isinstance(task, (OpenMLClassificationTask, OpenMLLearningCurveTask)): |
| 451 | + |
| 452 | + for i in range(0, len(test_indices)): |
| 453 | + |
| 454 | + arff_line = [rep_no, fold_no, sample_no, i] # type: List[Any] |
| 455 | + for j, class_label in enumerate(task.class_labels): |
| 456 | + arff_line.append(proba_y[i][j]) |
| 457 | + |
| 458 | + arff_line.append(task.class_labels[pred_y[i]]) |
| 459 | + arff_line.append(task.class_labels[test_y[i]]) |
| 460 | + |
| 461 | + arff_datacontent.append(arff_line) |
| 462 | + |
| 463 | + if add_local_measures: |
| 464 | + _calculate_local_measure( |
| 465 | + sklearn.metrics.accuracy_score, |
| 466 | + 'predictive_accuracy', |
443 | 467 | ) |
444 | 468 |
|
445 | | - arff_datacontent_fold = [] # type: List[List] |
446 | | - if trace is not None: |
447 | | - traces.append(trace) |
448 | | - |
449 | | - # add client-side calculated metrics. These is used on the server as |
450 | | - # consistency check, only useful for supervised tasks |
451 | | - def _calculate_local_measure(sklearn_fn, openml_name): |
452 | | - user_defined_measures_fold[openml_name] = sklearn_fn(test_y, pred_y) |
453 | | - |
454 | | - if isinstance(task, (OpenMLClassificationTask, OpenMLLearningCurveTask)): |
455 | | - |
456 | | - for i in range(0, len(test_indices)): |
457 | | - |
458 | | - arff_line = [rep_no, fold_no, sample_no, i] # type: List[Any] |
459 | | - for j, class_label in enumerate(task.class_labels): |
460 | | - arff_line.append(proba_y[i][j]) |
461 | | - |
462 | | - arff_line.append(task.class_labels[pred_y[i]]) |
463 | | - arff_line.append(task.class_labels[test_y[i]]) |
| 469 | + elif isinstance(task, OpenMLRegressionTask): |
464 | 470 |
|
465 | | - arff_datacontent.append(arff_line) |
| 471 | + for i in range(0, len(test_indices)): |
| 472 | + arff_line = [rep_no, fold_no, test_indices[i], pred_y[i], test_y[i]] |
| 473 | + arff_datacontent.append(arff_line) |
466 | 474 |
|
467 | | - if add_local_measures: |
468 | | - _calculate_local_measure( |
469 | | - sklearn.metrics.accuracy_score, |
470 | | - 'predictive_accuracy', |
471 | | - ) |
472 | | - |
473 | | - elif isinstance(task, OpenMLRegressionTask): |
474 | | - |
475 | | - for i in range(0, len(test_indices)): |
476 | | - arff_line = [rep_no, fold_no, test_indices[i], pred_y[i], test_y[i]] |
477 | | - arff_datacontent.append(arff_line) |
478 | | - |
479 | | - if add_local_measures: |
480 | | - _calculate_local_measure( |
481 | | - sklearn.metrics.mean_absolute_error, |
482 | | - 'mean_absolute_error', |
483 | | - ) |
| 475 | + if add_local_measures: |
| 476 | + _calculate_local_measure( |
| 477 | + sklearn.metrics.mean_absolute_error, |
| 478 | + 'mean_absolute_error', |
| 479 | + ) |
484 | 480 |
|
485 | | - elif isinstance(task, OpenMLClusteringTask): |
486 | | - for i in range(0, len(test_indices)): |
487 | | - arff_line = [test_indices[i], pred_y[i]] # row_id, cluster ID |
488 | | - arff_datacontent.append(arff_line) |
| 481 | + elif isinstance(task, OpenMLClusteringTask): |
| 482 | + for i in range(0, len(test_indices)): |
| 483 | + arff_line = [test_indices[i], pred_y[i]] # row_id, cluster ID |
| 484 | + arff_datacontent.append(arff_line) |
489 | 485 |
|
490 | | - else: |
491 | | - raise TypeError(type(task)) |
492 | | - |
493 | | - arff_datacontent.extend(arff_datacontent_fold) |
| 486 | + else: |
| 487 | + raise TypeError(type(task)) |
494 | 488 |
|
495 | | - for measure in user_defined_measures_fold: |
| 489 | + for measure in user_defined_measures_fold: |
496 | 490 |
|
497 | | - if measure not in user_defined_measures_per_fold: |
498 | | - user_defined_measures_per_fold[measure] = OrderedDict() |
499 | | - if rep_no not in user_defined_measures_per_fold[measure]: |
500 | | - user_defined_measures_per_fold[measure][rep_no] = OrderedDict() |
| 491 | + if measure not in user_defined_measures_per_fold: |
| 492 | + user_defined_measures_per_fold[measure] = OrderedDict() |
| 493 | + if rep_no not in user_defined_measures_per_fold[measure]: |
| 494 | + user_defined_measures_per_fold[measure][rep_no] = OrderedDict() |
501 | 495 |
|
502 | | - if measure not in user_defined_measures_per_sample: |
503 | | - user_defined_measures_per_sample[measure] = OrderedDict() |
504 | | - if rep_no not in user_defined_measures_per_sample[measure]: |
505 | | - user_defined_measures_per_sample[measure][rep_no] = OrderedDict() |
506 | | - if fold_no not in user_defined_measures_per_sample[ |
507 | | - measure][rep_no]: |
508 | | - user_defined_measures_per_sample[measure][rep_no][fold_no] = OrderedDict() |
| 496 | + if measure not in user_defined_measures_per_sample: |
| 497 | + user_defined_measures_per_sample[measure] = OrderedDict() |
| 498 | + if rep_no not in user_defined_measures_per_sample[measure]: |
| 499 | + user_defined_measures_per_sample[measure][rep_no] = OrderedDict() |
| 500 | + if fold_no not in user_defined_measures_per_sample[measure][rep_no]: |
| 501 | + user_defined_measures_per_sample[measure][rep_no][fold_no] = OrderedDict() |
509 | 502 |
|
510 | | - user_defined_measures_per_fold[measure][rep_no][ |
511 | | - fold_no] = user_defined_measures_fold[measure] |
512 | | - user_defined_measures_per_sample[measure][rep_no][fold_no][ |
513 | | - sample_no] = user_defined_measures_fold[measure] |
| 503 | + user_defined_measures_per_fold[measure][rep_no][fold_no] = ( |
| 504 | + user_defined_measures_fold[measure] |
| 505 | + ) |
| 506 | + user_defined_measures_per_sample[measure][rep_no][fold_no][sample_no] = ( |
| 507 | + user_defined_measures_fold[measure] |
| 508 | + ) |
514 | 509 |
|
515 | 510 | if len(traces) > 0: |
516 | | - if len(traces) != n_fit: |
| 511 | + if len(traces) != n_fit + 1: |
517 | 512 | raise ValueError( |
518 | 513 | 'Did not find enough traces (expected {}, found {})'.format(n_fit, len(traces)) |
519 | 514 | ) |
|
0 commit comments