目录
引言
在这篇博客中,我们将仔细探讨两个经常被用于评价分类模型性能的重要工具:准确率-召回率曲线(Precision-Recall Curve,简称PR曲线)与接收者操作特性曲线(Receiver Operating Characteristic Curve,简称ROC曲线)。我们会从理论出发,然后通过实际例子看看如何在Python中使用这两个工具。
一、混淆矩阵
混淆矩阵(Confusion Matrix)是一种常用的数据科学和机器学习分类模型的性能评估工具。它为我们提供一个可视化的方式来了解我们的模型在各个类别上的表现。在二分类问题中,混淆矩阵的形式通常如下:
在这个表格中:
- TP (True Positive):真正类,预测为正且实际为正的样本数。
- FN (False Negative):假负类,预测为负但实际为正的样本数。
- FP (False Positive):假正类,预测为正但实际为负的样本数。
- TN (True Negative):真负类,预测为负且实际为负的样本数。
混淆矩阵可以帮助我们计算各种评估指标,如准确率(Accuracy),精确率(Precision),召回率(Recall)和F1分数(F1 Score)等。例如:
- 准确率 = (TP + TN) / (TP + FN + FP + TN),表示所有预测正确的样本占总样本的比例。
- 精确率 = TP / (TP + FP),表示预测为正且实际为正的样本占预测为正的样本的比例。
- 召回率 = TP / (TP + FN),表示预测为正且实际为正的样本占实际为正的样本的比例。
- F1分数 = 2精确率召回率 / (精确率 + 召回率),综合考虑了精确率和召回率。
通过混淆矩阵,我们可以更清楚地了解到模型在各个类别上的预测性能,从而有针对性地进行模型优化。
二、PR曲线
2.1 什么是PR曲线
PR曲线,也称为精确率-召回率曲线(Precision-Recall Curve),是用来评估一个模型在分类任务上的性能的一种工具。
我们先解释下精确率(Precision)和召回率(Recall):
-
精确率(Precision)是预测为正的样本中真正为正的比例,可以理解为预测正确的正样本占预测出的所有正样本的比例。
-
召回率(Recall)是真正为正的样本中被预测为正的比例,可以理解为预测正确的正样本占所有真正正样本的比例。
然后PR曲线就是在不同的决策阈值下,精确率和召回率对应的曲线。通常情况下,召回率高,精准率就会相对降低;反之,如果要求精准率高,那么召回率可能就不会那么高。因此,PR曲线的形状通常是下凹的。同时,PR曲线的面积可以被用来衡量模型的整体性能,面积越大,说明模型的性能越好。
总的来说,PR曲线是用来描述模型在处理不平衡数据集时对正样本预测准确性和完整性的一种指标。在实际应用中,根据问题的特性,我们可以通过选取适当的阈值,以平衡精确率和召回率,从而达到最好的模型性能。
PR曲线平衡点(PRC-BE),又称精确率-召回率曲线的平衡点,是指在PR曲线上,精确率(Precision)等于召回率(Recall)的点。换句话说,这是一个使得模型的精确率和召回率达到平衡的点。
如果平衡点在y=x斜线上,说明分类器预测为正例和真正为正例的比例一致,此时分类器具有较好的性能。但如果平衡点偏离y=x斜线,说明分类器在正例和负例之间存在偏差,需要进一步优化分类器的性能
如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住,则可断言后者的性能优于前者,例如上面的A和B优于学习器C。但是A和B的性能无法直接判断,我们可以根据曲线下方的面积大小来进行比较,但更常用的是平衡点
或者是F1-score
。
2.2 PR曲线实现
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import precision_recall_curve
import matplotlib.pyplot as plt
# 生成模拟数据
X, y = make_classification(n_samples=1000, n_classes=2, random_state=1)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.5, random_state=2)
# 初始化模型并训练
model = LogisticRegression()
model.fit(X_train, y_train)
# 计算概率并生成PR曲线
y_scores = model.predict_proba(X_test)
precisions, recalls, _ = precision_recall_curve(y_test, y_scores[:,1])
# 绘制PR曲线
plt.plot(recalls, precisions, marker='.')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR Curve')
plt.show()
三、ROC曲线
3.1 什么是ROC曲线
ROC曲线,即接收者操作特征曲线(Receiver Operating Characteristic curve),在机器学习中常用于度量分类模型的表现。
ROC曲线是以假阳性率(False Positive Rate,FPR)为横坐标,真阳性率(True Positive Rate,TPR)为纵坐标所绘制出的曲线。简而言之,它描述的是当我们调整模型的分类阈值时,模型对于正样本和负样本分类准确性的表现。
真阳性率(TPR)是指正样本被正确预测为正样本(真阳性)占全部实际正样本(真阳性+假阴性)的比例。假阳性率(FPR)是指负样本被错误预测为正样本(假阳性)占全部实际负样本(真阴性+假阳性)的比例。
ROC曲线的优点是,即使在样本的真实分布发生改变的情况下,其形状也保持不变,因此被广泛用作分类模型的评估工具。
进一步地,我们通常使用曲线下面积(Area Under Curve,AUC)作为性能的度量。AUC的值在0.5(即随机猜测)到1(完美分类)之间,越接近1,表示模型的分类效果越好。
ROC曲线的构建过程如下:
-
对于给定的分类器,在不同的分类阈值下进行分类。阈值是用来决定样本被分类为正例还是负例的一个参数。
-
计算出每个分类阈值下的真阳性率(True Positive Rate,TPR)和假阳性率(False Positive Rate,FPR)。
-
TPR = TP / (TP + FN),其中FN代表实际为正例的样本被错误地预测为负例的数量。
-
FPR = FP / (FP + TN),其中TN代表实际为负例的样本被正确地预测为负例的数量。
-
-
将得到的不同分类阈值下的TPR和FPR构成一个坐标点,并绘制在ROC空间中。
-
连接这些坐标点,形成ROC曲线。
在ROC曲线上,点(0,0)代表将所有样本都预测为负例时的情况,点(1,1)则代表将所有样本都预测为正例时的情况。理想的情况是ROC曲线尽可能地靠近左上角,即TPR较高,而FPR较低。
另外,ROC曲线下方的面积AUC(Area Under Curve)可以用来评估分类器的性能,其取值范围在0到1之间。AUC值越大,表示分类器的性能越好,因为它的分类结果在不同阈值下都能较好地区分正例和负例。
总的来说,ROC曲线通过展示在不同分类阈值下模型的真阳性率和假阳性率之间的关系,提供了评估分类器性能的一个可视化工具。
3.2 ROC曲线实现
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
# 生成一个样本数据集
X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, random_state=42)
# 数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用逻辑回归模型
classifier = LogisticRegression()
# 在训练集上训练模型
classifier.fit(X_train, y_train)
# 计算测试集的预测概率
y_score = classifier.predict_proba(X_test)[:, 1]
# 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_score)
# 计算AUC值
roc_auc = auc(fpr, tpr)
# 绘制ROC曲线
plt.title('Receiver Operating Characteristic')
plt.plot(fpr, tpr, 'b', label = 'AUC = %0.2f' % roc_auc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],'r--')
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
总结
PR曲线的重要性及应用:
PR曲线描述的是精确率(Precision)和召回率(Recall)之间的关系。其中,Precision(又称查准率)是指模型识别的正例中实际为正例的比例,而Recall(又称查全率)则反映了模型识别出的正例占全部真实正例的比例。
在类别不平衡的情况下,正例(如欺诈交易、癌症诊断等)通常远少于负例,此时,只看准确率(accuracy)常常会得出模型性能优良的误判。例如,在做信用卡欺诈检测时,假设只有0.1%的交易是欺诈性的,那么一个将所有交易都预测为正常的模型,其准确率也有99.9%,但这样的模型显然没有任何实际价值。因此,此时我们需要关注查准率和查全率,通过PR曲线我们可以更好地了解模型在不同阈值下的性能,从而调整模型或选择最佳阈值。
ROC曲线的重要性及应用:
ROC曲线描述的是真正例率(TPR)和假正例率(FPR)的关系。TPR(又称Sensitivity,查全率,与Recall相同)是指模型识别出的正例占全部实际正例的比例,FPR(1-Specificity)是指被模型错误地标记为正例的负例占所有负例的比例。
ROC曲线同样适用于任何二元分类模型的性能评估,特别适用于正负样本比例较为平衡的情况。和PR曲线一样,ROC曲线也可以帮助我们选择使得TPR高、FPR低的最佳阈值。
同时,ROC曲线下的面积(AUC: Area Under Curve)被广泛使用为模型性能的量化指标,AUC值越接近于1,表示模型的性能越好;相反,如果AUC接近0.5,则说明模型没有分类能力,等同于随机猜测。