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

Python中均方根误差(RMSE)计算结果不一致的原因探究

Python中RMSE计算结果差异的原因分析

我在Python中用不同方式计算均方根误差(RMSE)时,发现结果存在差异,猜测原因可能是:

  • 舍入误差
  • 统计方法差异(如样本与总体的区别)

测试代码

import numpy as np
import pandas as pd
import statsmodels.api as sm
from statsmodels.tools.tools import add_constant
from sklearn.metrics import mean_squared_error
data = sm.datasets.strikes.load_pandas()
X = data.data['duration']
y = data.data['iprod']
X = add_constant(X)
model = sm.OLS(y, X)
results = model.fit()
a = np.sqrt(results.mse_resid)
b = np.sqrt(np.dot(results.resid, results.resid) / len(results.resid))
c = np.sqrt(np.square(results.resid).mean())
d = np.sqrt(1 - results.rsquared_adj)*y.std()
e = np.sqrt(mean_squared_error(results.fittedvalues, y))
f = np.sqrt( (np.linalg.norm(results.fittedvalues - y)**2)/len(y) )
print("\n a = ", a, "\n b = ", b, "\n c = ", c, "\n d = ", d, "\n e = ", e, "\n f = ", f)

运行结果

a =  0.043831898071428385 
 b =  0.043119136780037336 
 c =  0.043119136780037336 
 d =  0.043831898071428385 
 e =  0.043119136780037336 
 f =  0.043119136780037336

差异原因解析

结果中a和d的值一致,b、c、e、f的值一致,差异核心在于样本RMSE和总体RMSE的计算区别:

  • results.mse_resid是statsmodels中OLS模型的均方误差(MSE),计算时使用自由度调整后的除数:sum(resid^2)/(n - k),其中n是样本量,k是模型参数个数(本次实验中k=2,因添加了常数项)。对其开根号得到的是样本RMSE,用于估计总体RMSE。
  • rsquared_adj是调整后的R平方,推导过程中同样使用了自由度调整,因此sqrt(1 - rsquared_adj)*y.std()的结果和a完全一致。
  • 而b、c、e、f的计算都是直接用残差平方和除以样本量n,得到的是总体RMSE的有偏估计,即基于当前样本直接计算的RMSE,未做自由度调整。

舍入误差并非本次差异的主要原因,所有计算基于同一组残差,精度差异可忽略。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:33:20