使用RandomizedSearchCV训练MLPRegressor遇float64数值异常错误
错误成因分析
以下是导致该错误的几种常见原因:
超参数搜索范围引发数值异常
RandomizedSearchCV的参数空间中可能包含会导致MLP训练过程数值溢出/不稳定的组合:- 比如
learning_rate_init设置过大,会让权重更新幅度过大,直接产生无穷大值; alpha(L2正则化系数)设置过小,无法约束权重的极端变化;hidden_layer_sizes设置得过于庞大,计算过程中出现浮点溢出。
你单独用的参数组合是稳定的,但搜索空间里的其他组合可能触发数值问题,进而在交叉验证的某一轮训练中抛出错误。
- 比如
未正确处理交叉验证中的数据标准化
如果你是先对整个x_train做StandardScaler标准化,再传入RandomizedSearchCV,会导致数据泄露:交叉验证时的验证集数据信息会提前融入标准化过程,部分折的训练数据分布可能出现异常,结合某些超参数组合就会引发数值问题。正确的做法是用Pipeline将StandardScaler和MLPRegressor封装在一起,让每个交叉验证折单独执行标准化:from sklearn.pipeline import Pipeline pipeline = Pipeline([ ('scaler', StandardScaler()), ('mlp', MLPRegressor()) ]) # 然后用pipeline作为RandomizedSearchCV的estimator超参数组合不兼容
参数空间中可能存在与MLPRegressor逻辑不兼容的组合:- 比如为
solver='adam'搭配了仅适用于solver='sgd'的learning_rate='invscaling'或power_t参数; - 选择
tanh激活函数时搭配过高的学习率,容易引发梯度爆炸,产生无穷值。
这些不兼容组合会在训练过程中触发数值计算异常。
- 比如为
训练过程中的数值不稳定
部分超参数组合下,MLP的训练可能无法稳定收敛:max_iter设置过小,模型在未收敛前就出现数值发散;batch_size过小,加上高学习率,导致权重更新波动剧烈,出现极端值。
内容的提问来源于stack exchange,提问作者user17637519
相关产品推荐
相关产品推荐

