本文章将要探讨的是机器学习分类问题中常用的准确率准确率召回率这三种评价目标。

首要,给出咱们下面要用到的样例。

l1 = [0, 1, 1, 1, 0, 0, 0, 1] # 实在数据
l2 = [0, 1, 0, 1, 0, 1, 0, 0] # 猜测成果

为了便利咱们后续的学习和核算,这儿以一个二分类问题为例,即样本标签只要 0011 两种,约好 l1l1 列表是咱们实在的标签数据,l2l2 列表则是咱们模型猜测的成果。

在讨论这三个目标前,咱们需求了解一些术语。

1 前置芝士

1.1 真阳性(TP)

给定一张图片,假如咱们的模型猜测该图片里有气球,而该图片里实践上便是有气球的,则视为真阳性。

Python 完成如下。

def true_positive(y_true, y_pred):
    tp = 0
    for yt, yp in zip(y_true, y_pred):
        # 若实在标签为正且猜测标签也为正,计数器加一
        if yt == 1 and yp == 1:
            tp += 1
    return tp

接下来,检查一下咱们编写的代码是否正确。

In [X]: true_positive(l1, l2)
Out[X]: 2

与手动核算的成果一样,第二个和第四个样本的实在标签和模型猜测标签共同,都为 11

1.2 真阴性(TN)

给定一张图片,假如咱们的模型猜测该图片里没有气球,而该图片里实践上就没有气球,则视为真阴性。

def true_negative(y_true, y_pred):
    tn = 0
    for yt, yp in zip(y_true, y_pred):
        # 若实在标签为负且猜测标签也为负,计数器加一
        if yt == 0 and yp == 0:
            tn += 1
    return tn
In [X]: true_negative(l1, l2)
Out[X]: 3

这与手动核算的成果一样,第一个、第五个和第七个样本的实在标签和模型猜测标签共同,都为 00

1.3 假阳性(FP)

给定一张图片,假如咱们的模型猜测该图片里有气球,而该图片里实践上就没有气球,则视为假阳性。

def false_positive(y_true, y_pred):
    fp = 0
    for yt, yp in zip(y_true, y_pred):
        # 若实在标签为负而猜测标签为正,计数器加一
        if yt == 0 and yp == 1:
            fp += 1
    return fp
In [X]: false_positive(l1, l2)
Out[X]: 1

这与手动核算的成果一样,第六个样本的实在标签为 00 但模型猜测标签为 11

1.4 假阴性(FN)

给定一张图片,假如咱们的模型猜测该图片里没有气球,而该图片里实践上便是有气球的,则视为假阴性。

def false_negative(y_true, y_pred):
    fn = 0
    for yt, yp in zip(y_true, y_pred):
        # 若实在标签为正而猜测标签为负,计数器加一
        if yt == 1 and yp == 0:
            fn += 1
    return fn
In [X]: false_negative(l1, l2)
Out[X]: 2

这也与手动核算的成果一样,第三个和最后一个样本的实在标签都为 11 但模型猜测标签为 00

2. 准确率(Accuracy)

准确率是机器学习中常用的评价目标之一,用于衡量模型猜测成果的准确性。准确率一般界说为模型正确猜测的样本数量与总样本数量的比值。咱们还可以用 1.11.1 节~1.41.4 节说到的术语来表明它。

Accuracy=TP+TNTP+TN+FP+FNAccuracy=frac{TP+TN}{TP+TN+FP+FN}

知道了公式,那么它的完成便很简单了。

def accuracy(y_true, y_pred):
    tp = true_positive(y_true, y_pred)
    fp = false_positive(y_true, y_pred)
    fn = false_negative(y_true, y_pred)
    tn = true_negative(y_true, y_pred)
    # 核算准确率
    accuracy_score = (tp + tn) / (tp + tn + fp + fn)
    return accuracy_score
In [X]: accuracy(l1, l2)
Out[X]: 0.625

由此可知,咱们模型的准确率为 0.6250.625,即咱们的模型只准确猜测了 55 个样本的标签。

3. 准确率(Precision)

准确率,也叫查准率,它也是机器学习中一个常用来衡量模型猜测成果的准确性的东西。准确率的界说是:在所有被模型猜测为正例的样本中,真实的正例所占的份额。用咱们的术语来表明是这样。

Precision=TPTP+FPPrecision=frac{TP}{TP+FP}

相同,咱们也可以用 Python 将它完成。

def precision(y_true, y_pred):
    tp = true_positive(y_true, y_pred)
    fp = false_positive(y_true, y_pred)
    # 核算准确率
    precision = tp / (tp + fp)
    return precision
In [X]: precision(l1, l2)
Out[X]: 0.6666666666666666

观察咱们的 l2l2 列表,猜测的标签为 11 的样本有 33 个,但真阳性的样本只要 22 个,所以准确率为 23frac{2}{3},这与咱们的程序运转成果共同。

4. 召回率(Recall)

召回率一般和准确率一起用于衡量模型的功能。召回率的界说是:在所有实践为正例的样本中,被模型正确猜测为正例的样本所占的份额,即模型可以找到多少真实的正例。用咱们的术语表明如下。

Recall=TPTP+FNRecall=frac{TP}{TP+FN}
def recall(y_true, y_pred):
    tp = true_positive(y_true, y_pred)
    fn = false_negative(y_true, y_pred)
    # 核算召回率
    recall = tp / (tp + fn)
    return recall

写完代码,咱们来测验一下。

In [X]: recall(l1, l2)
Out[X]: 0.5

根据程序输出成果,咱们模型的召回率为 0.50.5,是否正确呢?l1l1 列表里标签为 11 的样本有 44 个,但这 44 个样本被模型正确地猜测标签为 11 的只要其中 22 个,即第二个和第四个样本,所以答案正确!

5. 意义

现在咱们现已了解了这三个评价目标的界说和核算办法,它们都很重要,但现实中很少有十全十美的模型。接下来咱们来考虑一个问题,在什么样的情形下,咱们的模型需求更侧重于哪个目标呢?

5.1 准确率更重要

一般来讲,当数据集相对平衡,正例和负例的数量适当,且过错猜测的代价很高时,准确率或许更重要。因为这能协助咱们从全局的角度来判别一个模型或者一个体系的能力是否足够强。此外,准确率作为一个总体的评价目标,在一些简单的分类问题中,可以用于比较不同模型或办法的功能,然后协助人们的选择。

5.2 准确率更重要

当正例的猜测非常关键,且咱们更重视模型在猜测正例时的准确性时,准确率或许更重要。例如,在当即邮件阻拦中,咱们肯定是更期望模型可以识别出真实的垃圾邮件,而不是误判普通的电子邮件为垃圾邮件,然后影响人们的正常沟通。

5.3 召回率更重要

当正例非常重要,且咱们期望尽或许多地找到所有正例时,召回率或许更重要。通俗地讲,便是宁可错杀一千,也不放过一个。例如,在地震猜测体系中,咱们一般都要求模型可以猜测出所有或许发生地震的地理位置信息,尽管或许会有猜测过错的时分,即某一地点实践上根本就没发生地震,可是假如体系漏报一个会发生地震的地点时,则会变成难以计数的后果。

然而,在实践使用中,一般需求综合考虑准确率、准确率和召回率,以及具体问题的需求和权衡,这便是需求咱们在实践中不断地学习了。

参考文献:

准确率、准确率、召回率

Approaching (Almost) Any Machine Learning Problem