在统计学和机器学习领域做拟合等其他操作时,如何判断真实值与拟合值的贴合程度?本文介绍5个参数以供参考。
先随机生成一组随机数并拟合(不严格拟合,仅作解释变量用),拟合结果如下图所示
import matplotlib.pyplot as plt
import numpy as np
x=np.arange(1,51)
y=x+np.round(np.random.uniform(-5, 5, 50), 2)
plt.plot(x,x,color='r')
plt.plot(x,y,color='b')
plt.show()
判断拟合结果如何最直接的参数是,由TSS、ESS、RSS结合运算得到,计算过程如下:
设为真实值,也是待拟合值(上图中蓝线),
为所有真实值的均值,
为预测值(上图中红线),即可得
总体平方和TTS(Total Sum of Squares)
解释平方和ESS (Explained Sum of Squares)
残差平方和RSS(Residual Sum of Squares)
拟合优度 (R-squared)
当拟合程度越好时,TSS越大,ESS越大,RSS越小。
TSS反映了数据的总变异,模型能够解释的方差越多,TSS就越大。
ESS反映了模型对数据变异的解释能力,模型越能够解释数据,ESS就越大。
RSS衡量了模型预测误差的总量,拟合得越好,残差就越小。
拟合优度 (R-squared)也称为决定系数,表示模型解释的数据方差比例,拟合优度越接近1,模型对数据的解释能力越强,拟合越好。
python代码实现过程如下
def compute_R_square(data_real,data_pred):
#计算真实值平均值
y_mean=sum(data_real)/len(data_real)
# 循环求解TTS
TSS=0
for temp in data_real:#遍历每一个真实值
TSS=TSS+(temp-y_mean)**2
#循环求解ESS
ESS=0
for temp in data_pred:
ESS=ESS+(temp-y_mean)**2
#循环求解RSS
temp_real_pred=data_real-data_pred
#计算拟合优度R方
RSS = sum(x ** 2 for x in temp_real_pred)
R_square=ESS/TSS
return TSS,ESS,RSS,R_square
将真实值带入得到最终结果
y_TSS,y_ESS,y_RSS,y_R_square=compute_R_square(y,x)
print(y_TSS,y_ESS,y_RSS,y_R_square)
11065.547048 10416.845352000002 397.7123999999999 0.9413764459013126
得最终
调整后拟合优度 (Adjusted R-squared)考虑了模型自由度对拟合优度的影响,其会在模型增加自变量但增加的拟合优度并不显著时进行惩罚,拟合越好,调整后拟合优度越大,但通常不会超过,因为考虑了模型的复杂度。
主要区别总结:
- R-squared衡量模型解释因变量变化的能力,但不考虑模型复杂度。
- Adjusted R-squared在计算时考虑了模型的复杂度,通过减去自由度的惩罚项来避免因模型复杂度增加而导致的不合理的优化。
因此,一般来说,当比较不同模型时,调整后拟合优度更适合用作评估标准,因为它可以更准确地反映模型的预测能力,避免了过度拟合的可能性。
调整后拟合优度等式及代码:
#n为样本数量,k为自变量个数,R_square为拟合优度
def compute_Adjust_R_square(n,k,R_square):
Adjust_R_square=1-(1-R_square)*(n-1)/(n-k-1)
return Adjust_R_square
得到结果:
0.94015512185759
由于示范数据为随机生成,每次所得到的数据不同,所以若有读者运行代码得到的数值不同为正常情况。