早停#
在本教程中,我们将介绍如何在OpenBox中使用早停算法(Early Stopping, ES)。 在OpenBox中,早停算法通过监控优化过程的进展,并在满足特定条件时提前结束优化,以节省计算资源。 目前早停算法仅适用于单目标优化。
早停策略#
OpenBox中的早停算法主要基于两个策略:
无改进轮数(No Improvement Rounds): 如果在一定数量的连续优化轮数内没有观察到任何改进,则触发早停。
提升阈值(Improvement Threshold): 如果期望提升(Expected Improvement,EI)小于特定阈值,则触发早停,说明当前情况下预期改进不足以被认为应该继续优化。 注意,使用该策略时需要采集函数类型为EI (
acq_type='ei'
)。
使用方法#
在创建Optimizer
或Advisor
类时,通过设置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轮时,由于候选配置的期望提升小于设定阈值,发生早停。
我们可以将不启用和启动早停的两个收敛曲线进行对比,发现在该早停配置下有效的提前结束了优化。
不同的早停配置会对停止轮数和效果产生影响,如设置max_no_improvement_rounds=20
, min_improvement_percentage=0.02
(其余配置与上述相同),得到的早停输出如下:
[Early Stop] No improvement over 21 rounds!
Early stop triggered at iter 59!
说明在59轮时,发现目标函数未改进轮数超过阈值,发生早停。
与不启用早停的收敛曲线进行对比,结果如下: