From 927c316aeb0a948e9635c1ffe54d5e6ed25f6797 Mon Sep 17 00:00:00 2001 From: Jiaming Yuan Date: Sat, 28 Nov 2020 14:18:33 -0500 Subject: [PATCH] Fix period in evaluation monitor. (#6441) --- python-package/xgboost/callback.py | 2 +- tests/python/test_callback.py | 36 +++++++++++++++++------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/python-package/xgboost/callback.py b/python-package/xgboost/callback.py index b9583c381665..e15bf699febb 100644 --- a/python-package/xgboost/callback.py +++ b/python-package/xgboost/callback.py @@ -621,7 +621,7 @@ def after_iteration(self, model, epoch, evals_log): msg += self._fmt_metric(data, metric_name, score, stdv) msg += '\n' - if (epoch % self.period) != 0: + if (epoch % self.period) != 0 or self.period == 1: rabit.tracker_print(msg) self._latest = None else: diff --git a/tests/python/test_callback.py b/tests/python/test_callback.py index e1c5feee0b79..bdae94f87390 100644 --- a/tests/python/test_callback.py +++ b/tests/python/test_callback.py @@ -22,38 +22,44 @@ def setup_class(cls): cls.X_valid = X[split:, ...] cls.y_valid = y[split:, ...] - def test_evaluation_monitor(self): - D_train = xgb.DMatrix(self.X_train, self.y_train) - D_valid = xgb.DMatrix(self.X_valid, self.y_valid) + def run_evaluation_monitor(self, D_train, D_valid, rounds, verbose_eval): evals_result = {} - rounds = 10 - xgb.train({'objective': 'binary:logistic', - 'eval_metric': 'error'}, D_train, - evals=[(D_train, 'Train'), (D_valid, 'Valid')], - num_boost_round=rounds, - evals_result=evals_result, - verbose_eval=True) - assert len(evals_result['Train']['error']) == rounds - assert len(evals_result['Valid']['error']) == rounds - with tm.captured_output() as (out, err): xgb.train({'objective': 'binary:logistic', 'eval_metric': 'error'}, D_train, evals=[(D_train, 'Train'), (D_valid, 'Valid')], num_boost_round=rounds, evals_result=evals_result, - verbose_eval=2) + verbose_eval=verbose_eval) output: str = out.getvalue().strip() pos = 0 msg = 'Train-error' - for i in range(rounds // 2): + for i in range(rounds // int(verbose_eval)): pos = output.find('Train-error', pos) assert pos != -1 pos += len(msg) assert output.find('Train-error', pos) == -1 + + def test_evaluation_monitor(self): + D_train = xgb.DMatrix(self.X_train, self.y_train) + D_valid = xgb.DMatrix(self.X_valid, self.y_valid) + evals_result = {} + rounds = 10 + xgb.train({'objective': 'binary:logistic', + 'eval_metric': 'error'}, D_train, + evals=[(D_train, 'Train'), (D_valid, 'Valid')], + num_boost_round=rounds, + evals_result=evals_result, + verbose_eval=True) + assert len(evals_result['Train']['error']) == rounds + assert len(evals_result['Valid']['error']) == rounds + + self.run_evaluation_monitor(D_train, D_valid, rounds, 2) + self.run_evaluation_monitor(D_train, D_valid, rounds, True) + def test_early_stopping(self): D_train = xgb.DMatrix(self.X_train, self.y_train) D_valid = xgb.DMatrix(self.X_valid, self.y_valid)