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

scikit-learn中RMSE评分器为何返回MSE值?

问题解答

你遇到的核心问题是错误地直接访问了scikit-learn评分器的私有内部属性_score_func,这并不是评分器的正确使用方式。

为什么会出现返回结果一致的现象?

neg_root_mean_squared_error评分器的底层确实依赖mean_squared_error函数,但评分器会封装额外的参数逻辑(比如squared=False)和符号处理。直接调用_score_func时,并没有传入这些预设的参数,所以默认使用squared=True,得到的就是MSE值,和neg_mean_squared_error的_score_func行为一致。

正确使用评分器的方式

要获取正确的RMSE(或负RMSE)结果,应该调用评分器的score()方法,或者直接使用对应的度量函数并传入完整参数:

方式1:使用评分器的score()方法

from sklearn.metrics import get_scorer
x = [1, 1, 1]
y = [1, 3, 3]

# 获取负RMSE评分器
rmse_scorer = get_scorer('neg_root_mean_squared_error')
# 用dummy模型模拟预测逻辑
class DummyModel:
    def predict(self, X):
        return X

model = DummyModel()
print(rmse_scorer.score(model, [[1],[1],[1]], y))  # 输出:-2.0(对应RMSE=2.0)

# 对比MSE评分器
mse_scorer = get_scorer('neg_mean_squared_error')
print(mse_scorer.score(model, [[1],[1],[1]], y))  # 输出:-4.0(对应MSE=4.0)

方式2:直接调用度量函数

from sklearn.metrics import mean_squared_error
x = [1, 1, 1]
y = [1, 3, 3]

rmse = mean_squared_error(x, y, squared=False)
print(rmse)  # 输出:2.0

mse = mean_squared_error(x, y, squared=True)
print(mse)  # 输出:4.0

关键细节

  • scikit-learn中以下划线开头的属性(如_score_func)是私有内部实现,不应该被外部代码直接依赖,不同版本可能会修改这些内部逻辑。
  • 带neg_前缀的评分器返回的是对应度量的负值,因为scikit-learn的模型选择逻辑默认是“分数越高越好”,而RMSE/MSE是越小越好,所以取负值转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:41:06