如何通过Optuna trial设置sklearn MLPRegressor的hidden_layer_sizes参数
Optuna调优MLPRegressor隐藏层参数方案
场景1:固定隐藏层层数
如果已经确定使用固定数量的隐藏层(比如2层),只需分别为每一层定义神经元搜索参数,最后拼接为元组传入即可:
def objective(trial): # 第一层神经元搜索范围100-500,步长可按需调整 layer1_units = trial.suggest_int('layer1_units', 100, 500, step=10) # 第二层神经元搜索范围100-500 layer2_units = trial.suggest_int('layer2_units', 100, 500, step=10) hidden_layer_sizes = (layer1_units, layer2_units) # 初始化MLPRegressor模型 model = MLPRegressor( hidden_layer_sizes=hidden_layer_sizes, learning_rate_init = trial.suggest_float('learning_rate_init',0.0001, 0.1001, step=0.005) # 其他模型参数自行补充 ) # 后续模型训练、评估逻辑保持不变 # ...
场景2:同时优化隐藏层数量和每层神经元数
如果需要同时搜索隐藏层的层数(比如1~3层)和对应神经元数,可以先定义层数的搜索范围,循环生成每层的神经元参数后转成元组即可:
def objective(trial): # 搜索隐藏层层数,范围1-3层 n_layers = trial.suggest_int('n_layers', 1, 3) hidden_layer_list = [] for i in range(n_layers): # 每层神经元均在100-500区间搜索 units = trial.suggest_int(f'layer{i+1}_units', 100, 500, step=10) hidden_layer_list.append(units) # *必须转为元组格式才符合MLPRegressor的参数要求* hidden_layer_sizes = tuple(hidden_layer_list) # 初始化MLPRegressor模型 model = MLPRegressor( hidden_layer_sizes=hidden_layer_sizes, learning_rate_init = trial.suggest_float('learning_rate_init',0.0001, 0.1001, step=0.005) # 其他模型参数自行补充 ) # 后续模型训练、评估逻辑保持不变 # ...
补充说明
- 步长
step可根据算力情况调整,步长越大搜索效率越高,步长越小参数搜索粒度越细 - Optuna会自动为每层神经元生成独立的搜索空间,无需额外处理参数冲突问题
内容的提问来源于stack exchange,提问作者user88484
相关产品推荐
相关产品推荐

