早停#

在本教程中,我们将介绍如何在OpenBox中使用早停算法(Early Stopping, ES)。 在OpenBox中,早停算法通过监控优化过程的进展,并在满足特定条件时提前结束优化,以节省计算资源。 目前早停算法仅适用于单目标优化。

早停策略#

OpenBox中的早停算法主要基于两个策略:

  1. 无改进轮数(No Improvement Rounds): 如果在一定数量的连续优化轮数内没有观察到任何改进,则触发早停。

  2. 提升阈值(Improvement Threshold): 如果期望提升(Expected Improvement,EI)小于特定阈值,则触发早停,说明当前情况下预期改进不足以被认为应该继续优化。 注意,使用该策略时需要采集函数类型为EI (acq_type='ei')。

使用方法#

在创建OptimizerAdvisor类时,通过设置early_stop=True启用早停策略。 启用后,向early_stop_kwargs传入含参数的字典用于配置早停额外选项:

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模型的参数,并启用早停策略。

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轮时,由于候选配置的期望提升小于设定阈值,发生早停。

我们可以将不启用和启动早停的两个收敛曲线进行对比,发现在该早停配置下有效的提前结束了优化。

../_images/es_percent_convergence.png

不同的早停配置会对停止轮数和效果产生影响,如设置max_no_improvement_rounds=20, min_improvement_percentage=0.02 (其余配置与上述相同),得到的早停输出如下:

[Early Stop] No improvement over 21 rounds!
Early stop triggered at iter 59!

说明在59轮时,发现目标函数未改进轮数超过阈值,发生早停。

与不启用早停的收敛曲线进行对比,结果如下:

../_images/es_round_convergence.png