一、混淆矩阵
1、混淆矩阵的概念
混淆矩阵(confusion matrix)是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。具体评价指标有总体精度、制图精度、用户精度等,这些精度指标从不同的侧面反映了图像分类的精度。在人工智能中,混淆矩阵是可视化工具,特别用于监督学习,在无监督学习一般叫做匹配矩阵。在图像精度评价中,主要用于比较分类结果和实际测得值,可以把分类结果的精度显示在一个混淆矩阵里面。
我们以分类模型中最简单的二分类为例,对于这种问题,我们的模型最终需要判断样本的结果是0还是1,或者说是positive还是negative。我们通过样本的采集,能够直接知道真实情况下,哪些数据结果是positive,哪些结果是negative。同时,我们通过用样本数据跑出分类型模型的结果,也能知道模型认为这些数据哪些是positive,哪些是negative。
这样就可以分成四个情况:真正例(True Positives, TP)、真负例(True Negatives, TN)、假正例(False Positives, FP)和假负例(False Negatives, FN)。
2、混淆矩阵的评价指标
预测分类模型时,我们希望预测结果越准越好,即希望TP与TN的数量大,而FP与FN的数量小。
但是,当需要预测大量数据时,光凭混淆矩阵中分类出的各种情况的数量不足以衡量模型的优劣。我们增加四个指标:准确率(Accuracy)、精确率(Precision)、召回率(Recall)、特异度(Specificity),由此来使预测结果更准确。
公式 | 定义 | |
准确率 | 分类模型中所有判断正确的结果占总观测值的比重 | |
精确率 | 在预测模型是Positive的结果中,模型预测对的比重 | |
召回率 | 在真实值是Positive的结果中,模型预测对的比重 | |
特异度 | 在预测模型是Negative的结果中,模型预测对的比重 |
二、混淆矩阵和PR曲线
PR曲线是一种用于评估二分类模型性能的图形工具。P代表的是precision(精准率或查准率),R代表的是recall(召回率或查全率),即PR曲线代表的是精准率与召回率的关系,一般情况下,将recall设置为横坐标,precision设置为纵坐标。如下图所示,平衡点在y=x线上时该分类器性能较好。
对于PR曲线这里举个例子:假设有20个西瓜,其中好瓜15个,坏瓜5个。我从中挑选了10个我认为的好瓜,但这10个西瓜中其实有1个是坏瓜。那么对于这个情况,我挑选西瓜的精确率为 ,而召回率为 。
三、混淆矩阵和ROC曲线
ROC曲线是另一种用于评估分类模型性能的工具,它不同于PR曲线,侧重于真正例率(True Positive Rate)和假正例率(False Positive Rate)。
True Positive Rate(真正例率),是指模型正确识别正例的能力。它与PR曲线中的召回率相同。
False Positive Rate(假正例率)衡量了模型将负例错误分类为正例的频率。
我们使用roc_curve函数计算ROC曲线的数据,使用matplotlib库中的plot函数绘制ROC曲线,并使用auc_score函数计算AUC
四、绘制PR曲线和ROC曲线
代码:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import precision_recall_curve, roc_curve, auc
# 生成数据集
X, y = make_classification(n_samples=1000, n_classes=2, n_features=10, random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义KNN分类器
knn = KNeighborsClassifier(n_neighbors=5)
# 训练模型
knn.fit(X_train, y_train)
# 预测测试集
y_pred = knn.predict(X_test)
# 计算PR曲线和ROC曲线
precision, recall, _ = precision_recall_curve(y_test, y_pred)
fpr, tpr, _ = roc_curve(y_test, y_pred)
roc_auc = auc(fpr, tpr)
# 绘制PR曲线
plt.figure(figsize=(8, 6))
plt.plot(recall, precision, color='blue', lw=2, label='PR Curve (AUC = %0.2f)' % auc(precision, recall))
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR Curve')
plt.legend(loc='lower right')
plt.show()
# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='red', lw=2, label='ROC Curve (AUC = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc='lower right')
plt.show()
ROC图像与PR图像比较:
五、小结
PR曲线和ROC曲线都是评估二元分类器性能的重要工具,但它们在处理类别不平衡问题和比较不同类别分布下的分类器性能时有所不同。
PR曲线使用了Precision,因此完全聚焦于正例。PR曲线在类别不平衡问题中由于主要关心正例,所以被广泛认为优于ROC曲线。在类别不平衡问题中,ROC曲线通常会给出一个乐观的效果估计,所以大部分时候还是PR曲线更好。
ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能。在存在不同类别分布的情况下,如果想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较。