机器学习中的评价指标

Posted on 2021-07-20 12:45  foghorn  阅读(160)  评论(0编辑  收藏  举报

0 概述

为了衡量一个机器学习模型的好坏,需要给定一个测试集,用模型对测试集中的每个样本进行预测,并根据预测结果计算评价分数。对于分类问题,常见的评价指标有准确率、精确率、召回率和F值等。给定测试集\(\tau =\left \{ \left ( \pmb{x}^{(1)},y^{(1)} \right ),...,\left ( \pmb{x}^{(N)},y^{(N)} \right )\right \}\),假设标签\(y^{(n)}\in \left \{ 1,...C \right \}\),用学习好的模型\(f(\pmb{x};\theta ^{*})\)对测试集中的每一个样本进行预测,结果为\(\left \{ \hat{y}^{(1)},...,\hat{y}^{(N)} \right \}\)。接下来介绍各指标的定义。

1 准确率

准确率(Accuracy)是最常用的评价指标:

\[a=\frac{1}{N}\sum_{n=1}^{N}I(y^{(n)}=\hat{y}^{(n)}) \]

2 错误率

和准确率对应的就是错误率(Error Rate):

\[\varepsilon =1-a \]

3 精确率(查准率)和召回率(查全率)

对于一个分类问题,对类别c来说,模型在测试集上的结果可以分为以下四种情况:

  • 真正例(TP):真实类别为正例,预测类别为正例。

\[TP_{c}=\sum_{n=1}^{N}I(y^{(n)}=\hat y^{(n)}= c) \]

  • 假正例(FP):真实类别为负例,预测类别为正例。

\[FP_{c}=\sum_{n=1}^{N}I(y^{(n)}\neq c \cap \hat y^{(n)}= c) \]

  • 真负例(TN):真实类别为负例,预测类别为负例。
  • 假负例(FN):真实类别为正例,预测类别为负例。

\[FN_{c}=\sum_{n=1}^{N}I(y^{(n)}= c \cap \hat y^{(n)} \neq c) \]

类别c的混淆矩阵为:

类别c 预测为正 预测为负
真实类别为正 \(TP_{c}\) \(FN_{c}\)
真实类别为负 \(FP_{c}\) \(TN_{c}\)
  • 精确率定义如下:

\[P_{c} = \frac{TP_{c}}{TP_{c} + FP_{c}} \]

  • 召回率定义如下:

\[R_{c} = \frac{TP_{c}}{TP_{c} + FN_{c}} \]

  • F值定义如下:

\[F_{c} = \frac{(1+\beta ^{2})*P_{c} * R_{c}}{\beta ^{2} * P_{c} + R_{c}} \]

\(\beta\)取值为1时,称为F1值。

4 宏平均和微平均

为了计算分类算法在所有类别上的总体精确率、召回率和F1值,经常使用两种平均方法,分别称为宏平均(Macro Average)和微平均(Micro Average)。

  • 宏平均的定义如下:

\[P_{macro} = \frac{1}{C}\sum_{c=1}^{C}P_{c} \]

\[R_{macro} = \frac{1}{C}\sum_{c=1}^{C}R_{c} \]

\[F1_{macro} = \frac{2*P_{macro} * R_{macro}}{P_{macro}+R_{macro}} \]

  • 微平均:微平均是每个样本的性能指标的平均值

\[P_{micro}=\frac{\sum_{n=1}^{n}TP_{i}}{\sum_{n=1}^{n}TP_{i}+\sum_{n=1}^{n}FP_{i}} \]

\[R_{micro}=\frac{\sum_{n=1}^{n}TP_{i}}{\sum_{n=1}^{n}TP_{i}+\sum_{n=1}^{n}FN_{i}} \]

\[F1_{micro}=\frac{2*P_{micro}*R_{micro}}{P_{micro}+R_{micro}} \]

例题

假设我们有一个两类鉴别模型和测试集,该模型在该测试集上预测结果与实际类别对比可得:
类别一
TP1 = 12,FP1 = 9,FN1 = 3

类别1 预测为正 预测为负
真实类别为正 12 3
真实类别为负 9 \(TN_{1}\)

易知:P1 = 57.1%,R1 = 80%
类别2
TP2 = 50,FP2 = 23,FN2 = 9

类别2 预测为正 预测为负
真实类别为正 50 9
真实类别为负 23 \(TN_{2}\)

易知:P2 = 68.5%,R2 = 84.75%
宏平均
P_macro P = (P1 + P2) / 2 = 62.82%
P_macro R = (R1 + R2) / 2 = 82.25
微平均
P_micro P = (TP1 + TP2) / (TP1 + TP2 + FP1 + FP2) = 65.96
P_micro R = (TP1 + TP2) / (TP1 + TP2 + FN1 + FN2) = 83.78

总结

如果每个class的样本数量差不多,那么宏平均和微平均没有太大差异,如果每个class的样本数量差异很大,而且你想:

  • 更注重样本量多的class:使用宏平均
  • 更注重样本量少的class:使用微平均

如果微平均大大低于宏平均,检查样本量多的class
如果宏平均大大低于微平均,检查样本量少的class

5 P-R曲线和ROC曲线

PR曲线的纵轴是精确率,横轴是召回率。对于一个排序模型来说,其PR曲线上的一个点代表“在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本时,排序结果对应的召回率和精确率”。

ROC曲线的纵坐标为真正例率(TP),横坐标为假正例率(FP)。

AUC是ROC曲线下的面积,它是机器学习用于二分类模型的评价指标,AUC反应的是模型对样本的排序能力。它的统计意义是从所有正样本随机抽取一个正样本,从所有负样本随机抽取一个负样本,当前score使得正样本排在负样本前面的概率。

AUC的计算主要以下几种方法:

1、计算ROC曲线下的面积。这是比较直接的一种方法,可以近似计算ROC曲线一个个小梯形的面积。几乎不会用这种方法

2、从AUC统计意义去计算。所有的正负样本对中,正样本排在负样本前面占样本对数的比例,即这个概率值。

具体的做法就是它也是首先对prob score从大到小排序,然后令最大prob score对应的sample 的rank为n,第二大score对应sample的rank为n-1,以此类推。然后把所有的正类样本的rank相加,再减去M-1种两个正样本组合的情况。得到的就是所有的样本中有多少对正类样本的score大于负类样本的score。

AUC的python实现

from sklearn.metrics import roc_auc_score


def calc_auc(y_scores, y_labels):
    """
    y_scores: 模型预测的分数
    y_labels: 样本真实标签
    """

    f = list(zip(y_scores, y_labels))
    rank = [label for score, label in sorted(f, key=lambda x: x[0])]
    rank_list = [i + 1 for i in range(len(rank)) if rank[i] == 1]

    pos_cnt = 0
    neg_cnt = 0
    for v in y_labels:
        if v:
            pos_cnt += 1
        else:
            neg_cnt += 1
    auc = (sum(rank_list) - pos_cnt * (pos_cnt + 1) / 2) / (pos_cnt * neg_cnt)
    return auc


if __name__ == "__main__":
    y_scores = [0.9,0.4,0.8,0.39,0.7,0.38,0.6,0.37,0.55,0.36,
                0.54,0.35,0.53,0.34,0.52,0.33,0.51,0.30,0.505,0.1]
    y_labels = [1,1,1,0,0,1,1,0,1,0,1,0,0,1,0,0,1,1,0,0]

    print(calc_auc(y_scores, y_labels))
    print(roc_auc_score(y_labels, y_scores))
	

PR曲线和AUC曲线的关系

1.当正负样本比例差不多的时候,两者区别不大。

2.PR曲线比ROC曲线更加关注正样本,而ROC则兼顾了两者。

3.当正负样本比例失调时,比如正样本1个,负样本100个,则ROC曲线变化不大,此时用PR曲线更加能反映出分类器性能的好坏。

6 AP和mAP

Copyright © 2024 foghorn
Powered by .NET 9.0 on Kubernetes