目录
6.2 精确率/查准率(Precision)(一般简写为PR)
6.3 召回率/灵敏度/查全率/真阳性率(True Positive Rate)(一般简写为TPR或者Recall)
6.4 特异度/真阴性率(True Negative Rate)(一般简写为TNR)
6.5 假阳性率/假警报率(False Positive Rate) (一般简写为FPR)
6.6假阴性率(False Negative Rate) (一般简写为FNR)
6.8 马修斯相关系数(MCC, Matthews Correlation Coefficient)
6.9 AUROC(Area Under Receiver Operating Characteristic Curve):
6.10 AUPRC(Area Under Precision-Recall Curve):
1 提出的背景:
在二分类问题中,仅仅使用简单的准确率(Accuracy)无法提供对模型性能的全面评估。准确率只是预测正确的样本数占总样本数的比例,而忽略了不同类别之间的差异。特别是在不平衡(极度偏斜)数据集中(例如癌症患者的人数和健康人数量差别特别大),准确率可能会给出误导性的结果。
2 混淆矩阵简介:
为了更好地评估分类模型的性能,混淆矩阵引入了真阳性(True Positive, TP)、真阴性(True Negative, TN)、假阳性(False Positive, FP)和假阴性(False Negative, FN)这些指标。通过对这些指标进行统计和分析,我们可以获得更全面的模型性能评估,包括召回率(Recall)、精确率(Precision)、假阳性率(False Positive Rate)等指标。这些指标帮助我们更好地理解模型在不同类别预测中的表现,并发现潜在的问题。
3 基本结构:
混淆矩阵的基本结构如下:
- True Positive (TP): 模型将实际为正类别的样本正确预测为正类别的概率。
- False Negative (FN): 模型将实际为正类别的样本错误预测为负类别的概率。
- False Positive (FP): 模型将实际为负类别的样本错误预测为正类别的概率。
- True Negative (TN): 模型将实际为负类别的样本正确预测为负类别的概率。
这些元素帮助我们理解模型在分类任务中所做的预测,并将这些预测与实际情况进行对比。
4 用途:
混淆矩阵广泛应用于各种领域,包括医学诊断、自然语言处理、图像处理等。在医学领域,混淆矩阵还可以用于评估疾病诊断模型,判断病人是否患有特定疾病。在自然语言处理中,它可用于评估文本分类模型,判断一段文本属于哪个类别。混淆矩阵为我们提供了详细的信息,可以用于模型性能的改进和优化。
混淆矩阵是理解分类模型性能的关键,它提供了对模型预测的深入洞察,使我们能够更好地理解模型的分类能力,以便采取适当的措施来改进模型。
5 举例:
为了更好地理解混淆矩阵,让我们考虑一个简单的二元分类问题。假设我们正在开发一个垃圾邮件检测器,目标是将电子邮件分为两类:垃圾邮件(正类别)和非垃圾邮件(负类别)。
假设我们已经训练好了一个分类模型,并用测试数据集进行了测试。测试集共有100个样本,结果如下:
- 模型将60封实际是垃圾邮件的邮件预测为垃圾邮件(True Positive, TP = 60)。
- 模型将10封实际是垃圾邮件的邮件错误地预测为非垃圾邮件(False Negative, FN = 10)。
- 模型将5封实际上不是垃圾邮件的邮件错误地预测为垃圾邮件(False Positive, FP = 5)。
- 模型将25封实际上不是垃圾邮件的邮件正确预测为非垃圾邮件(True Negative, TN = 25)。
基于这些结果,我们可以构建混淆矩阵:
分析:
- True Positive (TP): 模型正确地将实际为垃圾邮件的60封邮件预测为垃圾邮件。
- False Negative (FN): 模型将实际为垃圾邮件的10封邮件错误地预测为非垃圾邮件。
- False Positive (FP): 模型将实际非垃圾邮件的5封邮件错误地预测为垃圾邮件。
- True Negative (TN): 模型正确地将实际非垃圾邮件的25封邮件预测为非垃圾邮件。
6 基于混淆矩阵衍生的模型评估指标:
6.1 准确率(Accuracy)(一般简写为ACC)
准确率表示所有预测样本中预测正确样本占总样本的比例,计算方式为:
那么如果仅仅使用这个单一的指标来衡量模型的性能有什么弊端呢?
答:在类别不平衡的数据集中,准确率可能会给出误导性的结果。例如,如果数据集中99%的样本属于某一类,模型只要预测所有样本都属于该类,就能得到99%的准确率,但这样的模型显然没有学习到有用的信息。
正因如此,就诞生了下面的各类衍生指标。
6.2 精确率/查准率(Precision)(一般简写为PR)
精确率表示所有预测为正样本的样本中实际为正样本的比例,计算方式为:
精确率用于衡量模型对正类预测的准确性。在某些应用中,例如垃圾邮件过滤,误报(FP)可能代价较高,因此需要关注精确率。
提高查准率就是让误报的概率下降。
6.3 召回率/灵敏度/查全率/真阳性率(True Positive Rate)(一般简写为TPR或者Recall)
也可以称为Sensitivity(简写为Sn)
召回率表示所有实际为正样本的样本中预测正确的样本所占的比例。其计算方式为:
召回率用于衡量模型对正类样本的覆盖程度。在某些应用中,例如疾病诊断,漏报(FN)可能代价较高,因此需要关注召回率。
提高查全率就是让漏报的概率下降。
6.4 特异度/真阴性率(True Negative Rate)(一般简写为TNR)
也可以称为Specificity(简写为Sp)
特异度表示所有实际为负样本的样本中预测正确的样本所占的比例。其计算方式为:
特异性用于衡量模型对负类样本的识别能力。
6.5 假阳性率/假警报率(False Positive Rate) (一般简写为FPR)
假阳性率表示所有实际为负样本的样本中预测错误的样本所占的比例。其计算方式为:
假阳性率与特异性相对,用于分析负类样本的错误识别情况。
因此TPR+NPR=1
6.6假阴性率(False Negative Rate) (一般简写为FNR)
假阴性率表示所有实际为正样本的样本中预测错误的样本所占的比例。其计算方式为:
假负率与召回率相对,用于分析正类样本的错误遗漏情况。
因此TPR+FNR=1
6.7 F1 分数(F1-score)(一般简写为F1)
F1 分数是精确率和召回率的调和平均数,它综合了两者的性能,计算方式为:
F1 分数的取值范围是 [0, 1],越接近 1 表示模型的性能越好,同时考虑到了模型在查准率和查全率之间的平衡。F1 分数对于二元分类问题非常有用,特别是当我们希望在精确率和召回率之间取得平衡时。高 F1 分数意味着模型在查准率和查全率之间取得了良好的平衡。
这些指标提供了多方面的信息,帮助我们全面了解模型的性能。准确率衡量了模型在所有样本上的整体表现,精确率关注模型在预测为正类别的样本上的准确性,召回率关注模型在实际为正类别的样本上的覆盖程度,而 F1 分数平衡了精确率和召回率。
F1分数用于平衡精确率和召回率,特别适合于类别不平衡的情况。
混淆矩阵和这些性能指标共同提供了对分类模型性能全面的理解,并帮助我们评估模型的优缺点,进而进行必要的改进。
上面我们计算的各项指标都是针对一个类别的二分类任务而言的(例如针对邮件识别是正常邮件还是垃圾邮件)。
当推广到多分类任务后,我们需要把所有类别的指标都计算出来后,再对它们求平均值,即可得到最终的指标。
6.8 马修斯相关系数(MCC, Matthews Correlation Coefficient)
定义:MCC是一种考虑了真阳性、真阴性、假阳性和假阴性的综合性指标,用来衡量二分类问题的性能。计算公式为:
MCC值在-1到+1之间,+1表示完美预测,0表示模型预测没有比随机猜测更好,-1表示完全错误的预测。
6.9 AUROC(Area Under Receiver Operating Characteristic Curve):
定义:AUROC是ROC曲线下面积,ROC曲线展示了不同阈值下模型的真正率(召回率)和假正率之间的关系。
解释:AUROC值介于0和1之间,越接近1表示模型的区分能力越强,0.5表示模型的表现与随机猜测相当。
6.10 AUPRC(Area Under Precision-Recall Curve):
定义:AUPRC是精度-召回曲线下的面积,展示了在不同阈值下精度和召回率的权衡。
解释:AUPRC值越高,表示模型在正类预测上的表现越好,特别是在数据集不平衡时,AUPRC是一个更可靠的评估指标。
7 目标检测模型常用的评价指标:
先了解什么是IoU(交并比),再了解什么是PR曲线、AP(Average Precision)、mAP(Mean Average Precision)、AUC(area under the curve)
我们希望一个模型的Precision和Recall都很高,所以需要综合考虑这两个因素,我们可以联想到用调和平均数F1值来衡量。
另一种方法正是PR曲线下的面积AUC,这也就是AP。AUC面积越接近1性能越好。曲线下的面积理解为不同召回值的情况下所有精度的平均值。
可以参考下面这篇博客,讲的不错:
8 实战(对手写数据集进行二分类后使用混淆矩阵打分):
8.1 步骤:
加载手写数字数据集并进行预处理。标签数据集中的数字9被替换为1,其他数字被替换为0,以产生极度偏斜的数据。
将数据集拆分为训练集和测试集。
使用逻辑回归模型进行训练,并在测试集上进行预测,然后计算准确率。
通过混淆矩阵可视化模型的预测结果。
从混淆矩阵中提取真阳性(TP)、假阳性(FP)、假阴性(FN)和真阴性(TN)的值。
计算准确率、精确率、召回率。
计算特异度(TNR)、假阳率(FPR)、假阴率(FNR)和F1分数(F1-score)。
8.2 代码:
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
import seaborn as sns
# 加载手写数字数据集
digits = datasets.load_digits()
X = digits.data
y = digits.target.copy() # 一共1797条数据
# 产生极度偏斜的数据,
y[digits.target==9] = 1 # 标签数据9=>1
y[digits.target!=9] = 0 # 标签数据非9=>0
# 拆分数据集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)
# 使用逻辑回归进行分类
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)
log_reg.score(X_test, y_test) # 准确率0.9755555555555555
# 逻辑回归预测y值
y_log_predict = log_reg.predict(X_test)
# 获得混淆矩阵
# metrics是scikit-learn(sklearn)库中的一个模块,用于评估和度量机器学习模型的性能
from sklearn.metrics import confusion_matrix
matrix = confusion_matrix(y_test, y_log_predict)#预测值和真实值->得到混淆矩阵
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei'] # 根据需要选择合适的中文字体
# 创建标签列表
labels1 = ['预测非9', '预测为9'] # 根据实际情况替换类别标签
labels2 = ['实际非9', '实际为9'] # 等于9是正类,否则是负类
# 创建热力图
plt.figure(figsize=(8, 6))
sns.heatmap(matrix, annot=True, fmt='d', cmap='Blues', xticklabels=labels1, yticklabels=labels2)
plt.title('Confusion Matrix')
plt.xlabel('Predicted Label')
plt.ylabel('True Label')
plt.show()
from sklearn.metrics import confusion_matrix
matrix = confusion_matrix(y_test, y_log_predict)
TP = matrix[1, 1] # 真阳性
FP = matrix[0, 1] # 假阳性
FN = matrix[1, 0] # 假阴性
TN = matrix[0, 0] # 真阴性
print("注:本混淆矩阵右下角才是TP")
print("真阳性(TP):", TP)
print("假阳性(FP):", FP)
print("假阴性(FN):", FN)
print("真阴性(TN):", TN)
# 获得准确率
from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_test,y_log_predict)
print('准确率为:',accuracy)
# 获得精确率
from sklearn.metrics import precision_score
precision = precision_score(y_test, y_log_predict)
print('精确率为:',precision)
# 获得召回率
from sklearn.metrics import recall_score
recall = recall_score(y_test, y_log_predict)
print('召回率为:',recall)
# 计算特异度(TNR)
TNR = TN / (TN + FP)
print("特异度(TNR):", TNR)
# 计算假阳率(FPR)
FPR = FP / (FP + TN)
print("假阳率(FPR):", FPR)
# 计算假阴率(FNR)
FNR = FN / (FN + TP)
print("假阴率(FNR):", FNR)
# 计算F1分数(F1-score)
from sklearn.metrics import f1_score
F1 = f1_score(y_test, y_log_predict)
print("F1分数(F1-score):", F1)
注:右下角的才是TP。