|
| 1 | +import os |
| 2 | +import tempfile |
| 3 | +import unittest |
| 4 | + |
| 5 | +import pandas as pd |
| 6 | +from smac.callbacks import IncorporateRunResultCallback |
| 7 | +from smac.optimizer.smbo import SMBO |
| 8 | +from smac.runhistory.runhistory import RunInfo, RunValue |
| 9 | +from smac.tae.base import StatusType |
| 10 | + |
| 11 | +import autosklearn.pipeline.util as putil |
| 12 | +from autosklearn.classification import AutoSklearnClassifier |
| 13 | + |
| 14 | + |
| 15 | +class AutoMLTrialsCallBack(IncorporateRunResultCallback): |
| 16 | + |
| 17 | + def __init__(self, fname): |
| 18 | + self.trials_num = 1 |
| 19 | + self.fname = fname |
| 20 | + with open(fname, "w") as fp: |
| 21 | + fp.write("TrialNo, " |
| 22 | + "StartTime, " |
| 23 | + "EndTime, " |
| 24 | + "Status, " |
| 25 | + "TrainLoss, " |
| 26 | + "ValidLoss, " |
| 27 | + "TestLoss, " |
| 28 | + "Classifier") |
| 29 | + |
| 30 | + def __call__( |
| 31 | + self, smbo: 'SMBO', |
| 32 | + run_info: RunInfo, |
| 33 | + result: RunValue, |
| 34 | + time_left: float, |
| 35 | + ) -> None: |
| 36 | + train_loss, valid_loss, test_loss = None, None, None |
| 37 | + trial_start_time = result.starttime |
| 38 | + trial_end_time = result.endtime |
| 39 | + trial_status = result.status.name |
| 40 | + if trial_status == StatusType.SUCCESS.name: |
| 41 | + train_loss = result.additional_info.get('train_loss') |
| 42 | + valid_loss = result.cost |
| 43 | + test_loss = result.additional_info.get('test_loss') |
| 44 | + trial_classifier = run_info.config.get_dictionary()['classifier:__choice__'] |
| 45 | + with open(self.fname, "a+") as fp: |
| 46 | + fp.write(f"\n {self.trials_num}, {trial_start_time}, {trial_end_time}, {trial_status}, " |
| 47 | + f"{train_loss}, {valid_loss}, {test_loss}, {trial_classifier}") |
| 48 | + self.trials_num += 1 |
| 49 | + |
| 50 | + |
| 51 | +class VerifyTrialsCallBack(unittest.TestCase): |
| 52 | + |
| 53 | + def test_trials_callback_execution(self): |
| 54 | + trials_summary_fname = os.path.join(tempfile.gettempdir(), "trials.csv") |
| 55 | + X_train, Y_train, X_test, Y_test = putil.get_dataset('breast_cancer') |
| 56 | + cls = AutoSklearnClassifier(time_left_for_this_task=30, |
| 57 | + initial_configurations_via_metalearning=0, |
| 58 | + per_run_time_limit=10, |
| 59 | + memory_limit=1024, |
| 60 | + delete_tmp_folder_after_terminate=False, |
| 61 | + n_jobs=1, |
| 62 | + include_estimators=["sgd"], |
| 63 | + include_preprocessors=["no_preprocessing"], |
| 64 | + get_trials_callback=AutoMLTrialsCallBack(trials_summary_fname) |
| 65 | + ) |
| 66 | + cls.fit(X_train, Y_train, X_test, Y_test) |
| 67 | + trials = pd.read_csv(trials_summary_fname) |
| 68 | + assert trials.shape[0] > 0, f"Auto-Sklearn explored {trials.shape[0] - 1} trials" |
0 commit comments