R2分数与MSE:回归模型评估指标详解

3 阅读5分钟

R2分数与均方误差(MSE)详解

今天我们将介绍一些对于确定回归模型准确性和质量至关重要的术语:

  • 方差
  • R2分数
  • 均方误差

我们将使用scikit-learn来说明这些概念。(本文是scikit-learn指南系列文章的一部分。)

回归模型的应用方式

理解这些评估指标有助于确定回归模型的准确性或判断其是否具有误导性。运用回归这种统计技术可以帮助凸显数据中的模式、趋势和关系,从而提供对未来预测的洞察。您可以了解自变量如何影响因变量以及这些关系的强度。

能够洞察可能的未来趋势并理解其中的关联和依赖关系,对于规划各种场景以及评估和应对风险来说都是非常宝贵的。多个高风险行业广泛使用回归模型,包括:

  • 金融
  • 商业分析
  • 工程
  • 医疗保健
  • 科学
  • 体育
  • 计算机科学

为什么R2分数在机器学习中很重要

任何回归模型的价值都取决于其准确性,特别是它解释数据方差的能力。这就是为什么提升R2分数如此重要。机器学习和AI协同工作,用于识别正确的变量,微调模型以改进预测,并在庞大且复杂的非线性数据集中捕捉难以识别的关系。

AI和机器学习提升了模型拟合或解释数据变异的能力,使其预测更加准确。这减少了欠拟合(遗漏关键关系)和过拟合(引入无意义的噪声)的情况。它有助于选择恰当的变量,避免引入带来偏差或浪费冗余的变量。目标是创建一个能产生准确结果并支持更好预测的高效模型。

通过实例可以更生动地理解这些概念。我们将使用上一篇博客文章中的代码,并添加额外的逻辑。在上一篇文章中,我们让因变量y和自变量x相关联,以说明使用scikit-learn进行线性回归的基础知识。这次,我们将在因变量(y)中引入一些随机性,使预测出现一些误差。

什么是方差?

在线性回归中,方差是衡量观测值与预测值平均值之间差异程度的指标(即它们与预测值均值的差异)。目标是使这个值尽可能低,这可以通过R2分数来量化(下文解释)。在下面的代码中,这表示为np.var(err),其中err是一个包含观测值与预测值之间差异的数组,而np.var()是NumPy数组的方差函数。

什么是R2分数?

根据某百科的定义,R2分数是“……因变量中可由自变量预测的方差比例”。其数学定义为“(模型解释的总方差)/(总方差)”。因此,如果它是100%,则表示两个变量完全相关(即完全没有方差)。R2分数在0%到100%之间变化。它与MSE(见下文)密切相关,但并不相同。在大多数情况下,低值表示相关程度低,意味着回归模型无效。

阅读下面的代码,我们通过三个步骤进行计算,以便于理解。 首先,g是预测值与实际观测值之间差值的平方和:(ytest[i] – preds[i])²。 同时,总平方和是通过计算每个观测值与其均值之间的平方差来得到的:(ytest[i] – np.mean(ytest))²。 然后,按如下方式打印结果:

print ("total sum of squares", y)
print ("ẗotal sum of residuals ", g)
print ("r2 calculated", 1 - (g / y))

我们在此是为了解释原理。当然,我们也可以使用scikit-learn的r2_score()方法来完成此操作:

print("R2 score : %.2f" % r2_score(ytest,preds))

什么是均方误差(MSE)?

均方误差(MSE)是误差平方的平均值。该数值越大,表示误差越大。这里的误差指的是观测值y1, y2, y3, ... 与预测值pred(y1), pred(y2), pred(y3), ... 之间的差异。我们对每个差值进行平方(pred(yn) – yn)) ** 2,以防止负值和正值相互抵消。

如何在Python中计算MSE

以下是计算MSE的完整代码:

import matplotlib.pyplot as plt
from sklearn import linear_model
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score

reg = linear_model.LinearRegression()
ar = np.array([[[1],[2],[3]], [[2.01],[4.03],[6.04]]])
y = ar[1,:]
x = ar[0,:]
reg.fit(x,y)
print('Coefficients: n', reg.coef_)

xTest = np.array([[4],[5],[6]])
ytest =  np.array([[9],[8.5],[14]])
preds = reg.predict(xTest)

print("R2 score : %.2f" % r2_score(ytest,preds))
print("Mean squared error: %.2f" % mean_squared_error(ytest,preds))

er = []
g = 0
for i in range(len(ytest)):
    print( "actual=", ytest[i], " observed=", preds[i])
    x = (ytest[i] - preds[i]) **2
    er.append(x)
    g = g + x

x = 0
for i in range(len(er)):
    x = x + er[i]
print ("MSE", x / len(er))

v = np.var(er)
print ("variance", v)
print ("average of errors ", np.mean(er))

m = np.mean(ytest)
print ("average of observed values", m)

y = 0
for i in range(len(ytest)):
    y = y + ((ytest[i] - m) ** 2)
print ("total sum of squares", y)
print ("ẗotal sum of residuals ", g)
print ("r2 calculated", 1 - (g / y))

运行结果:

Coefficients:
[[2.015]]
R2 score : 0.62
Mean squared error: 2.34
actual= [9.] observed= [8.05666667]
actual= [8.5] observed= [10.07166667]
actual= [14.] observed= [12.08666667]
MSE [2.34028611]
variance 1.2881398892129619
average of errors 2.3402861111111117
average of observed values 10.5
total sum of squares [18.5]
ẗotal sum of residuals [7.02085833]
r2 calculated [0.62049414]

通过查看数据np.array([[[1],[2],[3]], [[2.01],[4.03],[6.04]]]),您可以看到每个因变量大约都是自变量的两倍。计算得到的系数reg.coef_为2.015也证实了这一点。

什么是好的均方误差(MSE)?

MSE没有一个标准的“正确值”。简单来说,值越低越好,0表示模型完美。由于没有标准答案,MSE的基本价值在于它可以帮助我们在不同的预测模型之间进行选择。同样,R2应该达到多少也没有标准答案。100%意味着完美的相关性。然而,也存在一些R2值较低但仍然是不错的模型的情况。

综合解读r2和MSE

这里我们要传达的核心信息是,在评估模型时,不能孤立地看待这些指标。您还需要查看其他指标,并理解其背后的数学原理。我们将在后续的博客文章中深入探讨所有这些内容。FINISHED