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

