# 早停 在本教程中,我们将介绍如何在**OpenBox**中使用早停算法(Early Stopping, ES)。 在OpenBox中,早停算法通过监控优化过程的进展,并在满足特定条件时提前结束优化,以节省计算资源。 目前早停算法仅适用于单目标优化。 ## 早停策略 OpenBox中的早停算法主要基于两个策略: 1. **无改进轮数(No Improvement Rounds)**: 如果在一定数量的连续优化轮数内没有观察到任何改进,则触发早停。 2. **提升阈值(Improvement Threshold)**: 如果期望提升(Expected Improvement,EI)小于特定阈值,则触发早停,说明当前情况下预期改进不足以被认为应该继续优化。 注意,使用该策略时需要采集函数类型为EI (`acq_type='ei'`)。 ## 使用方法 在创建`Optimizer`或`Advisor`类时,通过设置`early_stop=True`启用早停策略。 启用后,向`early_stop_kwargs`传入含参数的字典用于配置早停额外选项: ```python opt = Optimizer( ..., early_stop=True, early_stop_kwargs=dict( min_iter=10, max_no_improvement_rounds=10, min_improvement_percentage=0.05, ), ) ``` 参数含义如下: - `min_iter` (int): 考虑早停之前的最小迭代次数。这确保了算法在考虑停止之前有足够的时间来探索配置空间。默认为10,范围应大于零。 - `max_no_improvement_rounds` (int): 允许的最大无改进轮数,用于无改进轮数早停策略。 如果连续多轮没有改进,则触发早停。默认值为10。如设置为0,则代表不启用该策略。 - `min_improvement_percentage` (float): 最小期望提升百分比,用于提升阈值早停策略。 如果期望提升小于`min_improvement_percentage * (当前最佳目标值 - 默认目标值)`,则触发早停。默认值为0.05。如设置为0,则代表不启用该策略。 ## LightGBM调优示例 在以下样例中,我们使用OpenBox来调优LightGBM模型的参数,并启用早停策略。 ```python from sklearn.model_selection import train_test_split from sklearn.datasets import load_digits from openbox import get_config_space, get_objective_function from openbox import Optimizer # prepare your data X, y = load_digits(return_X_y=True) x_train, x_val, y_train, y_val = train_test_split(X, y, test_size=0.2, stratify=y, random_state=1) # get config_space and objective_function config_space = get_config_space('lightgbm') objective_function = get_objective_function('lightgbm', x_train, x_val, y_train, y_val) opt = Optimizer( objective_function, config_space, max_runs=100, surrogate_type='prf', task_id='tuning_lightgbm', early_stop=True, early_stop_kwargs=dict( min_iter=10, max_no_improvement_rounds=30, min_improvement_percentage=0.05, ), random_state=1, ) history = opt.run() print(history) ``` 我们得到早停输出如下: ``` [Early Stop] EI less than the threshold! min_improvement_percentage=0.05, default_obj=0.03334620334620342, best_obj=0.022310167310167328, threshold=0.0005518018018018045, max_EI=0.0005186128080311961 Early stop triggered at iter 41! ``` 说明在41轮时,由于候选配置的期望提升小于设定阈值,发生早停。 我们可以将不启用和启动早停的两个收敛曲线进行对比,发现在该早停配置下有效的提前结束了优化。 不同的早停配置会对停止轮数和效果产生影响,如设置`max_no_improvement_rounds=20`, `min_improvement_percentage=0.02` (其余配置与上述相同),得到的早停输出如下: ``` [Early Stop] No improvement over 21 rounds! Early stop triggered at iter 59! ``` 说明在59轮时,发现目标函数未改进轮数超过阈值,发生早停。 与不启用早停的收敛曲线进行对比,结果如下: