当前位置: 首页 > news >正文

基于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)94634真实为1(0)598961

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

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

5F1−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

http://www.cnnetsun.cn/news/1261.html

相关文章:

  • 基于PyTorch的深度学习基础课程之九:分类模型评价指标(3|3)
  • --- 将二叉搜索树转化为排序的双向链表 ---
  • 产品中有哪些天才设计
  • 向量求导法
  • Elasticsearch下载地址及离线安装步骤
  • 当日总结(2025年12月10日)
  • 手写Tomcat代码整理(自用)
  • 雷科电力-REKE920S涂层测厚仪
  • 相机选型学习
  • 华为-AI智算网络学习-4 运维与监控实例
  • 华为-AI智算网络学习-3 fabriclnsight 监控运维平台
  • ABAP Console Reloaded:ADT 控制台与 CL_DEMO_OUTPUT 的合体进化
  • ABAP Platform 2021 让泛型与动态编程焕然一新:用新表达式告别 FIELD-SYMBOL 的年代感
  • 把 Client 当成 ABAP 系统的多租户底座:从 sy-mandt 到 CDS_CLIENT 的隔离机制与工程实践
  • CL_DEMO_OUTPUT 重新焕发活力:从 ABAP 7.56 SP01 起,把深层结构与对象实例一次性讲清楚、展示漂亮
  • 把 MANDT 锁进保险箱:ABAP Client Handling 与 Client Isolation(聚焦 AMDP 的 Client Safety )
  • 把租户关进自己的房间:ABAP Client Handling 与 Client Isolation(聚焦 CDS Table Function 与 AMDP)
  • 把客户端隔离讲透:ABAP 里的 Client Handling 从 ABAP SQL、CDS_CLIENT 到 Native SQL 风险控制
  • 别再在 HANA 里直查 CDS 了:ABAP-Managed Database Objects 与正确访问姿势全解
  • 从 F1 到 help.sap.com:ABAP 关键字文档迁移背后的门道与团队落地指南
  • 关于 SAP Fiori Frontend Server 从 standalone 到 embedded 模式的迁移之路
  • 人工智能模型组同学们的建议
  • “走马观碑”开源仓库
  • Docker中安装软件汇总(留存版)
  • StickerBaker零代码AI贴纸生成器快速部署指南
  • Step1X-Edit技术深度解析:智能图像编辑的推理革命
  • 5分钟零配置部署:QuickJS在工业边缘计算的完整实践指南
  • SegEarth-OV3: Exploring SAM 3 for Open-Vocabulary Semantic Segmentation in Remote Sensing Images
  • SAM 3: Segment Anything with Concepts
  • Docker实战指南:MySQL、Redis与C++环境的深度容器化部署