介绍机器学习中分类模型常用的评价指标:AUC、Precision-Recall, ACC和KS值。

评估指标和代价函数的关系

代价函数,又称Cost function,loss function objective function。一般用在训练过程中,用来定义预测值和真实值之间的距离(也就是衡量模型在训练集上的性能),作为模型调整参数的反馈。代价函数越小,模型性能越好。

评判指标,一般用于训练和测试过程中,用于评估模型好坏。评判指标越大(或越小),模型越好。

相同点:

本质上代价函数和评判指标都是一家人,只他们的应用场景不同,分工不同。代价函数是用来优化模型参数的,评价指标是用来评判模型好坏的。

不同点:

作为代价函数所具备的条件:函数光滑且可导:可用梯度下降求解极值;函数为凸函数:可用梯度下降求解最优解。我们经常使用的分类器评判指标 AUC 就不能直接被优化,因此我们常采用交叉熵来代替 AUC 进行优化。 一般情况下,交叉熵越小,AUC 就会越大。

ROC曲线和AUC值

ROC全称是“受试者工作特征”(Receiver Operating Characteristic)。ROC曲线的面积就是AUC(Area Under the Curve)。AUC用于衡量“二分类问题”机器学习算法性能(泛化能力)。说到这里不得不提及就是经常使用的符号,TP(True Positive), FP(False, Positive), TN(True Negative),FN(False Negative)。他们是根据真实数据类别和模型预测类别进行的排列组合。

(1)定义

ROC 曲线(接收者操作特征曲线)是一种显示分类模型在所有分类阈值下的效果的图表。该曲线绘制了以下两个参数:真正例率 和 假正例率。真正例率 (TPR) 是召回率的同义词,数学表达为: $$ T P R = \frac { T P } { T P + F N } $$ 假正例率 (FPR) 的定义如下: $$ F P R = \frac { F P } { F P + T N } $$

TPR 是所有真实样本中被预测为真实样本的比例;FPR是所有虚假样本中被预测为真实样本的概率。可以使用混淆矩阵表示上述的关系:

image-20201116173156765

图中第一类错误和第二类措施是假设检验中的概念。第一类错误是原来假设是错误的,但是却被认为是正确的;第二类错误是原来的假设是正确的,但是被认为是错误的。

(2)ROC 曲线是如何绘制的

采用不同分类阈值时的 TPR 与 FPR。降低分类阈值会导致将更多样本归为正类别,从而增加假正例(FP)和真正例(TP)的个数,可以理解为降低了被认为正确的标准,数量自然就增多了。下图显示了一个典型的 ROC 曲线。注意观察图中TPR 和 FPR是呈正相关的,验证了上述的结论。

1.png

为了计算 ROC 曲线上的点,我们可以使用不同的分类阈值多次评估逻辑回归模型,但这样做效率非常低。幸运的是,有一种基于排序的高效算法可以为我们提供此类信息,这种算法称为曲线下面积。最理想的目标:tpr =1, fpr =0,即图中的 (0, 1) 点, 故 ROC 曲线越靠近(0, 1 ) 点,分类效果越好。关于该图像还有一点,如果你的曲线拟合对角线(图中虚线),那么相当于随机猜测。

阈值设定的两种方法

1). 等距离阈值,range(0, 1, 100) 生成了100 个阈值,那么对应着p-r 中的100 个点 2). 二分类结果是模型的概率值,对概率值进行排序,依次使用这些概率值作为阈值,也是可以得到不同的点的坐标。

(3)基于sklearn 绘制ROC曲线

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
gbc = GradientBoostingClassifier()
gbc.fit(x_train, y_train)
resu = gbc.predict(x_test)  #进行预测
y_pred_gbc = gbc.predict_proba(x_test)[:,1]  ###这玩意就是预测概率的
fpr, tpr, threshold = roc_curve(y_test, y_pred_gbc)   ###画图的时候要用预测的概率,而不是你的预测的值
plt.plot(fpr, tpr, 'b', label='AUC = %0.2f' % rocauc)#生成ROC曲线
plt.legend(loc='lower right')
plt.plot([0, 1], [0, 1], 'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('真正率')
plt.xlabel('假正率')
plt.show()

一般来说,如果ROC曲线是光滑的,那么基本可以判断没有太大的overfitting(比如下图中0.2到0.4可能就有问题,但是样本太少了),这个时候调模型可以只看AUC,面积越大一般认为模型越好。

1.jpg

(4)AUC 数值

Alternatively, it can be shown that ROC AUC score is equivalent to calculating the rank correlation between predictions and targets. From an interpretation standpoint, it is more useful because it tells us that this metric shows how good at ranking predictions your model is. It tells you what is the probability that a randomly chosen positive instance is ranked higher than a randomly chosen negative instance.

对于AUC 有两类解释:

  • 从ROC 线下面积理解:AUC量化了ROC曲线表达的分类能力;
  • 从概率角度理解:AUC就是从所有正样本(类别1)中随机选取一个样本, 从所有负样本(类别0)样本中随机选取一个样本,然后根据你的分类器对两个随机样本进行预测,把1样本预测为1的概率为 $ p_1$,把0样本预测为1的概率为 $p_0$,$p1>p0 $的概率就等于AUC。所以AUC 反应的是分类器的排序能力。例如0.7的AUC,其含义可以大概理解为:给定一个正样本和一个负样本,在70%的情况下,模型对正样本的打分高于对负样本的打分。可以看出在这个解释下,我们关心的只有正负样本之间的分数高低,而具体的分值则无关紧要。

AUC 的优点:不关注具体得分,只关注排序结果,这使得它特别适用于排序问题的效果评估,例如推荐排序的评估,CTR的线下评估

AUC的缺点: AUC只关注正负样本之间的排序,并不关心正样本内部,或者负样本内部的排序。这也体现了AUC的本质:任意个正样本的概率都大于负样本的概率的能力。

(5)应用场景

You should use it when you ultimately care about ranking predictions and not necessarily about outputting well-calibrated probabilities You should not use it when your data is heavily imbalanced. The intuition is the following: false positive rate for highly imbalanced datasets is pulled down due to a large number of true negatives. You should use it when you care equally about positive and negative classes.

Precision-Recall

在分类模型评价中还有一个曲线:PR曲线。同样使用混淆矩阵中的参数定义如下: $$ \text { Precision }=\frac{\mathrm{TP}}{\mathrm{TP}+\mathrm{FP}} $$

准确率(precision)表示预测的样本中正样本的比例。(在所有预测的结果中,预测正确的比例) $$ \text { Recall }=\frac{\mathrm{TP}}{\mathrm{TP}+\mathrm{FN}} $$

召回(recall)表示真实为正样本被预测为正样本的比例。(在所有真正的样本中,预测正确的比例)

AUC曲线中有 ROC值,类似的,P-R曲线中也有F 值,定义$F_{\beta}$分数为 $$ F_{\beta}=\left(1+\beta^{2}\right) \cdot \frac{\text {precision} \cdot \text {recall}}{\left(\beta^{2} \cdot \text {precision}\right)+\text {recall}} $$ $F_β$的物理意义就是将准确率和召回率这两个分值合并为一个分值,在合并的过程中,召回率的权重是准确率的 $β $倍。F1分数认为召回率和准确率同等重要,F2分数认为召回率的重要程度是准确率的2倍,而 $F_{0.5}$分数认为召回率的重要程度是准确率的一半。

实际中使$F_1$更加常见,即当$ \beta =1$时候。 $$ F_{\beta}= \frac{ 2 \cdot \text{Precision} \cdot \text{Recall}}{ \text{Precision} + \text{Recall}} $$

同样使用不同的阀值,统计出精确率和召回率。如下图:

1.png

准确率应用场景:

如果做疾病监测、反欺诈,这种情况下正负样本严重失衡,则是保准确率的条件下,提升召回。

召回率应用场景:

  • 如果是做搜索,那么需要保证召回的条件下,提升准确率。因为即使召回的不是正样本,那么也没有很大的影响。
  • 如果是精准营销领域的商品推荐模型,模型目的是尽量将商品推荐给感兴趣的用户,若用户对推荐的商品不感兴趣,也不会有很大损失,因此此时TPR相对FPR更重要。

有时候你希望模型能够正确分类对(high precision);有时候你希望模型能够尽可能得到所有的样本(high recall)。所以需要在这两者之间进行平衡。

使用场景

  • when you want to communicate precision/recall decision to other stakeholders
  • when you want to choose the threshold that fits the business problem.
  • when your data is heavily imbalanced. As mentioned before, it was discussed extensively in this article by Takaya Saito and Marc Rehmsmeier. The intuition is the following: since PR AUC focuses mainly on the positive class (PPV and TPR) it cares less about the frequent negative class.
  • when you care more about positive than negative class. If you care more about the positive class and hence PPV and TPR you should go with Precision-Recall curve and PR AUC (average precision).

基于 keras 的算法实现。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
def recall(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    recall = true_positives / (possible_positives + K.epsilon())
    return recall

def precision(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    return precision

def f1(y_true, y_pred):
    p = precision(y_true, y_pred)
    r = recall(y_true, y_pred)
    return 2*((p*r)/(p+r+K.epsilon()))

PR和ROC联系和区别

(1)联系 1). 对于一个给定的的数据集,ROC空间和PR空间存在一一对应的关系,因为二者包含完全一致的混淆矩阵。我们可以将ROC曲线转化为PR曲线,反之亦然。 2). 都有一个曲线和一个数值进行衡量:F1对于PRC就好象AUC对于ROC一样。 (2)区别 1). 最大的区别:在正负样本分布得极不均匀(highly skewed datasets)的情况下,PRC比ROC能更有效地反应分类器的好坏。 2). 图像上区别

  • PR 曲线是以Precision 为纵轴,Recall 为横轴;而 ROC曲线则是以TPR 为纵轴,FPR 为横轴。
  • “曲线A优于曲线B” 是指曲线 B 的所有部分与曲线 A 重合或在曲线 A 之下。而在ROC空间,ROC曲线越凸向左上方向效果越好。与ROC曲线左上凸不同的是,PR曲线是右上凸效果越好。

3). 代码实现上

1
2
3
4
5
6
import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0, 5, 0.1)
y = np.sin(x)
plt.plot(x, y)

ROC 曲线

1
2
3
4
5
6
fpr, tpr, thresholds = roc_curve(testy, probs)
pyplot.plot([0, 1], [0, 1], linestyle='--')
pyplot.plot(fpr, tpr, marker='.')
pyplot.show()
auc_score = roc_auc_score(testy, probs)
print('AUC: %.3f' % auc_score)

P-R曲线

1
2
3
4
5
pyplot.plot([0, 1], [0.5, 0.5], linestyle='--')
pyplot.plot(recall, precision, marker='.')
pyplot.show()
print('AUC: %.3f' % auc_score)

当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。ROC能够尽量降低不同测试集带来的干扰,更加客观的衡量模型本身的性能。如果在实际应用中更加关注正样本的表现,那么P-R曲线更加适合。

总体来说ROC曲线的适用场景更多,被广泛用于排序、推荐、广告等领域。但需要注意的是,选择P-R曲线还是ROC曲线是因实际问题而异的,如果研究者希望更多地看到模型在特定数据集上的表现,P-R曲线则能够更直观地反映其性能。

(4)针对样本不均衡问题

当样本不均衡时候,使用ACC 肯定是bad choice,这个时候可以尝试使用ROC。当样本极大不均衡且更加关注正样本(正样本少)时候,P-R曲线是更好的选择。

三大相关系数

(1)Person correlation coefficient(皮尔森相关性系数)

Covariance

1
cov(X, Y) = (sum (x - mean(X)) * (y - mean(Y)) ) * 1/(n-1)

The use of the mean in the calculation suggests the need for each data sample to have a Gaussian or Gaussian-like distribution.

The Pearson’s correlation coefficient is calculated as the covariance of the two variables divided by the product of the standard deviation of each data sample. It is the normalization of the covariance between the two variables to give an interpretable score. Person 相关系数等于各自的协方差除以各自的标准差的乘积。

$$ \begin{aligned} \rho (X, Y) &=\frac{\operatorname{cov}(X, Y)}{\sigma X \sigma Y} =\frac{E\left(\left(X-\mu_{X}\right)(Y-\mu Y)\right)}{\sigma X \sigma Y} \\
&=\frac{E(X Y-E(X) E(Y)}{\sqrt{E\left(X^{2}\right)-E^{2}(X)} \sqrt{E\left(Y^{2}\right)-E^{2}(Y)}} \end{aligned} $$

The coefficient returns a value between -1 and 1 that represents the limits of correlation from a full negative correlation to a full positive correlation. A value of 0 means no correlation. The value must be interpreted, where often a value below -0.5 or above 0.5 indicates a notable correlation, and values below those values suggests a less notable correlation. 结果的绝对值表示相关程度的大小,越接近1 那么相关性越大,越接近0,相关性越小。正负号表示正相关或负相关。正相关性意味着同增同减,负相关性意味着两个变量增减性质相反,数值为0 (从公式中知道实际上是协方差矩阵为0)意味着两者没有线性相关性。

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# calculate the Pearson's correlation between two variables
from numpy.random import randn
from numpy.random import seed
from scipy.stats import pearsonr
# seed random number generator
seed(1)
# prepare data
data1 = 20 * randn(1000) + 100
data2 = data1 + (10 * randn(1000) + 50)
# calculate Pearson's correlation
corr, _ = pearsonr(data1, data2)
print('Pearsons correlation: %.3f' % corr)
# 0.88

使用的要求和范围

  • 计算公式中使用到了均值和方差,所以该洗漱需要满足 Gaussian or Gaussian-like distribution.(严格说这条约束是协方差矩阵所需要的)
  • 只能检测到数据之间的线性关系

(2)Spearman correlation coefficient(斯皮尔曼相关性系数)

Spearman相关性系数是一种秩相关系数,“秩”可以理解为一种顺序或者排序。同样值域也是在 $[1, 1] $之间,含义和Person 系数是一致的。

计算流程 Spearman 相关系数的计算和 Person 相关系数基本一致,只是使用特征的排序结果代替了原始的值。比如给定三个值:30,50,10,它们的等级就分别是2,3,1,则计算时用2,3,1。当变量为离散变量的时候,可以表示为以下的形式: $$ \rho_{S}=\frac{\sum_{i=1}^{N}\left(R_{i}-\bar{R}\right)\left(S_{i}-\bar{S}\right)}{\left[\sum_{i=1}^{N}\left(R_{i}-\bar{R}\right)^{2} \sum_{i=1}^{N}\left(S_{i}-\bar{S}\right)^{2}\right]^{\frac{1}{2}}} $$

其中 $R_i$ 和$S_i$分别是观测值 $i$取值的等级,$ \bar{R} $ 和$\bar{S} $是变量 $x$ 和变量 $y$ 的平均等级,$N$ 是观测值的总数量。

使用范围

  • 当数据之间不满足高斯分布也可以使用,比如数据错误或者极端值(因为计算的是排序之后的结果而不是数据本身)
  • 当数据之间不具备线性相关性

可以发现Spearman 相关性的使用场景正好和Person 相关系数相反。那么Spearman 是否可以使用在线性场景呢? 答案是效果并不好。所以Person 相关系数的使用范围并不是 Spearman的子集,两者更像是一种并集。

调用 api 实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
from numpy.random import rand
from numpy.random import seed
from scipy.stats import spearmanr
# seed random number generator
seed(1)
# prepare data
data1 = rand(1000) * 20
data2 = data1 + (rand(1000) * 10)
# calculate spearman's correlation
coef, p = spearmanr(data1, data2)
print('Spearmans correlation coefficient: %.3f' % coef)
# interpret the significance
alpha = 0.05
if p > alpha:
	print('Samples are uncorrelated (fail to reject H0) p=%.3f' % p)
else:
	print('Samples are correlated (reject H0) p=%.3f' % p)

Running the example calculates the Spearman’s correlation coefficient between the two variables in the test dataset. The statistical test reports a strong positive correlation with a value of 0.9. The p-value is close to zero, which means that the likelihood of observing the data given that the samples are uncorrelated is very unlikely (e.g. 95% confidence) and that we can reject the null hypothesis that the samples are uncorrelated.

··· Spearmans correlation coefficient: 0.900 Samples are correlated (reject H0) p=0.000 ··· 返回两个值: Spearmans 相关系数和拒绝原假设的可能性p

(3)上述两个指标的的联系和区别

联系:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
import pandas as pd
import scipy.stats

# Create two lists of random values
x = [1,2,3,4,5,6,7,8,9]
y = [2,1,2,4.5,7,6.5,6,9,9.5]



# Create a function that takes in x's and y's
def spearmans_rank_correlation(xs, ys):
    # Calculate the rank of x's
    xranks = pd.Series(xs).rank()
    # Caclulate the ranking of the y's
    yranks = pd.Series(ys).rank()
    # Calculate Pearson's correlation coefficient on the ranked versions of the data
    return scipy.stats.pearsonr(xranks, yranks)
    
# Run the function
spearmans_rank_correlation(x, y)[0]
# 0.90377360145618091
# Just to check our results, here it Spearman's using Scipy
scipy.stats.spearmanr(x, y)[0]

#0.90377360145618102   

Spearman’s rank correlation is the Pearson’s correlation coefficient of the ranked version of the variables. 可以看出 Spearman’s 是Pearson’s rank 之后的结果

区别:

The Spearman’s rank correlation is a non-parametric test so there are no requirements of the distributions of the variables to be tested. On the other hand, in a Pearson’s correlation test, there is assumed to be a linear relationship between two variables. However, the Spearman’s rank correlation test can identify non-linear relationships between two variables. 如果原来的分布不符合高斯分布,那么使用Spearmans看看。

(4)Kendall correlation coefficient(肯德尔相关性系数)

Kendall 相关系数也会是一种秩相关。排序一致,取值为1, 排序完全相反则为-1. 无序分类变量:比如性别(男、女)、血型(A、B、O、AB);有序分类变量:比如肥胖等级(重度肥胖,中度肥胖、轻度肥胖、不肥胖)。Kendall 相关系数是针对有序分类变量的。

比如评委对选手的评分(优、中、差等),我们想看两个(或者多个)评委对几位选手的评价标准是否一致;或者医院的尿糖化验报告,想检验各个医院对尿糖的化验结果是否一致,这时候就可以使用肯德尔相关性系数进行衡量。

1
2
3
4
5
6
import pandas as pd
import numpy as np
#原始数据
x= pd.Series([3,1,2,2,1,3])
y= pd.Series([1,2,3,2,1,1])
r = x.corr(y,method="kendall") #-0.2611165

可以发现两个评委对选手的的看法是相反的,但是这种程度不大。

使用场景:用于反映分类变量相关性的指标,即对有序序列的相关系数,非正太分布的数据

(4) 观点

数据经过标准化($ \mu =0, \sigma =1$)之后,Pearson相关性系数、cosine 相关度和欧氏距离的平方可以认为是等价的。个人经验:一般在低维度优先使用标准化之后的欧氏距离,在高维度使用Pearson相关系数更合适。

Correlation quantifies this association, often as a measure between the values -1 to 1 for perfectly negatively correlated and perfectly positively correlated. The calculated correlation is referred to as the “correlation coefficient.” This correlation coefficient can then be interpreted to describe the measures. 相关系数值的定义

The correlation between two variables that each have a Gaussian distribution can be calculated using standard methods such as the Pearson’s correlation. This procedure cannot be used for data that does not have a Gaussian distribution. Instead, rank correlation methods must be used. 当不符合高斯分布的时候,就不能使用Pearson’s 相关系数,可以尝试使用 rank correlation。

Spearman’s Rho 和

The correlation between two variables that each have a Gaussian distribution can be calculated using standard methods such as the Pearson’s correlation.

The correlation between two variables that each have a Gaussian distribution can be calculated using standard methods such as the Pearson’s correlation. This procedure cannot be used for data that does not have a Gaussian distribution. Instead, rank correlation methods must be used.

How to Calculate Nonparametric Rank Correlation in Python

其他指标

(1) ACC

ACC 是在分类中熟悉的,但是不是那么常用。缺点主要有以下两点:

  • 正负样本失衡时候,比较难正确衡量模型的优劣。
  • 很多机器学习模型分类的结果都是概率,如果要计算ACC,那么需要手动设置阈值,该超参数的设置很大程度上影响了 accuracy的计算。

(2)logloss

logloss衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。与AUC不同,logloss对预测概率本身敏感。从比较的意义上,logloss 主要评估预测是否准确,auc用来评估把正样本排到负样本前面的能力。举个例子:真实值是1 1 0 1 预测值 为 0.5 0.5 0.3 0.5,另外提升之后的预测值是 0.7 0.7 0.4 0.7。两个版本的auc 都是1,但是logloss 有了很大的提升。总结为:预测值乘以一个倍数,这种相互的排序关系没有改变,但是logloss 会改变。

(3)KS曲线

KS值是在模型中用于区分预测正负样本分隔程度的评价指标,一般应用于金融风控领域。KS曲线以阈值作为横坐标,以FPR和TPR作为纵坐标,KS曲线则为TPR-FPR,KS曲线的最大值通常为KS值。与ROC曲线相似,通过改变不同阈值可以得到曲线。

如何求解KS值呢?我们知道,当阈值减小时,TPR和FPR会同时减小,当阈值增大时,TPR和FPR会同时增大。而在实际工程中,我们希望TPR更大一些,FPR更小一些,即TPR-FPR越大越好,即ks值越大越好。

KS值的取值范围是[0,1]。通常来说,值越大,模型区分正负样本的能力越强(一般0.3以上,说明模型的效果比较好)。

(4)马修斯相关系数 (Matthews Correlation Coefficient,MCC)

可以看出该指标也是根据混淆矩阵计算得来的。

$$ MCC= \frac{ tp * tn - fp * fn}{( tp +fp)( tp + fn )( tn + fp)( tn + fn)} $$

mcc_by_thres.png

如果接近+1 ,表示完美预测;如果接近0,那么相当于随机猜测;如果接近于-1,那么说明预测和观察之间的完全不一样。

计算

1
2
3
from sklearn.metrics import matthews_corrcoef
y_pred_class = y_pred_pos > threshold
matthews_corrcoef(y_true, y_pred_class)

使用场景:

  • When working on imbalanced problems,
  • When you want to have something easily interpretable.

(4)macro vs weighted

macro 和weighted 是求解方式不同,表示有没有weight权重的形式。前者是平均求解,后者是有权重的计算。可以任意搭配precision,recall 和F1。主要涉及原始数据是否 balance,如果原始数据是balanced,那么两者相差不大,否则 weighted 是更加合理的计算方法.

检测和跟踪评价指标

在这里,检测包括 2D检测和 3D 检测。跟踪表示多目标跟踪(MOT)。

检测中最常用的检测指标 - 平均精度 mAP, Mean Average Precision

每张图像中包含多个不同类别的不同物体,所以分类问题中的精度指标是不能直接适用的。map 是所有类别的平均精度值的均值。

map 具体实现

kitti 数据集中的检测指标含义

1
2
3
4
5
bbox: 2D 检测框的准确率
bev:bev 视角下检测框的准确率
3d: 3D检测框的准确率
aos:检测目标旋转角度的准确率

easy, medium, hard

基本上是根据 pixs 的大小进行的划分

easy:2D 框高度大于 40 pixs, 遮挡等级最低的 objects;

medium:2D框高于 25pixs,遮挡等级 0、1 的物体

hard:包含 2D 高于 25pixs,遮挡等级 0-2 的物体。

MOT 的输出需要满足的条件

  • detection 发现物体
  • localization 定位物体
  • association 在视频序列中辨别关联出同一物体

MOT 测量,包括两个评价标准:

(1) MOTA ( multi-object tracking accuracy ) 多目标跟踪准确率

衡量所有帧中目标的误检、漏检和错误匹配,非常直观的衡量跟踪识别目标和保持一致性的能力。该指标偏向检测 $$ \operatorname{MOTA}=1-\frac{|\mathrm{FN}|+|\mathrm{FP}|+|\mathrm{IDSW}|}{|\mathrm{gtDet}|} $$ 其中 IDSW 是 ID switch,FNFP 都表示检测误差, gt 表示 groud truth 物体的数量。MOTA 取值小于 100, 但当跟踪器产生的错误超过了场景中的物体,MOTA 可以变成负数。

(2) MOTP (Multi-object tracking precision) 多目标跟踪精度

衡量跟踪估计目标位置精确度的能力(定位误差),几乎不包含跟踪器实际性能相关的信息。 $$ \operatorname{MOTP}=\frac{1}{|\mathrm{TP}|} \sum_{\mathrm{TP}} S $$

MOTA 和 MOTP 是计算所有帧相关指标之后取平均,不是计算每帧的 rate 然后 rate 平均。

(3)IDF1

IDF1是一种以Identity视作基本单位的metric。它将要配对的是gtTrajs和prTrajs。IDTP代表trajectory匹配结果中重叠部分(相似度满足阈值要求)中identity的数量;IDFN代表没有被匹配到的gtDet数量,包括匹配trajectory对中不满足重叠要求的部分;IDFP代表没有被匹配到的prDet数量,包括匹配trajectory对中不满足重叠要求的部分。

涉及到了三个指标的计算: $$ I D P=\frac{I D T P}{I D T P+I D F P} $$

$$ I D R=\frac{I D T P}{I D T P+I D F N} $$ 正确识别的检测与真实数和计算检测的平均数之比 $$ I D F 1=\frac{2 I D T P}{2 I D T P+I D F P+I D F N} $$

结论

If you have an imbalanced dataset accuracy can give you false assumptions regarding the classifier’s performance, it’s better to rely on precision and recall, in the same way a Precision-Recall curve is better to calibrate the probability threshold in an imbalanced class scenario as a ROC curve.

  • ROC Curves: summarise the trade-off between the true positive rate and false positive rate for a predictive model using different probability thresholds.

  • Precision-Recall curves: summarise the trade-off between the true positive rate and the positive predictive value for a predictive model using different probability thresholds.

ROC curves are appropriate when the observations are balanced between each class, whereas precision-recall curves are appropriate for imbalanced datasets. In both cases the area under the curve (AUC) can be used as a summary of the model performance.

Why a ROC curve cannot measure well?

The Receiver Operating Characteristic (ROC) curves plot FPR vs. TPR as shown below. Because TPR only depends on positives, ROC curves do not measure the effects of negatives. **The area under the ROC curve (AUC) assesses overall classification performance **. AUC does not place more emphasis on one class over the other, so it does not reflect the minority class well.

Davis and Goadrich in this paper propose that Precision-Recall (PR) curves will be more informative than ROC when dealing with highly skewed datasets. The PR curves plot precision vs. recall (FPR). Because Precision is directly influenced by class imbalance so the Precision-recall curves are better to highlight differences between models for highly imbalanced data sets. When you compare different models with imbalanced settings, the area under the Precision-Recall curve will be more sensitive than the area under the ROC curve.

参考文献