14-回归算法的评价

说在前面

  在之前学习 kNN 这个算法的时候就提到过对于我们的分类问题来说,我们将原始数据集分为训练数据集和测试数据集两部分,我们使用训练数据集训练出一个模型,然后使用模型来预测我们的测试数据集,将预测结果和预测数据集自己带的真实的标签值进行对比,这样一来,我们就得到了我们的分类准确度(accuracy),我们可以使用这种分类的准确度(accuracy)来衡量我们的机器学习算法训练出的这个模型究竟是好是坏。
在这里插入图片描述
  但是,我们这里学习的是回归算法,对于回归算法来说,相应的,我们应该如何评价我们得到的这个模型是好是坏呢?


回归算法的评价

  下面,我依然是以简单线性回归为例。

  对于简单线性回归来说,它就是找到 a 和 b,使得式子尽可能小。
在这里插入图片描述

  那么我们在实际使用的时候,我们也需要把原始数据分成训练数据集和测试数据集两部分。那么要使得上述式子尽可能地小,其实是对于训练数据集来说的。
在这里插入图片描述
  也就是使得式子(3) 尽可能小:
在这里插入图片描述
  当我们这个训练过程结束之后,我们得到了 a 和 b。我们将测试数据集代入 y = a * x + b 中,得到:
在这里插入图片描述
  相应的,我们就可以得到对于每一个 x_test(i) 对应的预测值。其实很显然,实际上,我们可以跟我们训练的时候的目标函数一样,用以下式子作为衡量的标准:
在这里插入图片描述

  不过,它有一个问题就是当我们向别人汇报这个衡量标准的时候,这个标准是和 m 相关的。换句话说,比如说,你做了一个房产预测的算法,我也做了一个房产预测的算法,然后你说你的房产预测算法使用上图的衡量标准最终得到的误差的平方的累积的和为1000, 而我得到的是800,那么这样就能说明我的算法更好一些吗?

  答案是不能的。因为我们不知道我们俩在具体进行这个衡量的时候你的测试数据集有多少,我的测试数据集有多少?那么如果你的测试数据集里面有10000个元素,而我的只有10个元素,那么在这种情况下,你的10000个样本的误差累积起来只有1000,可是我的样本只有10个,误差累积起来都有800,显然其实是你的算法更好一些,所以我们可以非常容易的改进一下这个衡量标准,就是给这个式子再除以一个 m。
在这里插入图片描述
  相当于是让这个衡量标准和我们的测试样本数是无关的,这个式子相应地就是一个更为通用的线性回归算法的衡量标准,通常我们将这个标准叫做均方误差 MSE(Mean Square Error)

  对于这个衡量标准来说,其实还有一个小问题,就是量纲上的问题。换句话说,比如我们预测房产是以万元为单位的话,我们得到的这个误差结果其实是万元的平方,有时候,这个量纲可能为我们带来一些麻烦。

  所以,一个简单的改进方式就是将上面的式子再开一个平方。

在这里插入图片描述
  那么这样量纲和我们 y 的量纲是一致的,这样的衡量标准称为是 均方根误差 RMSE(Root Mean Squared Error)

  其实 MSE 和 RMSE 本质上是一样的,虽然两个数是不同的,因为通过 RMSE 和 MSE 之间的关系就可以看出来,MSE 越大,RMSE 就越大,MSE 小,RMSE 就会跟着小。它们的区别只在于对量纲是否敏感,在有些时候,我们使用 RMSE,使用同样的量纲的话,这个误差背后的意义更加明显。

  对于线性回归算法还有另外一个评测标准,这个评测标准非常直白,它的意思就是既然现在对每一个 x(i),都预测出了一个 y,我们直接让 y 的真值和预测值相减取绝对值这样就是一组数据之间的差距,我们把 m 组数组之间的差距相加再除以 m,就是取一个平均不就可以了吗,这个思路是非常正确的。这样的衡量方式也有一个名字,叫做平均绝对误差 MAE(Mean Absolute Error)
在这里插入图片描述

  这里需要注意一点,我们之前学习的线性回归算法再训练的过程中,我们的损失函数或者说是效用函数没有使用这种绝对值的方式,是因为那时我们说绝对值不是一个处处可导的函数,所以它不方便用来求极值。但是这样的一个方法,完全可以最终用来评价我们的线性回归算法,换句话说,我们评价一个算法所使用的标准和我们在训练这个模型的时候最优化的那个目标函数是可以完全不一致的。

  到这里,就介绍了三个评价线性回归算法的评测标准,分别是 MSE,RMSE,MAE。


代码实现

  下面我们具体编程来实现一下。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  下面,我将上述三种测试方法进行封装,封装在 metrics,py 中,我们在 kNN 算法中将 accuracy_score 也封装在该文件中。

# metrics,py

import numpy as np
from math import sqrt

def accuracy_score(y_true, y_predict):
    """计算y_true和y_predict之间的准确率"""
    assert y_true.shape[0] == y_predict.shape[0], \
        "the size of y_true must be equal to the size of y_predict"
    return sum(y_true == y_predict) / len(y_true)

# MSE:均方误差
def mean_squared_error(y_true, y_predict):
    """计算y_true与y_predict之阿的MSE"""
    assert len(y_true) == len(y_predict), \
        "the size of y_true must be equal to the size of y_predict"
    return np.sum((y_true - y_predict) ** 2) / len(y_true)

# RMSE:均方根误差
def root_mean_squared_error(y_true, y_predict):
    """计算y_true与y_predict之阿的RMSE"""
    return sqrt(mean_squared_error(y_true, y_predict))

# MAE:平均绝对误差
def mean_absolute_error(y_true, y_predict):
    """计算y_true与y_predict之阿的MAE"""
    assert len(y_true) == len(y_predict), \
        "the size of y_true must be equal to the size of y_predict"
    return np.sum(np.absolute(y_true - y_predict)) / len(y_true)

在这里插入图片描述

  到此,我们用自己封装的 MSE,RMSE,MAE 实现了对回归算法的测试,也使用了 scikit-learn 中的 MSE 和 MAE。


RMSE 与 MAE 的比较

  下面,我们就来看看 RMSE 和 MAE 的比较。

  首先,它们的量纲是一样的,都是原始数据中 y 对应的量纲。但是我们在具体实践的时候,我们最后求出来的结果会发现 RMSE 会比 MAE 要大一些。这是为什么呢?
在这里插入图片描述
  我们观察以上式子就很容易的发现,RMSE 是将这个错误值进行了平方,将这些平方累加后再开根。那么可以想象一下,如果我们的错误值非常大的话,比如说有两个样本它们之间的差距为100的话,那么平方之后就变为了10000,也就是说,RMSE 有放大我们样本中预测结果和真实结果之间较大的那个差距的趋势。而 MAE 是没有这样的一个趋势的,它直接就反应的是样本预测结果和真实结果之间的差距,没有这个平方操作。正是因为这个原因,从某种程度上来讲,我们尽量让 RMSE 这个值更加小相对来说它的意义更大一些,因为这背后其实就意味着我们整个样本的错误中那个最大的错误值相应的比较小。那么基于这样的分析,再思考一下,之前我们说训练我们简单线性回归算法的时候,其实我们的目标函数就是 RMSE 根号里面没有 1/m 的这一部分,而这一部分其实它的本质和优化 RMSE 是一样的,当然我们训练的过程中使用的是训练数据集而不是测试数据集。换句话说,在我们的简单线性回归的训练过程中,我们使用了这个目标函数本质就在想办法减少最终预测的结果最大的那个误差它们之间相应的这个差距。我非常简单的从另外一个角度上阐述了我们在简单线性回归中目标函数选取平方这样的一个形式而不是选取绝对值这样的形式它的另外一个优势。


具体代码见 14 回归算法的评价.ipynb

猜你喜欢

转载自blog.csdn.net/qq_41033011/article/details/109008543
今日推荐