You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Keras与scikit-learn中MLP回归器的损失值及精度差异问题

差异核心原因
  • 初始化参数不对齐:Scikit-learn的MLPRegressor默认偏置项初始化为全0,你提供的Keras代码里偏置使用了glorot_uniform初始化,不合理的初始化会直接导致模型收敛效果变差。
  • 梯度更新粒度不对齐:Scikit-learn的MLPRegressor默认batch_size为auto,逻辑是取min(200, 训练样本数),如果你的训练样本数小于200,sklearn实际使用全量训练集做批量梯度下降,和Keras设置的batch_size=200的小批量梯度下降的梯度更新方向、收敛路径完全不同,最终收敛的权重也会有明显差异。
  • 损失统计口径不对齐:Keras训练时输出的损失值包含了你额外添加的L2正则项的惩罚值,而Scikit-learn默认打印的损失、计算的精度都是纯MSE/MAE值,不包含正则项,直接对比训练输出的损失值天然就会出现Keras损失更高的情况。
  • 训练停止逻辑不对齐:Scikit-learn的MLPRegressor默认开启n_iter_no_change=10逻辑,也就是连续10轮训练损失下降幅度小于tol=1e-4就会提前停止训练,避免过拟合,而你写的Keras代码是硬跑满1000轮,很容易出现过拟合导致精度下降。
Keras精度优化方案
  • 第一步先对齐基础参数,先跑平基线
    1. 修正Keras的偏置初始化,去掉所有bias_initializer="glorot_uniform"配置,使用默认的全0初始化,和Scikit-learn对齐。
    2. 对齐batch_size配置,如果要和Scikit-learn默认逻辑对齐,将Keras的batch_size设置为min(200, 训练样本数);如果要自定义批量大小,同步给Scikit-learn的MLPRegressor加上对应值的batch_size参数即可。
    3. 对齐正则规则:Scikit-learn的L2正则默认同时作用于权重和偏置,你可以选择给Keras的Dense层增加bias_regularizer=keras.regularizers.L2(.0001),也可以暂时去掉所有正则项跑无正则的基线对比。
  • 第二步对齐训练逻辑
    1. 给Keras的fit方法加入早停回调,配置keras.callbacks.EarlyStopping(patience=10, min_delta=1e-4),和Scikit-learn的停止逻辑保持一致,避免过拟合。
    2. 保证二者使用完全相同的训练集、验证集拆分,不要出现Scikit-learn做了拆分、Keras用全量数据训练的情况。
  • 第三步修正指标对比逻辑
    不要直接用Keras训练过程输出的损失值做对比,训练结束后单独计算纯指标:用sklearn.metrics.mean_absolute_error(y, model.predict(X))、sklearn.metrics.mean_squared_error(y, model.predict(X))计算Keras模型的实际精度,和Scikit-learn的输出做对比。
  • 进阶优化
    可以额外添加keras.callbacks.ReduceLROnPlateau回调,在损失长期不下降时自动降低学习率,进一步提升模型收敛效果。

内容的提问来源于stack exchange,提问作者Ross

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 18:09:02