专栏首页机器学习与统计学终于有人把准确率、精度、召回率、均方差和R²都讲明白了

终于有人把准确率、精度、召回率、均方差和R²都讲明白了

在真实场景中,模型很少能成功地预测所有的内容。我们知道应该使用测试集的数据来评估我们的模型。但是这到底是如何工作的呢?

简短但不是很有用的答案是,这取决于模型。人们已经提出了各种评分函数,它可用于在所有可能的场景中评估训练模型。好消息是,很多评分函数实际上是scikit-learn的metrics模块的一部分。

让我们快速了解一些最重要的评分函数。

来源:大数据DT(ID:hzdashuju)

01 使用准确率、精度和召回率评分分类器

在二值分类任务中只有两个不同的类标签,有许多不同的方法来度量分类性能。一些常见的评估指标如下所示:

  • accuracy_score:准确率(accuracy)计算测试集中预测正确的数据点数,并返回正确预测的数据点的比例。以将图片分类为猫或狗为例,准确率表示正确分类为包含猫或狗的图片比例。该函数是最基本的分类器评分函数。
  • precision_score:精度(precision)描述了一个分类器不把包含狗的图片标记为猫的能力。或者说,在分类器认为测试集所有包含猫的图片中,精度是实际包含一只猫的图片比例。
  • recall_score:召回率(recall,或者敏感度)描述了一个分类器检索包含猫的所有图片的能力。或者说,测试集所有包含猫的图片中,召回率是正确识别为猫的图片比例。

假设我们有一些ground truth(正确与否取决于我们的数据集)类标签,不是0就是1。我们使用NumPy的随机数生成器随机生成数据点。显然,这意味着只要我们重新运行代码,就会随机生成新数据点。

我们希望你能够运行代码,并总是得到和书中相同的结果。实现此目的的一个很好的技巧是固定随机数生成器的种子。这会保证你在每次运行脚本时,都以相同的方式初始化生成器:

1)我们使用下列代码可以固定随机数生成器的种子:

import numpy as np
np.random.seed(42)

2)然后,选取(0, 2)范围内的随机整数,我们可以生成0或1的5个随机标签:

y_true = np.random.randint(0, 2, size=5)
y_true

Out:

array([0, 1, 0, 0, 0])

在文献中,这两类有时也被称为正样例(类标签是1的所有数据点)和负样例(其他所有数据点)。

假设我们有一个分类器试图预测之前提到的类标签。为方便讨论,假设分类器不是很聪明,总是预测标签为1。通过硬编码预测标签,我们可以模拟这种行为:

y_pred = np.ones(5, dtype=np.int32)
y_pred

Out:

array([1, 1, 1, 1, 1], dtype=int32)

我们预测的准确率是多少?

如前所述,准确率计算测试集中预测正确的数据点数,并返回测试集大小的比例。我们只是正确地预测了第二个数据点(实际标签是1)。除此之外,实际标签是0,而我们预测为1。因此,我们的准确率应该是1/5或者0.2。

准确率指标的一个简单实现可总结为:预测的类标签与实际类标签相符的所有情况。

test_set_size = len(y_true)

predict_correct = np.sum(y_true == y_pred)

predict_correct / test_set_size

Out:

0.2

scikit-learn的metrics模块提供了一个更智能、更便捷的实现:

from sklearn import metrics

metrics.accuracy_score(y_true, y_pred)

Out:

0.2

这并不难,不是吗?但是,要理解精度和召回率,我们需要对I型错误和II型错误有大致的了解。让我们来回忆一下,通常把类标签为1的数据点称为正样例,把类标签为0(或–1)的数据点称为负样例。然后,对特定数据点进行分类,可能会产生以下4种结果之一,如表3-1的混淆矩阵所示。

▼表3-1 4种可能的分类结果

让我们进行一下分析。如果一个数据点实际是正样例,并且我们也将其预测为正样例,那么我们就预测对了!在这种情况下,将结果称为真阳性。如果我们认为数据点是正样例,但是该数据点实际是一个负样例,那么我们错误地预测了一个正样例(因此就有了假阳性这个术语)。

类似地,如果我们认为数据点是负样例,但是该数据点实际是一个正样例,那么我们就错误地预测了一个负样例(假阴性)。最后,如果我们预测了一个负样例,而且该数据点确实是一个负样例,那么我们就找到了一个真阴性。

在统计学假设检验中,假阳性也称为I型错误,而假阴性也称为II型错误

让我们在模拟数据上快速计算一下这4个评估指标。我们有一个真阳性,实际标签是1,并且我们预测为1:

truly_a_positive = (y_true == 1)

predicted_a_positive = (y_pred == 1)

# You thought it was a 1, and it actually was a 1
true_positive = np.sum(predicted_a_positive * truly_a_positive)
true_positive

Out:

1

类似地,一个假阳性是我们预测为1,但ground truth却是0:

# You thought it was a 1, but it was actually a 0
false_positive = np.sum((y_pred == 1) * (y_true == 0))
false_positive

Out:

4

现在,我相信你已经掌握了窍门。但是我们必须做数学运算才能知道预测的负样例吗?我们的并不是很聪明的分类器从不会预测为0,因此(y_pred==0)应该不会是真的:

# You thought it was a 0, but it actually was a 1
false_negative = np.sum((y_pred == 0) * (y_true == 1))
false_negative

Out:

0
# You thought it was a 0, and it actually was a 0
true_negative = np.sum((y_pred == 0) * (y_true == 0))
true_negative

Out:

0

让我们再来绘制一个混淆矩阵,如表3-2所示。

▼表3-2 混淆矩阵

要保证我们做的都是正确的,让我们再计算一下准确率。准确率应该是真阳性数据点数量加上真阴性数据点数量(即所有正确预测的数据点数)除以数据点总数:

accuracy = np.sum(true_positive + true_negative) / test_set_size
accuracy

Out:

0.2

成功了!接着给出精度,为真阳性数据点数除以所有正确预测的数据点数:

precision = np.sum(true_positive) / np.sum(true_positive + false_positive)
precision

Out:

0.2

在我们的例子中,精度并不比准确率好。让我们用scikit-learn查看一下我们的数学运算:

metrics.precision_score(y_true, y_pred)

Out:

0.2

最后,召回率是我们正确分类为正样例占所有正样例的比例:

recall = true_positive / (true_positive + false_negative)
recall

Out:

1.0
metrics.recall_score(y_true, y_pred)

Out:

1.0

召回率太棒了!但是,回到我们的模拟数据,很明显,这个优秀的召回率得分仅仅是运气好而已。因为在我们的模拟数据集中只有一个标签为1,而我们碰巧正确地对其进行了分类,所以我们得到了一个完美的召回率得分。

这是否就意味着我们的分类器是完美的呢?未必如此!但是我们却发现了3个有用的评估指标,似乎从互补的方面度量了我们分类器性能。

02 使用均方差、可释方差和R平方评分回归

在涉及回归模型时上述评估指标就不再有效了。毕竟,我们现在预测的是连续输出值,而不是区分分类标签。幸运的是,scikit-learn还提供了一些其他有用的评分函数:

  • mean_squared_error:对于回归问题,最常用的误差评估指标是对训练集中每个数据点的预测值和真实目标值之间的平方误差(所有数据点的平均值)进行度量。
  • explained_variance_score:一个更复杂的评估指标是度量一个模型对测试数据的变化或分配的可解释程度。通常使用相关系数度量可释方差的数量。
  • r2_score:R2得分(R平方)与可释方差得分密切相关,但使用一个无偏方差估计。它也被称为决定系数(coefficient of determination)。

让我们创建另一个模拟数据集。假设我们的观测数据看起来像是x值的一个sin函数。我们从生成0到10之间等间距的100个x值开始。

x = np.linspace(0, 10, 100)

可是,真实数据总是有噪声的。为了尊重这一事实,我们希望目标值y_true也是有噪声的。我们通过在sin函数中加入噪声来实现:

y_true = np.sin(x) + np.random.rand(x.size) - 0.5

这里,我们使用NumPy的rand函数在[0,1]范围内加入均匀分布的噪声,然后通过减去0.5将噪声集中在0周围。因此,我们有效地将每个数据点上下抖动最大0.5。

假设我们的模型足够聪明,能够计算出sin(x)的关系。因此,预测的y值如下所示:

y_pred = np.sin(x)

这些数据是什么样子的呢?我们可以使用matplotlib对其进行可视化:

import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib inline
plt.figure(figsize=(10, 6))
plt.plot(x, y_pred, linewidth=4, label='model')
plt.plot(x, y_true, 'o', label='data')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='lower left')

Out:

<matplotlib.legend.Legend at 0x7f3c2220f048>

生成的线图如图3-2所示。

▲图3-2 使用matplotlib生成的可视化结果

确定我们的模型预测性能最直接的评估指标是均方误差。对于每个数据点,我们看预测值和实际y值之间的差异,然后对其进行平方。再计算所有数据点的平方误差的平均值:

mse = np.mean((y_true - y_pred) ** 2)
mse

Out:

0.08531839480842378

为了方便计算,scikit-learn提供了自有的均方误差实现:

metrics.mean_squared_error(y_true, y_pred)

Out:

0.08531839480842378

另一个常见的评估指标是测量数据的分散或变化:如果每个数据点都等于所有数据点的均值,那么数据中就没有分散或变化,我们就可以用一个数据值来预测所有未来的数据点。这将是世上最无聊的机器学习问题。

但我们发现这些数据点通常会遵循一些我们想要揭示的未知的、隐藏的关系。在前面的例子中,这就是导致数据分散的y=sin(x)关系。

我们可以测量能够解释的数据(或方差)的分散程度。这通过计算预测标签和实际标签之间的方差来实现;这是我们的预测无法解释的所有方差。如果用数据的总方差对这个值进行归一化,我们就得到未知方差的分数(fraction of variance unexplained):

fvu = np.var(y_true - y_pred) / np.var(y_true)
fvu

Out:

0.163970326266295

因为这个评估指标是一个分数,其值在0到1之间。我们可以从1中减去这个分数,得到可释方差的分数:

fve = 1.0 - fvu
fve

Out:

0.836029673733705

让我们用scikit-learn验证我们的数学运算:

metrics.explained_variance_score(y_true, y_pred)

Out:

0.836029673733705

完全正确!最后,我们可以计算出所谓的决定系数或者R2。R2与可释方差分数密切相关,并将先前计算的均方误差和数据中的实际方差进行比较:

r2 = 1.0 - mse / np.var(y_true)
r2

Out:

0.8358169419264746

通过scikit-learn也可以获得同样的值:

metrics.r2_score(y_true, y_pred)

Out:

0.8358169419264746

我们的预测与数据拟合得越好,与简单的平均数相比,R2得分的值越接近1。R2得分可以取负值,因为模型预测可以是小于1的任意值。一个常量模型总是预测y的期望值,独立于输入x,得到的R2得分为0:

metrics.r2_score(y_true, np.mean(y_true) * np.ones_like(y_true))

Out:

0.0

关于作者:阿迪蒂亚·夏尔马(Aditya Sharma),罗伯特·博世(Robert Bosch)公司的一名高级工程师,致力于解决真实世界的自动计算机视觉问题。曾获得罗伯特·博世公司2019年人工智能编程马拉松的首名。

维什韦什·拉维·什里马利(Vishwesh Ravi Shrimali),于2018年毕业于彼拉尼博拉理工学院(BITS Pilani)机械工程专业。此后一直在BigVision LLC从事深度学习和计算机视觉方面的工作,还参与了官方OpenCV课程的创建。

迈克尔·贝耶勒(Michael Beyeler),是华盛顿大学神经工程和数据科学的博士后研究员,致力于仿生视觉的计算模型研究,以为盲人植入人工视网膜(仿生眼睛),改善盲人的感知体验。他的工作属于神经科学、计算机工程、计算机视觉和机器学习的交叉领域。

本文分享自微信公众号 - 机器学习与统计学(tjxj666)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 终于有人把准确率、精度、召回率、均方差和R²都讲明白了

    导读:在真实场景中,模型很少能成功地预测所有的内容。我们知道应该使用测试集的数据来评估我们的模型。但是这到底是如何工作的呢?

    华章科技
  • 简单聊聊模型的性能评估标准

    在机器学习领域中,对模型的评估非常重要,只有选择和问题相匹配的评估方法,才能快速发现算法模型或者训练过程的问题,迭代地对模型进行优化。

    kbsc13
  • 【机器学习】一文详尽系列之模型评估指标

    在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针对不同机器学习问题如回归、分类、排序,其评估指标也会不同。

    zenRRan
  • 一文详尽系列之模型评估指标

    在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针对不同机器学习问题如回归、分类、排序,其评估指标也会不同。

    Datawhale
  • 【机器学习】一文详尽介绍模型评估指标

    在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针对不同机器学习问题如回归、分类、排序,其评估指标也会不同。

    石晓文
  • 终于有人把数据、信息、算法、统计、概率和数据挖掘都讲明白了!

    导读:数据与数据应用中的许多概念彼此有着千丝万缕的联系,同时也有着概念上的偏重与区别,那我们可以先从数据应用领域中的常见概念先聊起。

    华章科技
  • 搞懂机器学习的常用评价指标!

    我与评价指标的首次交锋是第一次实习面试时,面试官开头就问分类任务的评价指标。我当时TP,FP,FN,TN各种组合一顿上,回答得乱七八糟。后来经历多了,发现评价指...

    Datawhale
  • 一文让你了解AI产品的测试 评价人工智能算法模型的几个重要指标

    如何测试人工智能产品越来越受到广大测试工程师的关注,由于人工智能的测试预言(Test Oracle)不是像普通软件产品那么明确,到目前为止,基于大数据的第四代人...

    小老鼠
  • 召回、精确、准确,这些让人头大的概念一文全都讲清楚

    在之前的文章当中我们已经介绍了好几个模型了,有朴素贝叶斯、KNN、KMeans、EM还有线性回归和逻辑回归。今天我们来和大家聊聊该怎么评估这些模型。

    TechFlow-承志
  • 模型评估

    用户1432189
  • 【ML】一文详尽系列之模型评估指标

    在机器学习领域通常会根据实际的业务场景拟定相应的不同的业务指标,针对不同机器学习问题如回归、分类、排序,其评估指标也会不同。

    yuquanle
  • 【机器学习】一文读懂分类算法常用评价指标

    评价指标是针对将相同的数据,输入不同的算法模型,或者输入不同参数的同一种算法模型,而给出这个算法或者参数好坏的定量指标。

    郭耀华
  • 原创 | 常见损失函数和评价指标总结(附公式&代码)

    回归问题中常用的损失函数,在线性回归中,可以通过极大似然估计(MLE)推导。计算的是预测值与真实值之间距离的平方和。实际更常用的是均方误差(Mean Squar...

    数据派THU
  • 机器学习模型评估指标总结!

    本文对机器学习模型评估指标进行了完整总结。机器学习的数据集一般被划分为训练集和测试集,训练集用于训练模型,测试集则用于评估模型。针对不同的机器学习问题(分类、排...

    Datawhale
  • 机器学习算法中的F值(F-Measure)、准确率(Precision)、召回率(Recall)

    业内目前常常采用的评价指标有准确率(Precision)、召回率(Recall)、F值(F-Measure)等,下图是不同机器学习算法的评价指标。下文讲对其中某...

    机器学习AI算法工程
  • 机器学习之模型评分

    错误率和精度是分类任务中最常用的两种性能度量,既适用于二分类任务,也适用于多分类任务。错误率是分类错误的样本数占样本总数的比例,精度则是分类正确的样本数占样本...

    py3study
  • 一文读懂机器学习分类模型评价指标

    解决一个机器学习问题都是从问题建模开始,首先需要收集问题的资料,深入理解问题,然后将问题抽象成机器可预测的问题。在这个过程中要明确业务指标和模型预测目标,根据预...

    统计学家
  • 《自然语言处理实战入门》 ---- 笔试、面试题:机器学习基础(51-100)

    若 λ 较大时,意味着模型复杂度较低,这时候容易发生欠拟合,对应偏差增大,方差减小。做个简单总结:

    流川疯
  • 如何评估机器学习模型的性能

    您可以整天训练有监督的机器学习模型,但是除非您评估其性能,否则您永远无法知道模型是否有用。这个详细的讨论回顾了您必须考虑的各种性能指标,并对它们的含义和工作方式...

    计算机与AI

扫码关注云+社区

领取腾讯云代金券