图像异常检测评估指标-分类性能

图像异常检测评估指标-分类性能

1. 混淆矩阵

混淆矩阵

混淆矩阵包括4个用于衡量分类算法性能的基本数值

四个字母代表的含义是:P(Positive)代表算法将样本预测为正类,N(Negative)代表算法将样本预测为负类;T(True)代表算法对该样本的预测正确(即该样本的预测类别和实际类别一致),F(False)代表算法对该样本的预测错误(即该样本的预测类别和实际类别相反)

  • TP (True Positive):预测为正类,实际也为正类的样本数
  • TN (True Negative):预测为负类,实际也为负类的样本数
  • FP (False Positive):预测为正类,实际为负类的样本数
  • FN (False Negative):预测为负类,实际为正类的样本数

2. 特定阈值下的评估指标

首先利用训练集拟合好分类算法,然后在验证集上推理得到上述的TP, TN, FPFN,进而可以计算该分类算法的性能评估指标——准确率(accuracy)、精确率(precision)、召回率(recall)和 F1-Score

2.1 accuracy

  • 指标名称:准确率

  • 定义:正确分类的样本(TP)占所有样本(TP+TN+FP+FN)的比例(本文所有这些评估指标都是根据验证集进行计算的)

  • 公式:

A c c u r a c y = ( T P + T N ) ( T P + F P + F N + T N ) Accuracy=\frac{(TP+TN)}{(TP+FP+FN+TN)} Accuracy=(TP+FP+FN+TN)(TP+TN)

  • 用准确率来评估可能存在一些问题:

    1. 类别不平衡问题:当数据集中的类别分布不均衡时,准确率可能会产生误导。例如,如果一个数据集中99%的样本属于一个类别,1%的样本属于另一个类别,那么一个简单的总是预测为多数类别的模型也会有99%的准确率,但实际上这个模型对于少数类别的预测效果非常差。

    2. 忽视错误分类的不同重要性:准确率无法区分不同类型的错误分类,accuracy的分子代表正确预测的样本数,包括 TPTN ,与之相对应的错误率是error = 1-accuracy,它的分子就包括 FPFN ,在医学诊断中,FPFN分别代表误诊和漏诊,而误诊和漏诊的影响可能完全不同,但准确率不会反映出这些错误分类的不同重要性。

import numpy as np
from sklearn.metrics import (accuracy_score, balanced_accuracy_score, precision_score, recall_score, f1_score, fbeta_score,precision_recall_curve, roc_curve, auc
)
import matplotlib.pyplot as plt# 示例数据
# y_true: 实际标签
# y_scores: 模型预测概率
y_true = np.array([0, 1, 1, 0, 1, 0, 1, 0, 1, 0])
y_scores = np.array([0.1, 0.4, 0.35, 0.8, 0.7, 0.3, 0.6, 0.2, 0.9, 0.5])# 将概率转换为二分类预测==> 注意只有在这里选定阈值的情况下,后面才能计算Precision/Recall/F1Score
threshold = 0.5
y_pred = (y_scores >= threshold).astype(int)# Accuracy
accuracy = accuracy_score(y_true, y_pred)
print(f'Accuracy: {accuracy:.2f}')

针对正负样本不平衡的数据,可以引入平均准确率进行更合理的评估。

2.2 average accuracy

  • 指标名称:平均准确率
  • 定义:对各个类别分别计算准确率,然后求平均
  • 公式:

a v e r a g e A c c u r a c y = ∑ a c c u r a c y i n averageAccuracy=\frac{\sum accuracy_i}n averageAccuracy=naccuracyi

# 平均准确率
average_accuracy = balanced_accuracy_score(y_true, y_pred)
print(f'Average Accuracy (Balanced Accuracy): {average_accuracy:.2f}')

2.3 precision

  • 指标名称:精确率、查准率

  • 定义:正确分类的正样本(TP)占所有预测正样本(TP+FP)的比例

  • 公式:

P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP

  • 意义:衡量模型在正类预测上的准确率注意是预测正类的准确率!!!),如在垃圾邮件过滤中,精确率高(FP小)意味着很少将正常邮件误判为垃圾邮件。
# 精确率
precision = precision_score(y_true, y_pred)
print(f'Precision: {precision:.2f}')

2.4 recall

  • 指标名称:召回率、查全率、真正率(TPR
  • 定义:正确分类的正样本(TP)占所有实际正样本(TP+FN)的比例
  • 公式:

R e c a l l = T P T P + F N \mathrm{Re}call=\frac{TP}{TP+FN} Recall=TP+FNTP

  • 意义:召回率衡量的是模型在检测所有实际为正类的样本时的有效性,或者说对正类样本的查全率注意是正类样本的查全率!!!高召回率意味着模型能够识别大多数的正类样本,漏检情况很少
# 召回率
recall = recall_score(y_true, y_pred)
print(f'Recall: {recall:.2f}')

PrecisionRecall都适合用于类别不平衡的验证集,因为在二者的公式中都没有考虑True Negatives (TN) ,只专注于正确判断正样本,因此,就算验证集中负样本的数目远大于正样本,RecallPrecision仍是有效的参考指标。反之,FPR 则会受到影响,当我们负样本很多,模型若全部预测为负样本,会得到FPR = 0,但这样的模型并非好的模型,所以ROC curve比较容易受到不平衡的验证集影响。

precision和recall的定义

2.5 F1-Score

  • 定义:针对特定某个门槛值RecallPrecision 所计算出来的调和平均数(precisionrecall的重要程度相同)
  • 公式:

F 1 S c o r e = 2 ∗ p r e c i s i o n ∗ r e c a l l p r e c i s i o n + r e c a l l F1Score=\frac{2^*precision^*recall}{precision+recall} F1Score=precision+recall2precisionrecall

2.6 TPR

  • 指标名称:真正率,True Positive Rate,召回率、查全率,Sensitivity
  • 定义:所有真实类别为1的样本中,预测类别为1的比例
  • 公式(TP除以其所在的列和):

T P R = T P T P + F N TPR=\frac{TP}{TP+FN} TPR=TP+FNTP

2.7 FPR

  • 指标名称:假正率,False Positive Rate,误诊率,(1-Specificity)

  • 定义:所有真实类别为0的样本中,预测类别为1的比例

  • 公式(FP除以其所在的列和):
    F P R = F P F P + T N FPR=\frac{FP}{FP+TN} FPR=FP+TNFP

2.8 FNR

  • 指标名称:False Negative Rate漏诊率
  • 定义:所有真实类别为1的样本中,预测类别为0的比例
  • 公式:

F N R = F N T P + F N FNR=\frac{FN}{TP+FN} FNR=TP+FNFN

TPR和FPR的定义

3. 阈值无关的评估指标

3.1 PR Curve

  • 指标全称:Precision Recall Curve

  • 定义:纵坐标为精准率Precision,横坐标为召回率Recall

  • 意义:PR曲线是在不同阈值下绘制的,和下文的ROC曲线类似,都用于反映模型在不同阈值下的整体表现,PR曲线越往右上角凸起,则代表整体更好的模型表现,因为,反之越平则代表模型性能越差。

  • 如何选取最优阈值?

    PR曲线是通过在各个阈值下计算精确率(Precision)和召回率(Recall)来绘制的,要确定最佳阈值,可以:

    1. 法一:计算不同阈值下的F1 Score,选择使F1 Score最大的阈值。
    2. 法二:
      • 根据实际应用对Precision和Recall的不同重视程度,赋予二者不同的权重,计算Fβ-score,选择使Fβ-score最大的阈值。
      • Fβ-score是准确Precision和Recall的加权调和平均值,该β参数表示召回率重要性与精确度重要性的比率,β>1会给recall更多的权重,β<1会给precision更多的权重。例如β=2代表recall的重要性是precision的2倍,β=0.5则刚好相反。
# Precision-Recall曲线和AU-PR
precisions, recalls, pr_thresholds = precision_recall_curve(y_true, y_scores)
plt.figure()
plt.plot(recalls, precisions, label='Precision-Recall Curve')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend()
plt.show()
# F1 Score和F-beta Score最佳阈值
f1_scores = 2 * (precisions * recalls) / (precisions + recalls)
best_f1_index = np.argmax(f1_scores)
best_f1_threshold = pr_thresholds[best_f1_index]
print(f'Best F1 Threshold: {best_f1_threshold:.2f}')
print(f'Best F1 Score: {f1_scores[best_f1_index]:.2f}')beta = 2
fbeta_scores = (1 + beta**2) * (precisions * recalls) / (beta**2 * precisions + recalls)
best_fbeta_index = np.argmax(fbeta_scores)
best_fbeta_threshold = pr_thresholds[best_fbeta_index]
print(f'Best F-beta Threshold: {best_fbeta_threshold:.2f}')
print(f'Best F-beta Score: {fbeta_scores[best_fbeta_index]:.2f}')

3.1.1 AU-PR

  • 指标全称:Area under the Precision-Recall Curve

  • 意义:将precision-recall curve 总结成曲线下面积,便于衡量模型在各个阈值下的整体性能表现

  • PR曲线的面积计算公式为:
    A U P R = ∑ i = 1 n − 1 ( R i + 1 − R i ) ⋅ ( P i + 1 + P i 2 ) \mathrm{AUPR}=\sum_{i=1}^{n-1}(R_{i+1}-R_i)\cdot\left(\frac{P_{i+1}+P_i}2\right) AUPR=i=1n1(Ri+1Ri)(2Pi+1+Pi)

    • R i R_i Ri:Recall at the i i i-th threshold
    • P i : P_i{:} Pi: Precision at the i i i-th threshold
    • n n n: Number of thresholds
from sklearn.metrics import precision_recall_curve, aucprecision, recall, _ = precision_recall_curve(y_true, y_scores)
aupr = auc(recall, precision)print(f'AU-PR: {au_pr:.2f}')

3.1.2 AP

  • 指标名称:Average Precision

  • 定义:各阈值下精确率的加权平均值,权重是召回率的变化

  • 公式:
    A P = ∑ n ( R n − R n − 1 ) P n \mathrm{AP}=\sum_n(R_n-R_{n-1})P_n AP=n(RnRn1)Pn

    • P n : P_n{:} Pn:Precision at the nth threshold
    • R n : R_n{:} Rn: Recall at the nth threshold
  • 意义:将precision-recall curve 总结成各阈值下精确率的加权平均,更关注模型的精确率

  • In essence, AP calculates the area under the precision-recall curve but takes into account the order of the data points.

In practice, AUPR and AP are used to evaluate the performance of classification models on imbalanced datasets. In many machine learning libraries, the term “Average Precision” is often used and computed, while “AUPR” might be less frequently mentioned but represents a similar concept.

from sklearn.metrics import average_precision_score# Calculate Average Precision
ap = average_precision_score(y_true, y_scores)

3.1.3 AR

  • 指标名称:Average Recall
  • 定义:各阈值下召回率的加权平均值,权重是精确率的变化
  • 意义:这是和AP对称的公式,不常用,适用于强调召回率的场景
  • 公式:

AR = ∑ n ( P n − P n − 1 ) R n \text{AR}=\sum_n(P_n-P_{n-1})R_n AR=n(PnPn1)Rn

3.2 ROC Curve

  • 指标名称:Receiver Operating Characteristic Curve

  • 定义:纵坐标是真正率TPR,横坐标是假正率**FPR**

  • 如何画ROC曲线?

    二分类模型的输出是预测样本为正例的概率,而ROC曲线正是通过不断移动分类器的“阈值”来生成曲线上的一组关键点的。

    ROC曲线的绘制步骤如下:

    1. 假设已经得出一系列样本被划分为正类的概率Score值,按照大小排序。
    2. 从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于某个样本,其“Score”值为0.6,那么“Score”值大于等于0.6的样本都被认为是正样本,而其他样本则都认为是负样本。
    3. 每次选取一个不同的threshold,得到一组FPRTPR,以FPR值为横坐标和TPR值为纵坐标,即ROC曲线上的一点。
    4. 根据3中的每个坐标点,画图。

    举例如下:

    假设验证集样本的预测结果如下表,图中共有20个验证集样本,“Class”一栏表示每个验证集样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个验证集样本属于正样本的概率。

    一系列样本被划分为正类的score值示例

    接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。从第一个样本开始,设该样本的Score值为阈值,则该样本及之后的样本(均比该样本概率值小)判为负样本,即所有样本判为全负,计算得TPR=FPR=0,即ROC曲线(0,0)点;再选择第二个样本点的Score作为阈值,大于等于该阈值的样本(在该样本之前)判为正样本,小于该阈值的判为负样本,计算TPRFRP,可在ROC图画出该点。

    举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。每次选取一个不同的threshold,我们就可以得到一组FPRTPR,即ROC曲线上的一点。这样一来,我们一共得到了20组FPRTPR的值,将它们画在ROC曲线的结果如下图:

    ROC曲线示例
    # ROC曲线和AUC
    fpr, tpr, roc_thresholds = roc_curve(y_true, y_scores)
    plt.figure()
    plt.plot(fpr, tpr, label='ROC Curve')
    plt.plot([0, 1], [0, 1], 'k--', label='Random Classifier')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('ROC Curve')
    plt.legend()
    plt.show()
    roc_auc = auc(fpr, tpr)
    print(f'AUC: {roc_auc:.2f}')
    
  • 意义:(1) 利用ROC曲线比较不同模型,进而选择最佳模型

    • 首先,了解一下ROC曲线图上很重要的四个点:

      1. ( 0 , 1 ) ,即FPR=0, TPR=1,这意味着FN(False Negative)=0,并且FP(False Positive)=0。代表这是一个完美的分类器,它将所有的样本都正确分类。
      2. ( 1 , 0 ) ,即FPR=1,TPR=0,意味着这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。
      3. ( 0 , 0 ) ,即FPR=TPR=0,即FP(False Positive)=TP(True Positive)=0,代表该分类器预测所有的样本都为负样本(Negative)。
      4. ( 1 , 1 ) ,即FPR=TPR=1,代表分类器预测所有的样本都为正样本。

      从上面给出的四个点可以发现:

      • ROC曲线图中,越靠近(0,1)的点对应的模型分类性能越好
      • 此外,注意同一条ROC曲线图中的点对应的模型,它们的不同之处仅仅是在分类时选用的阈值(Threshold)不同,这里的阈值代表样本被预测为正类的概率值。
    • 其次,如何在不同模型之间选择最优模型?=>基于AUC

      • 不同模型对应的ROC曲线中,AUC值大的模型性能相对较好。

      • AUC值近似相等时,并不代表两个模型的分类性能也相等。有两种情况:第一种是ROC曲线之间没有交点;第二种是ROC曲线之间存在交点。

        (1)ROC曲线之间没有交点

        如下图所示,A,B,C三个模型对应的ROC曲线之间交点,且AUC值是不相等的,此时明显更靠近( 0 , 1 )点的A模型的分类性能会更好。

        无交点的ROC曲线性能比较

        (2)ROC曲线之间存在交点

        如下图所示,模型A、B对应的ROC曲线相交却AUC值相等,此时就需要具体问题具体分析:当需要高TPR值时,A模型好过B;当需要低FPR值时,B模型好过A。

        有交点的ROC曲线性能比较
  • 意义:(2) 同一模型中如何选择最优阈值?

    已知:在同一条ROC曲线上,越靠近( 0 , 1 ) 的坐标点对应的模型性能越好,因为此时模型具有较高的真正率和较低的假正率。那么我们如何定量地从一条ROC曲线上找到这个最优的点呢?

    Youden's J统计量:

    Youden index(又称Youden's J statistic)经常应用于ROC 曲线的分析。 ROC 曲线上的每个点根据不同阈值会各自算出这项指标,然后我们把Youden Index 数值最大的那个点视为最佳阈值。

    Youden index (以J表示)的计算公式如下:
    J = t r u e p o s i t i v e s t r u e p o s i t i v e s + f a l s e n e g a t i v e s + t r u e n e g a t i v e s t r u e n e g a t i v e s + f a l s e p o s i t i v e s − 1 J=\frac{\mathrm{true~positives}}{\mathrm{true~positives}+\mathrm{false~negatives}}+\frac{\mathrm{true~negatives}}{\mathrm{true~negatives}+\mathrm{false~positives}}-1 J=true positives+false negativestrue positives+true negatives+false positivestrue negatives1
    ROC 曲线上的指标来呈现的话,正是Y 轴减去X 轴数据:
    J = S e n s i t i v i t y + S p e c i f i c i t y − 1 = T P R − F P R J = Sensitivity+Specificity−1 = TPR - FPR J=Sensitivity+Specificity1=TPRFPR
    Youden Index 亦存在图形上的意义,它代表从ROC 上某一点到45 度完全乱猜线之间的垂直距离,这个垂直距离最大的点,可以视为ROC 曲线的最佳阈值。如下图示,由于45 度线代表TPR = FPR,所以45 度线到ROC 线上某点的垂直距离可以用TPR - FPR计算,此数值也正是Youden index

    # Youden's J统计量最佳阈值
    J = tpr - fpr
    best_J_index = np.argmax(J)
    best_J_threshold = roc_thresholds[best_J_index]
    print(f'Best Youden\'s J Threshold: {best_J_threshold:.2f}')
    print(f'Best Youden\'s J Statistic: {J[best_J_index]:.2f}')
    
  • 优点

    1. 兼顾正例和负例的权衡。因为TPR聚焦于正例,FPR聚焦于与负例,使其成为一个比较均衡的评估方法。
    2. ==ROC曲线选用的两个指标, T P R = T P P = T P T P + F N , F P R = F P N = F P F P + T N TPR=\frac{TP}{P}=\frac{TP}{TP+FN},FPR=\frac{FP}{N}=\frac{FP}{FP+TN} TPR=PTP=TP+FNTP,FPR=NFP=FP+TNFP都不依赖于具体的类别分布(类别分布: 正负类的数量比例)因为TPR用到的TPFN同属P列,FPR用到的FPTN同属N列,所以即使PN的整体数量发生了改变,也不会影响到另一列。也就是说,即使正例与负例的比例发生了很大变化,ROC曲线也不会产生大的变化而像Precision使用的TPFP就分属两列,则易受类别分布改变的影响。==参考文献[1]中举了个例子,负例增加了10倍,ROC曲线没有改变,而PR曲线则变了很多。作者认为这是ROC曲线的优点,即具有鲁棒性,在类别分布发生明显改变的情况下依然能客观地识别出较好的分类器。
ROC曲线不依赖于具体的分布类别-例证
  • 缺点
    1. 上文提到ROC曲线的优点是不会随着类别分布的改变而改变,但这在某种程度上也是其缺点。因为负例N增加了很多,而曲线却没变,这等于产生了大量FP。如果特定应用主要关注正类预测的准确率,也就是Precision的话,这就不可接受了。
    2. 在类别不平衡的背景下,负例的数目众多致使FPR的增长不明显,导致ROC曲线呈现一个过分乐观的效果估计ROC曲线的横轴采用FPR,根据 F P R = F P N = F P F P + T N FPR=\frac{FP}N=\frac{FP}{FP+TN} FPR=NFP=FP+TNFP,即使FP大量增长,如果负例过多(N过大),也可能导致FPR增长不明显,导致ROC曲线显得过分乐观。举个例子,假设一个数据集有正例20,负例10000,开始时有20个负例被错判, F P R = 20 20 + 9980 = 0.002 FPR=\frac{20}{20+9980}=0.002 FPR=20+998020=0.002,接着又有20个负例错判, F P R 2 = 40 40 + 9960 = 0.004 FPR_{2}=\frac{40}{40+9960}=0.004 FPR2=40+996040=0.004,在ROC曲线上这个变化是很细微的。而与此同时Precision则从原来的0.5下降到了0.33,在PR曲线上将会是一个大幅下降。

3.2.1 AUC

  • 指标名称:AUC-ROCArea Under the ROC Curve

  • 定义:AUC表示ROC曲线下的面积,主要用于衡量模型的泛化性能,即分类效果的好坏。**AUC是衡量二分类模型优劣的一种评价指标,表示正例排在负例前面的概率。**一般在分类模型中,预测结果都是以概率的形式表现,如果要计算准确率,通常都会手动设置一个阈值来将对应的概率转化成类别,这个阈值也就很大程度上影响了模型准确率的计算。之所以采用AUC来评价,主要还是考虑到ROC曲线本身并不能直观的说明一个分类器性能的好坏,而AUC值作为一个数量值,具有可比较性,可以进行定量的比较。

  • AUC (AUROC, Area Under the ROC Curve)
    A U R O C = ∑ i = 1 n − 1 ( F P R i + 1 − F P R i ) ⋅ ( T P R i + 1 + T P R i 2 ) \mathrm{AUROC}=\sum_{i=1}^{n-1}(FPR_{i+1}-FPR_i)\cdot\left(\frac{TPR_{i+1}+TPR_i}2\right) AUROC=i=1n1(FPRi+1FPRi)(2TPRi+1+TPRi)

    • F P R i : FPR_i{:} FPRi: False Positive Rate at the i i i-th threshold
    • T P R i : TPR_i{:} TPRi: True Positive Rate at the i i i-th threshold
    • n : n{:} n: Number of thresholds
  • 意义:随机从正样本和负样本中各选一个,分类器对于该正样本打分大于该负样本打分的概率。

  • AUC值对模型性能的判断标准:

    1. AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。

    2. 0.5 < AUC < 1,优于随机猜测。这个分类器妥善设定阈值的话,能有预测价值。

    3. AUC = 0.5,跟随机猜测一样,模型没有预测价值。

    4. AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

      利用AUC来粗略衡量模型整体表现,可以参考以下范围:

      • AUC= 0.5(无鉴别力)
      • 0.7≤AUC≤ 0.80(可接受的鉴别力)
      • 0.8≤AUC≤ 0.90(优良的鉴别力)
      • 0.9≤AUC≤ 1.00(极佳的鉴别力)
  • 问题:AUROC将整条ROC curve 归纳到一个单一的值上,忽略了不同系统之间的Tradeoff(不同threshold值)

4. 对比

4.1 PR Curve v.s. ROC Curve

4.1.1 区别

  1. 关注的指标不同
    • ROC曲线ROC曲线描绘的是真正率(True Positive Rate, TPR)与假正率(False Positive Rate, FPR)之间的关系。它显示的是模型在不同阈值下,如何在正类和负类样本中进行区分。
    • PR曲线:PR曲线描绘的是精确率(Precision)与召回率(Recall)之间的关系。它特别关注模型在正类样本中的表现。
  2. 适用场景不同
    • ROC曲线:适用于类别平衡的验证集以及需要评估整体分类性能的场景。在类别不平衡的数据集上,由于假正率(FPR)的值往往较小,ROC曲线可能会显得过于乐观。
    • PR曲线:适用于类别不平衡的验证集,特别是在关注正类样本时。因为PR曲线直接关注精确率和召回率,能够更好地反映模型在少数类上的表现。
  3. 曲线的解读方式不同
    • ROC曲线:曲线下方的面积(AUC)越大,模型的总体表现越好。完美的分类器会有一条经过左上角的曲线(AUC=1)。
    • PR曲线:曲线下方的面积(AU-PR)越大,模型在正类样本上的表现越好。完美的分类器会有一条经过右上角的曲线(AU-PR=1)。

4.1.2 联系

  • 基于阈值变化:两者都基于改变决策阈值来绘制曲线,通过观察在不同阈值下模型性能的变化来评估模型。
  • 面积衡量性能:两者都通过计算曲线下方的面积(AUCAU-PR)来衡量模型的整体性能。

4.2 AU-PR v.s. AUC

4.2.1 区别

  1. 评估指标不同
    • AUC(Area Under the ROC Curve):衡量ROC曲线下的面积,反映模型在区分正类和负类样本上的能力
    • AU-PR(Area Under the Precision-Recall Curve):衡量PR曲线下的面积,反映模型在正类样本上的精确度和召回率的综合表现
  2. 适用数据集不同
    • AUC:在类别平衡或近似平衡验证数据集上,AUC是一个很好的评估指标。
    • AU-PR:在类别不平衡验证数据集上,AU-PR更能反映模型在少数类上的性能。

4.2.2 联系

  • 用于模型评估:两者都是用于评估分类模型性能的指标,通过曲线下的面积提供一个综合的性能评估。
  • 基于阈值变化:两者都依赖于通过改变决策阈值来评估模型在不同条件下的表现。

5. 结论

  1. ROC曲线兼顾正例与负例,因此适用于评估分类器整体的效能,而PR 曲线则专注于正例
    • 若在类别平衡且正例及负例的判断都重要的情况下,选择ROC 曲线更合理
    • 由于ROC 曲线的X轴使用到了FPR,在类别不平衡的情况下(负样本较多),使得FPR的增长会被稀释,进而导致ROC曲线呈现出过度乐观的结果,因此在类别不平衡的情况下,PR 曲线是较好的选择
    • 总结:类别不平衡问题中由于主要关心正例,所以在此情况下PR曲线被广泛认为优于ROC曲线。
  2. 如果有多份数据且存在不同的类别分布,比如信用卡欺诈问题中每个月正例和负例的比例可能都不相同,这时候如果只想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较;反之,如果想测试不同类别分布下对分类器的性能的影响,则PR曲线比较适合
  3. 如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线。
  4. 最后可以根据具体的应用,在曲线上找到最优的点,得到相对应的precision,recall,f1 score等指标,去调整模型的阈值,从而得到一个符合具体应用的模型。

6. 总结

在图像异常检测任务中,常用的评估算法分类性能的指标如下:

6.1 阈值无关

  • PR Curve(the Precision-Recall Curve))

  • ROC Curve

  • AUPR (Area Under the Precision-Recall Curve): 适用于类别不平衡的数据集,相较于AUC更合理。

    注意:AP (Average Precision)AUPR 的效果很相似,也可以用AP代替。

    A U P R = ∑ i = 1 n − 1 ( R i + 1 − R i ) ⋅ ( P i + 1 + P i 2 ) \mathrm{AUPR}=\sum_{i=1}^{n-1}(R_{i+1}-R_i)\cdot\left(\frac{P_{i+1}+P_i}2\right) AUPR=i=1n1(Ri+1Ri)(2Pi+1+Pi)

    • R i R_i Ri:Recall at the i i i-th threshold
    • P i : P_i{:} Pi: Precision at the i i i-th threshold
    • n n n: Number of thresholds
  • AUC (AUROC, Area Under the ROC Curve): 历史遗留问题
    A U R O C = ∑ i = 1 n − 1 ( F P R i + 1 − F P R i ) ⋅ ( T P R i + 1 + T P R i 2 ) \mathrm{AUROC}=\sum_{i=1}^{n-1}(FPR_{i+1}-FPR_i)\cdot\left(\frac{TPR_{i+1}+TPR_i}2\right) AUROC=i=1n1(FPRi+1FPRi)(2TPRi+1+TPRi)

    • F P R i : FPR_i{:} FPRi: False Positive Rate at the i i i-th threshold
    • T P R i : TPR_i{:} TPRi: True Positive Rate at the i i i-th threshold
    • n : n{:} n: Number of thresholds

6.2 阈值相关

选定一个阈值后,超过这个阈值的图像被判定为异常,小于这个阈值的图像被判定为正常,由此可以计算如下指标。

  • F1-Score
    F 1 S c o r e = 2 ⋅ P r e c i s i o n ⋅ R e c a l l P r e c i s i o n + R e c a l l F1Score=\frac{2\cdot Precision\cdot Recall}{Precision+Recall} F1Score=Precision+Recall2PrecisionRecall

  • Precision
    P r e c i s i o n = T P T P + F P Precision=\frac{TP}{TP+FP} Precision=TP+FPTP

  • Recall (又名TPR, True Positive Rate)
    R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP

  • FPR (False Positive Rate, 又名误检率/误诊率)
    F P R = F P F P + T N FPR=\frac{FP}{FP+TN} FPR=FP+TNFP
    公式中TP、FP、FN 的含义:

    • TP: the count of images correctly classified as anomalous
    • FP: the count of images incorrectly classified as anomalous
    • FN: the count of images incorrectly classified as normal

6.3 总结

应对于工业需求,上述指标我们主要关注阈值相关的召回率Recall和误诊率FPR召回率高保证了异常样本查得全,误诊率低保证前面的查的全不是以“把大量正常样本预测为异常样本”而得到的虚假繁荣。而这不就是ROC Curve的横纵坐标吗?

7. 参考资料

  1. https://blog.csdn.net/qq_30992103/article/details/99730059
  2. https://tsupei.github.io/nlp/2019/12/30/prcurve.html
  3. https://www.cnblogs.com/massquantity/p/8592091.html
  4. https://blog.csdn.net/universsky2015/article/details/137303932
  5. https://blog.csdn.net/u013230291/article/details/108555329
  6. https://www.cnblogs.com/pythonfl/p/12286742.html
  7. https://blog.csdn.net/weixin_42267615/article/details/107834639
  8. https://blog.csdn.net/Jasminexjf/article/details/88681444
  9. https://blog.csdn.net/whether_you/article/details/80571485
  10. https://blog.csdn.net/KANG157/article/details/130674038
  11. https://blog.csdn.net/qq_41804812/article/details/125255346
  12. https://blog.csdn.net/taotiezhengfeng/article/details/80456110
  13. https://blog.csdn.net/w1301100424/article/details/84546194
  14. https://microstrong.blog.csdn.net/article/details/79946787
  15. https://www.zybuluo.com/frank-shaw/note/152851
  16. https://www.zhihu.com/question/39840928?from=profile_question_card
  17. https://www.dataschool.io/roc-curves-and-auc-explained/
  18. https://blog.csdn.net/m0_55434618/article/details/133971872
  19. https://blog.csdn.net/weixin_44609958/article/details/136739187
  20. https://blog.csdn.net/hjxu2016/article/details/131789657
  21. https://github.com/openvinotoolkit/anomalib
    details/80456110
  22. https://blog.csdn.net/w1301100424/article/details/84546194
  23. https://microstrong.blog.csdn.net/article/details/79946787
  24. https://www.zybuluo.com/frank-shaw/note/152851
  25. https://www.zhihu.com/question/39840928?from=profile_question_card
  26. https://www.dataschool.io/roc-curves-and-auc-explained/
  27. https://blog.csdn.net/m0_55434618/article/details/133971872
  28. https://blog.csdn.net/weixin_44609958/article/details/136739187
  29. https://blog.csdn.net/hjxu2016/article/details/131789657
  30. https://github.com/openvinotoolkit/anomalib
  31. https://blog.csdn.net/weixin_42010722/article/details/133924723

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/56201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ST7789读取ID错误新思路(以STC32G为例)

1.前言 前两天刚把ST7789写入搞定&#xff0c;这两天想折腾一下读取。最开始是读ID&#xff0c;先是用厂家送的程序&#xff0c;程序里面用的是模拟I8080协议&#xff0c;一切正常。后来我用STC32G的内置LCM模块&#xff0c;发现读取不出来。更神奇的是ID读不出来&#xff0c;…

[项目详解][boost搜索引擎#2] 建立index | 安装分词工具cppjieba | 实现倒排索引

目录 编写建立索引的模块 Index 1. 设计节点 2.基本结构 3.(难点) 构建索引 1. 构建正排索引&#xff08;BuildForwardIndex&#xff09; 2.❗构建倒排索引 3.1 cppjieba分词工具的安装和使用 3.2 引入cppjieba到项目中 倒排索引代码 本篇文章&#xff0c;我们将继续项…

【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数

引言 拷贝构造函数是C中一个重要的特性&#xff0c;它允许一个对象通过另一个已创建好的同类型对象来初始化。 了解拷贝构造函数的概念、作用、特点、规则、默认行为以及如何自定义实现&#xff0c;对于编写健壮和高效的C程序至关重要。 C类和对象系列文章&#xff0c;可点击下…

GitLab+Jenkins 实现 Webhook 自动化触发构建

在持续集成和持续部署&#xff08;CI/CD&#xff09;过程中&#xff0c;如何实现代码提交后自动触发构建&#xff1f;今天&#xff0c;我们将通过GitLab与Jenkins的集成&#xff0c;利用Webhook实现自动化触发构建&#xff0c;为你的开发流程注入高效能量&#xff01; 在每次代…

Java 多线程(六)—— 线程池 和 工厂模式

线程池 随着现代计算机的发展&#xff0c;任务越来越多&#xff0c;线程创建也逐渐增加&#xff0c;每次让操作系统创建线程这个开销就有点大&#xff0c;因此&#xff0c;我们诞生了线程池的概念&#xff0c;线程池里面有很多线程&#xff0c;这些线程可以被用户去调用执行任…

Java最全面试题->Java基础面试题->JavaSE面试题->异常面试题

文章目录 异常1.说一下Java中的异常体系&#xff1f;2.Error和Exception的区别3.写出你最常见的 5 个 RuntimeException&#xff1f;4.如何处理异常?5.try()里面有⼀个return语句&#xff0c; 那么后面的finally{}里面的代码会不会被执行&#xff1f;什么时候执行&#xff0c;…

C++ 进阶:类相关特性的深入探讨

⭐在对C 中类的6个默认成员函数有了初步了解之后&#xff0c;现在我们进行对类相关特性的深入探讨&#xff01; &#x1f525;&#x1f525;&#x1f525;【C】类的默认成员函数&#xff1a;深入剖析与应用&#xff08;上&#xff09; 【C】类的默认成员函数&#xff1a;深入剖…

初阶数据结构【3】--单链表(比顺序表还好的一种数据结构!!!)

本章概述 前情回顾单链表实现单链表彩蛋时刻&#xff01;&#xff01;&#xff01; 前情回顾 咱们在上一章博客点击&#xff1a;《顺序表》的末尾&#xff0c;提出了一个问题&#xff0c;讲出了顺序表的缺点——有点浪费空间。所以&#xff0c;为了解决这个问题&#xff0c;我…

TypeScript 出现过的问题

不能将类型“unknown”分配给类型“string”。 不能直接将类型“unknown”分配给类型“string” /**** 【1 - 问题】会画红波浪线 ****/ window.document.title to?.meta?.title || /**** 【2 - 解决】解决红波浪线 ****/ const title: unknown to?.meta?.title || if …

QML 基本动画

在介绍完 QML 动画框架之后,现在我们来看看具体的动画及其用法。先从最常用的基本动画入手,这些动画包括:PropertyAnimation、ColorAnimation、Vector3dAnimation 和 PathAnimation 等,它们不仅能够帮助我们轻松地为应用程序添加动态效果,还能显著提升用户体验,使得界面更…

vue3 解决背景图与窗口留有间隙的问题

需要实现一个登录界面&#xff0c;login.vue的代码如下&#xff1a; <script> import { ref } from vue;export default {setup() {return {};}, }; </script><template><div id"login-container" class"login-container"><di…

中国古代数学的杰出研究成果之一 - 杨辉三角 - 怎么用go、C++进行编程解决

杨辉三角&#xff0c;又称帕斯卡三角形&#xff08;Pascals Triangle&#xff09;&#xff0c;是组合数学中的一个重要概念。它是一个三角形数组&#xff0c;其中每个数字是它上方左上方和右上方的数字之和。杨辉三角的每一行都代表了二项式展开式的系数&#xff0c;因此在数学…

利用 OBS 推送 WEBRTC 流到 smart rtmpd

webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…

ubuntu 开启haproxy UI

一、修改haproxy.cfg nano /etc/haproxy/haproxy.cfg 添加一段 listen statsbind *:8080stats enablestats uri /uistats refresh 10sstats auth admin:123456stats admin if TRUE 重启 sudo systemctl restart haproxy 浏览器访问&#xff1a; http://192.168.31.182:80…

搜维尔科技:SenseGlove触觉反馈数据手套的用途和作用

无论是VR培训、遥控机器人、研究还是营销&#xff0c;我们的VR触觉手套都能让虚拟世界更具沉浸感和吸引力。借助我们的硬件和直观的软件开发工具&#xff0c;研究人员和开发人员可以创建真正的触觉交互。 VR培训 使用 SenseGlove进行虚拟现实训练可产生与现实训练类似的效果&a…

MySQL-CRUD-基础-(详解) ┗( ▔, ▔ )┛

目录 ❄️一、新增&#xff08;Create&#xff09;&#xff1a; ☑ 1、单行数据 全列插入&#xff1a; ☑ 2、指定列插入&#xff1a; ☑ 3、多行插入&#xff1a; ❄️二、查询&#xff08;Retrieve&#xff09;&#xff1a; ☑ 1、全列查询&#xff1a; ☑ 2、指定列查询&a…

【数据结构与算法】走进数据结构的“时间胶囊”——栈

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 引言 一.栈的基本概念 1.1 定义 1.2 特性 1.3 基本操作 二.栈的实现方式 2.1 顺序栈 2.2 链栈 三.顺序栈的实现 定义顺序栈的结构 初始化 入栈 检查栈是否为空 出栈 销毁 四.链栈的实现 定义链栈的结构 初始…

新版idea菜单栏展开与合并

新版idea把菜单栏合并了看着很是不习惯&#xff0c;找了半天原来在这里展开 ① 点击文件 -> 设置 ② 点击外观与行为 -> 外观 -> 合并主菜单和窗口标题 然后确定&#xff0c;重启即可

戴维南,叠加,稳态笔记

一点点学习笔记,仅做个人复习使用 节点电压分清电流电压源&#xff0c;电流源才能写在右边&#xff0c;容易混淆 叠加定理仅适用于线性电路&#xff0c;且不能用于计算功率&#xff0c;主要是方向&#xff0c;要看源的方向判断等效之后的&#xff0c;受控源不参与除源&#x…

数据库表的创建

运用的环境是pychram python3.11.4 创建一个表需要用到以下语法 注释已经写清楚各种语法的含义&#xff0c;记住缩进是你程序运行的关键&#xff0c;因为程序是看你的缩进来判断你的运行逻辑&#xff0c;像我这个就是缩进不合理导致的报错 那么今天分享就到这里&#xff0c;谢…