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
相关产品推荐
相关产品推荐

