从Sci-Keras导入KerasRegressor后cross_val_score结果变动如何解读
问题原因与解决方法
核心原因:默认评分指标发生变化
旧版 keras.wrappers.scikit_learn.KerasRegressor 的 score 方法默认返回负均方误差(Negative MSE),这也是你最初得到的结果都是负数、绝对值对应MSE的原因。
而 SciKeras 提供的 scikeras.wrappers.KerasRegressor 的 score 方法默认返回决定系数R²:
- R²的取值范围为(-∞, 1],越接近1代表模型拟合效果越好,接近0代表模型拟合效果和直接预测目标值的均值没有差异
- 你新得到的结果全部落在-0.03到0.28区间,完全符合R²的数值特征,本质上不是MSE,属于对输出指标的误解
其他可能的影响因素
- 目标值自动预处理逻辑差异:SciKeras 内置了可选的目标值缩放逻辑,如果你没有显式设置
y_scaler=None,部分版本会默认对y做标准化处理,直接输出的原始MSE也会被缩放至很小的范围 - 模型编译逻辑差异:如果你的
baseline_model没有在内部完成编译,旧版KerasRegressor会默认用MSE作为损失,SciKeras的编译逻辑和参数传递规则略有区别,可能出现损失函数不匹配的问题
解决方法
- 如果你需要得到和旧版完全一致的负MSE输出,在调用交叉验证工具(如
cross_val_score)时显式指定评分规则:
from sklearn.model_selection import cross_val_score scores = cross_val_score(pipe, X, y, scoring='neg_mean_squared_error', cv=10)
- 如果你要统一KerasRegressor本身的输出逻辑,可以在初始化时显式指定评分函数,或者关闭自动缩放:
KerasRegressor( model=baseline_model, epochs=20, batch_size=50, verbose=0, y_scaler=None, # 关闭目标值自动缩放 score=lambda y_true, y_pred: -((y_true - y_pred)**2).mean() # 自定义返回负MSE )
内容的提问来源于stack exchange,提问作者Andrew Johnson
相关产品推荐
相关产品推荐

