一,混淆矩阵

混淆矩阵(Confusion Matrix)[1] 是一个用于描述分类模型性能的工具。它用于总结分类算法在测试数据集上的表现情况。混淆矩阵是一个 n×n,n×n 的矩阵,其中 n 是分类问题中的类别数。矩阵的每一行代表实际的类别,而每一列代表预测的类别

以下是一个混淆矩阵的结构示例:

预测阳性(Predicted Positive) 预测阴性(Predicted Negative)
实际阳性(Actual Positive) True Positive (TP) False Negative (FN)
实际阴性(Actual Negative) False Positive (FP) True Negative (TN)

各个术语的含义如下:

  • True Positive (TP): 实际为正类,且被预测为正类的数量。
  • False Positive (FP): 实际为负类,但被预测为正类的数量。
  • True Negative (TN): 实际为负类,且被预测为负类的数量。
  • False Negative (FN): 实际为正类,但被预测为负类的数量。

因此,从表中可知:
实际正样本数量: P = TP + FN \text{P} ={\text{TP} + \text{FN} } P=TP+FN
实际负样本数量: N = FP + TN \text{N} ={\text{FP} + \text{TN} } N=FP+TN

:正类一般是研究中所关注的一类样本

二,分类评价指标

通过混淆矩阵,我们就可以来定义各个指标:

  • 准确率 Accuracy = TP + TN P + N = TP + TN TP + FP + TN + FN \text{Accuracy} = \frac{\text{TP + TN}}{\text{P} + \text{N}}= \frac{\text{TP + TN}}{\text{TP} + \text{FP} + \text{TN} + \text{FN}} Accuracy=P+NTP + TN=TP+FP+TN+FNTP + TN, 即评价整体分类的准确性,既考虑TP也考虑TN。
  • 精确率 Precision = TP TP + FP \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP} } Precision=TP+FPTP,仅考虑TP在预测结果为阳性样本中所占的比重。
  • 召回率 Recall = TP P = TP TP + FN \text{Recall} =\frac{\text{TP}}{P} =\frac{\text{TP}}{\text{TP} + \text{FN}} Recall=PTP=TP+FNTP,仅考虑TP在实际结果为阳性样本中所占比例。
  • F1分数 F1-score = 2 × Precision × Recall Precision + Recall \text{F1-score} = 2×\frac{\text{Precision × Recall}}{\text{Precision} + \text{Recall}} F1-score=2×Precision+RecallPrecision × Recall,综合考量Precision和Recall。

注: 关于AUC和AUPR的计算参见:https://blog.csdn.net/qq_45647530/article/details/139346525

三,Python计算分类指标

在这里插入图片描述

3.1 数据准备

在计算各个分类指标前,博主准备了两个预训练二分类模型,并在测试集上测试它们,获得对应的预测分数和预测标签,其部分数据如下:

数据样式
在这里插入图片描述
(注:数据可以从此处获取
链接:https://pan.baidu.com/s/1R5X-_4kGuMXTc8Qi1Sc7xQ?pwd=rk45
提取码:rk45)

3.2 环境需求

对指标的计算我们借助机器学习库scikit-learn来完成。因此,需要在已有Python环境中安装这三个库,安装方式如下:

pip install scikit-learn

3.3 指标计算

3.3.1 利用已有函数计算
#导入所需要的绘图工具
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
import pandas as pd
if __name__ == "__main__":
    #加载数据
    model1_data = pd.read_csv('./model1.csv')
    #计算指标
    print(f"Accuracy: {accuracy_score(y_true=model1_data['y_true'], y_pred=model1_data['y_pred']):0.4f}")
    print(f"Precision: {precision_score(y_true=model1_data['y_true'], y_pred=model1_data['y_pred']):0.4f}")
    print(f"Recall: {recall_score(y_true=model1_data['y_true'], y_pred=model1_data['y_pred']):0.4f}")
    print(f"F1-score: {f1_score(y_true=model1_data['y_true'], y_pred=model1_data['y_pred']):0.4f}")

代码输出结果:

Accuracy: 0.8961
Precision: 0.8642
Recall: 0.8933
F1-score: 0.8785
3.3.2 利用混淆矩阵计算
import pandas as pd
from sklearn.metrics import confusion_matrix

if __name__ == "__main__":
    #加载数据
    data = pd.read_csv('./model1.csv')
    #计算指标
    ConfusionMatrix = confusion_matrix(y_true=data["y_true"], y_pred=data["y_pred"])
    TN, FP, FN, TP = ConfusionMatrix.ravel()

    Accuracy = (TP + TN) / (TP + TN + FP + FN)
    Precision = TP / (TP + FP)
    Recall = TP / (TP + FN)
    F1_score = 2 * Precision * Recall / (Precision + Recall)
    print(f"Accuracy: {Accuracy:0.4f}")
    print(f"precision: {Precision:0.4f}")
    print(f"recall: {Recall:0.4f}")
    print(f"f1-score: {F1_score:0.4f}")

代码输出结果:

Accuracy: 0.8961
precision: 0.8642
recall: 0.8933
f1-score: 0.8785

观察两种计算方式的结果,发现是一致的。

四,参考文献

[1] https://en.wikipedia.org/wiki/Confusion_matrix
[2] Powers D M W. Evaluation: from precision, recall and F-measure to ROC, informedness, markedness and correlation[J]. arxiv preprint arxiv:2010.16061, 2020.
[3] https://blog.csdn.net/qq_45647530/article/details/139346525.

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐