作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai
人类的大脑是为了识别我们周围世界的模式。例如,我们观察到如果我们每天练习编程,我们的相关技能就会随之增加。但是,我们如何准确的描述这种与其他人的关系呢?我们如何描述这种关系有多强大呢?幸运的是,我们可以用正式的数学估计(称为回归)来描述现象之间的关系。
回归是数据科学家工具包中最常用的工具之一。当你学习 Python 或者 R 时,你可以在单行代码中创建回归,而无需处理基础数学理论。但这种轻松可能会导致我们忘记评估我们的回归。
我们可以将数据插回到回归方程中,以查看预测输出是否与数据中看到的相应预测值匹配。回归模型的质量是其预测与实际值的匹配程度,但我们如何实际评估呢?
幸运的是,聪明的统计人员已经开发出错误指标来判断模型的质量,并且使得我们能够将回归和其他回归模型不同参数之间进行比较。这些指标是我们数据质量的简短描述。本文将深入探讨四种常见的回归指标,并且讨论其用例。
有许多类型的回归,但本文将专注于与线性回归相关的指标。线性回归是研究和商业中最常用的模型,并且是最容易理解的模型,因此开始研究你对其评估方式是非常有意义的一件事。我们将在此处介绍许多指标及其背后的含义。
如果你想快速了解线性回归模型,你可以去 wiki 上面进行查看。
线性回归的入门
在回归的背景下,模型指的是用于描述两个变量之间关系的数学方程。通常,这些模型处理我们称为输出的数据中感兴趣的值的预测或者估计。模型将查看我们认为会影响输出的称为输入的数据的其它方面,并使用它们生成估计的输出。这些输入和输出有许多你以前可能听过的名称,输入可以称为独立变量或者预测变量,而输出可以称为响应或者因变量。简单来说,模型只是输出是输入的一个函数。
线性回归的线性部分指的是线性回归模型以数学形式描述的事实:
如果这看起来太过数学,那么请保持耐心,因为线性思维特别的直观。如果你听过练习能完善技能,那么你就知道你多看它几眼,你就会马上懂了:实践和认知之间存在一定的线性关系。
线性回归的回归部分并不是指一些返回较小的状态。这里的回归仅指估算输入和输出之间关系的行为。特别是,回归处理连续值(数值)的建模而不是离散状态(分类)的建模。
总之,线性回归创建了一个模型,假设输入和输出之间存在线性关系。输入越高,输出越高(或者两者之间是负相关)。
模型的第一个参数是调整模型在所有输入为 0 时的预测内容,称为截距。第二个参数调整了模型输入和输出关系之间的强度,以及方向。
我们不会深入研究如何计算这些系数,但是我们知道存在一种计算最佳系数的方法,给出了我们想要用来预测输入的输出。给定系数,如果我们插入输入的值,那么线性回归将给出我们对输入的估计。
正如我们所看到的,这些输出并不总是完美的。除非我们的数据是是完全直线的,否则我们的魔心该不会精确的击中我们的所有数据点。其中一个重要原因是 ϵ \epsilon ϵ 的存在,该术语表示来自我们无法控制的系统误差,导致数据肯定会微微偏离真实位置。
我们的错误指标将能够判断预测值与实际值之间的差异,但我们无法知道错误导致差异的程度。虽然我们不能完全消除 $\epsilon $ ,但在线性模型中保留这一个术语是有用的。
比较模型预测与真实值
由于我们的模型将在给定任何输入或者输入集合的情况下生成输出,因此我们可以根据我们尝试预测的实际值来检查这些估计的输出。我们成实际值与模型估计残差之间的差异。我们可以计算数据集中每个点的残差,并且这些残差中的每一个都用于评估。这些残差将在判断模型的有用性方面发挥重要作用。
如果我们的残差集合很小,则意味着生成它们的模型在预测我们感兴趣的输出方面做得很好。相反,如果这些残差很大,那么通常意味着模型是一个不好的预估。
我们在技术上可以检查所有残差来判断模型的准确性,但不出所料,如果我们有数千或者数百万个数据点,这就无法扩展。因此,统计学家已经开发了汇总测量数据,这些测量数据采用我们的残差手机并将它们浓缩成一个代表我们模型预测能力的单一值。
这些摘要统计中有很多,每个都有自己的优点和缺陷。对于每一个,我们将讨论每个统计数据代表什么,它们的直观统计和典型用例。我们将涵盖:
- Mean Absolute Error 平均绝对误差
- Mean Square Error 均方误差
- Mean Absolute Percentage Error 平均绝对百分比误差
- Mean Percentage Error 平均百分比误差
注意:即使你在此处看到单词 error ,也不会引用上面的 epsilon 术语!这些指标中描述的 error 是指残差。
采用真正的数据
在讨论这些错误度量时,很容易陷入用于描述它们的各种首字母缩写词和方程式。为了保持自己的基础,我们将使用 kaggle 的视屏游戏销售数据来创建模型。
我们创建的模型的细节如下:
我们的回归模型有两个输入(评论得分和用户得分),因此它是一个多变量线性回归。该模型接收了我的数据,发现 0.039 和 -0.099 是输入的最佳系数。对于我的模型,我选择我的拦截为零,因为我想要当自变量为零时,销售额为零。因此,截距术语被我划掉了。最后, ϵ \epsilon ϵ 也被我划掉了。因为我们在实践中并不知道它的真正价值。我虽然在模型中展示了它,因为它更好的描述了在线性回归方程中编码的信息。
模型背后的基本原理
假设我是一名游戏开发者,我刚刚制作了一款新游戏,我想知道我将赚多少钱。我不想等待,所以我开发了一个模型,根据专业评论家对游戏的判断和一般玩家就判断(我的输入)来预测去全球总销售额(我的输出)。如果评论家和玩家都喜欢这款游戏,那么我应该赚更多钱。。。。。对吗?当我真正得到我的游戏的评论家和用户评论时,我可以预测我将获得多少钱。
目前,我不知道我的模型是否准确,所以我需要计算我的错误指标,以检查我是否应该包含更多输入或者我的模型是否有任何好处。
平均绝对误差,Mean absolute error
平均绝对误差(MAE)是要理解的最简单的回归误差度量。我们将计算每个数据点的残差,仅取每个数据点的绝对值,以便消除负和正残差。然后我们取所有这些残差的平均值。实际上,MAE 描述了残差的典型大小。如果你不熟悉均值,可以自己去 wiki 上面查看一下。MAE 的具体方程如下:
下图是 MAE 的图形描述。绿线代表我们模型的预测,蓝点代表我们的数据。
MAE 也是最直观的指标,因为我们只关注数据与模型预测之间的绝对差异。因为我们使用残差的绝对值,所以 MAE 并不表示模型的性能不佳或者性能过高(模型是否低于或者超过实际数据)。每个残差与误差总量成比例,这意味着较大的误差将对整体误差产生线性影响。
就像我们上面所说的那样,小的 MAE 表明该模型在预测方面非常出色,而大型 MAE 表明你的模型可能在某些方面存在问题。MAE 为 0 意味着你的模型输出是完美的预测器(但这个几乎不会发生)。
尽管 MAE 易于解释,但使用残差的绝对值通常不如使用开平方和来的有效。
根据我们的模型计算 MAE
在 Python 中计算 MAE 相对简单。在下面的代码中, sales 包含所有销售数字的列表,X 包含大小为 2 的元祖列表。每个元祖包含于同一索引中的销售相对应的评论者得分和用户得分。lm 包含来自 scikit-learn 的 LinearRegression 对象,我用它来创建模型本身。该对象还包含系数。预测方法接收输入并基于这些输入给出实际预测。
# Perform the intial fitting to get the LinearRegression object
from sklearn import linear_model
lm = linear_model.LinearRegression()
lm.fit(X, sales)
mae_sum = 0
for sale, x in zip(sales, X):
prediction = lm.predict(x)
mae_sum += abs(sale - prediction)
mae = mae_sum / len(sales)
print(mae)
>>> [ 0.7602603 ]
我们的模型的 MAE 是 0.760,这相当小了,因为我们的数据销售范围从 0.01 到 83。
均方误差,Mean square error
均方误差就像 MAE 一样,但在讲他们全部求和之前对差值进行平方而不是使用绝对值。我们可以在下面的等式中看到这种差异。
平方的后果
因为我正在平衡差异,所以 MSE 几乎总是比 MAE 大。因此,我们无法直接将 MAE 与 MSE 进行比较。我们只能将模型的误差指标与竞争模型的误差指标进行比较。
在我们的数据中存在异常值时,方程项在 MSE 方程中的影响是最为明显的。虽然 MAE 中的每个残差与总误差成比例,但误差在 MSE 中呈现二次方增长。这最终意味着我们数据中的异常值将导致 MSE 中的总误差远高于 MAE。同样的,我们的模型将因进行与相应实际值大不相同的预测而受到更多惩罚。这就是说,实际和预测之间的巨大差异在 MSE 中比在 MAE 中受到更多的惩罚。下图以图形方式显示了 MSE 中的单个残差可能是什么样子。
异常值会产生这些指数级较大的差异,我们的工作就是判断应该如何处理它们。
异常值的问题
我们数据中的异常值是试图创建模型的数据科学家的持续讨论来源。我们是否在模型创建中包含异常值,还是忽略它们?这个问题的答案取决于研究领域,手头的数据以及首先出现错误的后果。
流入,我知道有些视频游戏可以获得超级巨星的地位,从而获得不成比例的高收益。因此,忽略这些异常值游戏对我来说是非常愚蠢的,因为它们代表了数据集中的真实线性。我想使用 MSE 来确保我的模型更多的考虑这些异常值。如果它想淡化它们的意义,我会使用 MAE ,因为离群值残差不会对 MSE 的总误差贡献那么多。
最终, MSE 和 MAE 之间的选择是特定于应用程序的,取决于你希望如何处理的大的误差。两者仍然是可行的误差指标,但将描述有关模型预测错误的不同细微差别。
关于 MSE 以及衍生公式的说明
你可能遇到的另一个误差指标是均方根误差(RMSE)。顾名思义,它是 MSE 的平方根。因为 MSE 是平方的,所以它的单位和原始输出的单位不匹配。研究人员通常会使用 RMSE 将误差度量转换回类似的单位,从而使解释更加容易。
由于 MSE 和 RMSE 均对残差进行平方,因此他们同样受到异常值的影响。RMSE 类似于标准偏差(MSE 与方差),是衡量残差扩散程度的指标。
MAE 和 MSE 都可以从 0 到正无穷大,因此当这两个测量值都越来越高时,就越难以解释模型的表现。我们可以总结我们的残差集合的另一种方法是使用百分比,以便每个预测与它应该估计的值进行比例缩放。
根据我们的模型计算 MSE
与MAE 一样,我们将计算模型的 MSE。值得庆幸的是,计算与 MAE 一样简单。
mse_sum = 0
for sale, x in zip(sales, X):
prediction = lm.predict(x)
mse_sum += (sale - prediction)**2
mse = mse_sum / len(sales)
print(mse)
>>> [ 3.53926581 ]
对于 MSE,由于异常值的影响,我们预计它会比 MAE 大很多。我们发现情况是这样的:MSE 比 MAE 高出一个数量级。相应的 RMSE 约为 1.88,表明我们的模型错过时机销售价值约 180 万美元。
平均绝对百分比误差,Mean absolute percentage error
平均绝对百分比误差(MAPE)是 MAE 的百分比当量。该等式看起来就像 MAE,但通过调整将所有内容转换为百分比。
正如 MAE 是模型产生的平均误差一样,MAPE 是模型预测与平均响应输出相差多少的度量。与 MAE 一样,MAPE 也有明确的解释,因为你百分比更容易让人们进行概念化。由于使用绝对值,MAPE 和 MAE 对异常值的影响都非常稳健。
然而,尽管它具有所有优点,但我们使用 MAPE 比使用 MAE 更受限制。MAPE 的许多弱点实际上源于使用分工操作。现在我们必须按实际值扩展所有内容,对于值为 0 的数据点,MAPE 未定义。同样,如果实际值本身非常小,MAPE 可能会意外增大。最后,MAPE 偏向于系统的低于实际值本身的预测。也就是说,与预测相比,当预测低于实际值时,MAPE 将更低,下面的快速计算证明了这一点。
我们以平均百分比误差的形式有类似于 MAPE 的度量。虽然 MAPE 中的绝对值去除了任何负值,但平均百分比误差在计算中包含正误差和负误差。
根据我们的模型计算 MAPE
mape_sum = 0
for sale, x in zip(sales, X):
prediction = lm.predict(x)
mape_sum += (abs((sale - prediction))/sale)
mape = mape_sum/len(sales)
print(mape)
>>> [ 5.68377867 ]
我们确信没有销售额为零的数据点,因此我们可以安全的使用 MAPE。请记住,我们必须用百分点来解释它。MAPE 表明我们的模型预测平均比实际值低 5.6%。
平均百分比误差,Mean percentage error
平均百分比误差(MPE)方程与 MAPE 完全相同。唯一的区别是它缺乏绝对值操作。
尽管 MPE 缺乏绝对值操作,但实际上它的缺失使得 MPE 变得有用。由于正面和负面的误差将被抵消,我们无法对模型预测的整体表现作出任何陈述。但是,如果存在更多的负面或者正面误差,则此偏差将显示在 MPE 中。与 MAE 和 MAPE 不同,MPE 对我们很有用,因为它可以让我们看到我们的模型是否系统的低估(更多的负面错误)或者过高估计(正面错误)。
如果你要使用 MAPE 或者 MPE 等相对误差测量而不是像 MAE 或者 MSE 那样的绝对误差测量,那么你很可能会使用 MAPE。MAPE 具有易于解释的优点,但你必须警惕将对计算起作用的数据(即零)。你不能以与 MAPE 相同的方式使用 MPE,但它可以包塑你模型所产生的系统误差。
根据我们的模型计算 MPE
mpe_sum = 0
for sale, x in zip(sales, X):
prediction = lm.predict(x)
mpe_sum += ((sale - prediction)/sale)
mpe = mpe_sum/len(sales)
print(mpe)
>>> [-4.77081497]
所以误差指标都向我们建议,一般来说,该模型在根据评论家和用户评分预测销售方面做得很公平。但是,MPE 向我们表明它实际上系统的低估了销售额。了解我们模型的这一方面对我们很有帮助,因为它允许我们回顾数据并重申要包含哪些输入可以改进我们的指标。
总的来说,我会说我在预测销售方面的假设是一个良好的开端。误差指标显示了本来不清楚或者看不到的趋势。
来源:https://www.dataquest.io/blog/understanding-regression-error-metrics/