基于PyTorch的深度学习基础课程之九:分类模型评价指标(2|3)

本文详细讨论了分类模型的常用评价指标,包括准确率、平均准确率、混淆矩阵、精确率、召回率、F1值和AUC等。对这些指标含义的理解和运用,尤其是在不平衡样本数据集上的应用,是设计恰当模型和指导AI大模型调整模型需要掌握的知识。对这些指标的讨论采用了示例入手、逐步推进的方式,便于读者理解。

在本专栏的前述文章里,对分类模型的评价采用了最简单的准确率。本文详细讨论分类模型的常用评价指标。无论是自己设计模型,还是指导AI大模型去调整模型,评价指标显然是必须理解的内容。

本文仍然采用示例入手的分析方法,便于读者理解。读者也可暂时跳过公式推导部分,先掌握应用方法。

3 混淆矩阵(Confusion Matrix)

混淆矩阵是对分类的结果进行详细描述的矩阵,对于二分类则是一个2×22 \times 22×2的矩阵,对于n分类则是n×nn \times nn×n的矩阵。

二分类的混淆矩阵,如表9-1所示,第一行是真实类别为“正(Positive)”的样本数,第二行则是真实类别为“负(Negative)”的样本数,第一列是预测值为“正”的样本数,第二列则是预测值为“负”的样本数。

表9-1 二分类的混淆矩阵

预测为“正”的样本数预测为“负”的样本数
标签为“正”的样本数True Positive(TP)False Negative(FN)
标签为“负”的样本数False Positive(FP)True Negative(TN)

表中TP表示真正,即被算法分类正确的正样本;FN表示假正,即被算法分类错误的正样本;FP表示假负,即被算法分类错误的负样本;TN表示真负,即被算法分类正确的负样本。

sklearn.metrics中计算混淆矩阵的函数为confusion_matrix()。

可以由混淆矩阵计算出准确率Accuracy和平均准确率Average_accuracy:
accuracy=TP+TNTP+FP+FN+TN(式9-2) \text{accuracy} = \frac{TP + TN}{TP + FP + FN + TN}\tag{式9-2} accuracy=TP+FP+FN+TNTP+TN(9-2)

average-accuracy=12(TPTP+FN+TNFP+TN)(式9-3) \text{average-accuracy} = \frac{1}{2} \left( \frac{TP}{TP + FN} + \frac{TN}{FP + TN} \right)\tag{式9-3} average-accuracy=21(TP+FNTP+FP+TNTN)(9-3)

在代码9-1.1后添加代码实现计算示例中验证集预测结果的混淆矩阵如代码9-1.2所示。

代码9-1.2 计算混淆矩阵

### 7. 计算混淆矩阵
conf_matrix = metrics.confusion_matrix(all_labels, all_predictions)
print('\n混淆矩阵:')
print('-' * 40)
print(f'              预测为0    预测为1')
print(f'真实为0 (0)    {conf_matrix[0, 0]:5d}       {conf_matrix[0, 1]:5d}')
print(f'真实为1 (非0)  {conf_matrix[1, 0]:5d}       {conf_matrix[1, 1]:5d}')

输出:

混淆矩阵:
----------------------------------------
              预测为0    预测为1
真实为0 (0)      946          34
真实为1 (0)     59        8961

进一步可以推出这些指标:

1)真正率(True Positive Rate, TPR),又名灵敏度(Sensitivity):分类正确的正样本个数占整个正样本个数的比例:
TPR=TPTP+FN(式9-4) TPR = \frac{TP}{TP + FN}\tag{式9-4} TPR=TP+FNTP(9-4)
2)假负率(False Negative Rate, FNR):分类错误的正样本的个数占正样本的个数的比例:
FNR=FNTP+FN(式9-5) FNR = \frac{FN}{TP + FN}\tag{式9-5} FNR=TP+FNFN(9-5)
3)假正率(False Positive Rate, FPR):分类错误的负样本个数占整个负样本个数的比例:
FPR=FPFP+TN(式9-6) FPR = \frac{FP}{FP + TN}\tag{式9-6} FPR=FP+TNFP(9-6)
4)真负率(True Negative Rate, TNR):分类正确的负样本的个数占负样本的个数的比例:
TNR=TNFP+TN(式9-7) TNR = \frac{TN}{FP + TN}\tag{式9-7} TNR=FP+TNTN(9-7)

4 精确率-召回率(Precision-Recall)

精确率-召回率包含两个评价指标,一般同时使用。

精确率-召回率是对每一类样本单独计算的。对分为正和负的二分类样本来说,精确率是指分类器分类正确(错误)的正样本的个数占该分类器所有分类为正(负)样本个数的比例,召回率是指分类器分类正确的正(负)样本个数占所有的正(负)样本个数的比例。

精确率是从预测的角度来看的,即预测为正(负)的样本中,预测成功的比例。召回率是从样本的角度来看的,即实际标签为正(负)的样本中,被成功预测的比例。准确率也是从样本的角度来看的,即所有样本中,正确预测的比例。与精确率和召回率不同,准确率是不分类别的。

在二分类混淆矩阵中,预测为正的样本的精确率为:

precisionPositive=TPTP+FP(式9-8) \text{precision}_{\text{Positive}} = \frac{TP}{TP + FP}\tag{式9-8} precisionPositive=TP+FPTP(9-8)
预测为负的样本的精确率为:

precisionNegative=TNTN+FN(式9-9) \text{precision}_{\text{Negative}} = \frac{TN}{TN + FN}\tag{式9-9} precisionNegative=TN+FNTN(9-9)
真实正样本的召回率为:

recallPositive=TPTP+FN=TPR(式9-10) \text{recall}_{\text{Positive}} = \frac{TP}{TP + FN} = TPR\tag{式9-10} recallPositive=TP+FNTP=TPR(9-10)
真实负样本的召回率为:

recallNegative=TNTN+FP=TNR(式9-11) \text{recall}_{\text{Negative}} = \frac{TN}{TN + FP} = TNR\tag{式9-11} recallNegative=TN+FPTN=TNR(9-11)
其中,真实正样本的召回率即为真正率(灵敏度)TPR(式9-4),真实负样本的召回率即为真负率TNR(式9-7)。

sklearn中计算精确率的是sklearn.metrics.precision_score()。通过设置它的average参数,还可以计算所谓的宏(macro)平均精确率、微(micro)平均精确率和加权(weighted)平均精确率等。

宏平均是按类平均,即计算出每个类别的精确率或召回率后再算平均值。例如,在二分类中,宏平均精确率为:
macro-precision=12(precisionPositive+precisionNegative)(式9-12) \text{macro-precision} = \frac{1}{2} \left( \text{precision}_{\text{Positive}} + \text{precision}_{\text{Negative}} \right)\tag{式9-12} macro-precision=21(precisionPositive+precisionNegative)(9-12)
微平均是总体平均,它将每个类别的精确率或召回率的分子之和除以分母之和。在二分类中,微平均精确率为:
micro-precision=TP+TNTP+FP+TN+FN(式9-13) \text{micro-precision} = \frac{TP+TN}{TP + FP+TN+FN}\tag{式9-13} micro-precision=TP+FP+TN+FNTP+TN(9-13)
加权平均是对每个类别的精确率乘以权重的和,每个类别的权重是该类别的样本数量在总样本数量的占比值。

从宏平均、微平均和加权平均的定义来看:宏平均只观注类别,而不管每类样本的数量,因此它更偏向于样本数量占比小的类别;微平均则偏向于样本数量占比大的类别;加权平均则通过权重要调和它们。了解这些指标的差异,有助于设计更加合理的模型。

sklearn中计算召回率的是sklearn.metrics.recall_score(),它的各种平均值的计算与

sklearn.metrics.precision_score()相同,不再赘述。

计算示例中验证集预测结果的精确率和召回率如代码9-1.3所示。

代码9-1.3 计算精确率与召回率

precision = metrics.precision_score(all_labels, all_predictions, average=None)
recall = metrics.recall_score(all_labels, all_predictions, average=None)
precision_macro = metrics.precision_score(all_labels, all_predictions, average='macro')
precision_micro = metrics.precision_score(all_labels, all_predictions, average='micro')
precision_weighted = metrics.precision_score(all_labels, all_predictions, average='weighted')
recall_macro = metrics.recall_score(all_labels, all_predictions, average='macro')
recall_micro = metrics.recall_score(all_labels, all_predictions, average='micro')
recall_weighted = metrics.recall_score(all_labels, all_predictions, average='weighted')
print(f'预测为0的精确率: {precision[0]:.4f}')
print(f'类别0召回率: {recall[0]:.4f}')
print(f'预测为1精确率: {precision[1]:.4f}')
print(f'类别1召回率: {recall[1]:.4f}')
print(f'宏平均精确率: {precision_macro:.4f}')
print(f'微平均精确率: {precision_micro:.4f}')
print(f'加权平均精确率: {precision_weighted:.4f}')
print(f'宏平均召回率: {recall_macro:.4f}')
print(f'微平均召回率: {recall_micro:.4f}')
print(f'加权平均召回率: {recall_weighted:.4f}')

输出:

预测为0的精确率: 0.9413
类别0召回率: 0.9653
预测为1精确率: 0.9962
类别1召回率: 0.9935
宏平均精确率: 0.9688
微平均精确率: 0.9907
加权平均精确率: 0.9908
宏平均召回率: 0.9794
微平均召回率: 0.9907
加权平均召回率: 0.9907

5 F1−scoreF_1 - \text{score}F1score

精确率与召回率实际上是一对矛盾的值,有时候单独采用一个值难以全面衡量算法,F1−scoreF_1 - \text{score}F1score试图将两者结合起来作为一个指标来衡量算法。 F1−scoreF_1 - \text{score}F1score为预测为正样本的精确率与真实正样本的召回率的调和平均值,即:
F1=2×precisionPositive×recallPositiveprecisionPositive+recallPositive(式9-14) F_1 = \frac{2 \times \text{precision}_{\text{Positive}} \times \text{recall}_{\text{Positive}}}{\text{precision}_{\text{Positive}} + \text{recall}_{\text{Positive}}} \quad \tag{式9-14} F1=precisionPositive+recallPositive2×precisionPositive×recallPositive(9-14)
还可以给精确率和召回率加权重系数来区别两者的重要性,将 F1−scoreF_1 - \text{score}F1score扩展为Fβ−scoreF_\beta - scoreFβscore:

Fβ=(1+β2)precisionPositive×recallPositive(β2×precisionPositive)+recallPositive(式9-15) F_\beta = (1 + \beta^2) \frac{\text{precision}_{\text{Positive}} \times \text{recall}_{\text{Positive}}}{(\beta^2 \times \text{precision}_{\text{Positive}}) + \text{recall}_{\text{Positive}}} \quad \tag{式9-15} Fβ=(1+β2)(β2×precisionPositive)+recallPositiveprecisionPositive×recallPositive(9-15)

β\betaβ表示召回率比精确率的重要程度,除了 1 之外,常取 2 或 0.5,分别表示召回率的重要程度是精确率的 2 倍,或一半。

sklearn.metrics 包中也提供计算了它们的函数,见示例代码9-1.4。

代码9-1.4 F1值计算示例

### 8. 计算F1值
f1 = metrics.f1_score(all_labels, all_predictions, average=None)
f1_macro = metrics.f1_score(all_labels, all_predictions, average='macro')
f1_weighted = metrics.f1_score(all_labels, all_predictions, average='weighted')
print(f'类别0 F1值: {f1[0]:.4f}')
print(f'类别1 F1值: {f1[1]:.4f}')
print(f'宏平均F1值: {f1_macro:.4f}')
print(f'加权平均F1值: {f1_weighted:.4f}')

输出:

类别0 F1值: 0.9531

类别1 F1值: 0.9948

宏平均F1值: 0.9740

加权平均F1值: 0.9908

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值