机器学习——PR曲线和ROC曲线
1.混淆矩阵预备知识
混淆矩阵(Confusion Matrix) 是在机器学习中,用于对分类模型的性能进行评估的一种方法。混淆矩阵展示了模型在分类任务中的预测结果与实际标签之间的对应关系。以下是一个混淆矩阵的模板:
真实结果/预测结果 | 正例 | 假例 |
---|---|---|
正例 | TP(真正例) | FN(假反例) |
假例 | FP(假正例) | TN(真反例) |
2.混淆矩阵评价指标
2.1 准确率(Accuracy)
分类器对样本的判定能力,将样本预测正为真实正,预测负为真实负的能力(值在0-1,越大越好)
Accuracy
=
TP (True Positives) + TN (True Negatives)
TP (True Positives) + TN (True Negatives) + FP (False Positives) + FN (False Negatives)
\text{Accuracy} = \frac{\text{TP (True Positives) + TN (True Negatives)}}{\text{TP (True Positives) + TN (True Negatives) + FP (False Positives) + FN (False Negatives)}}
Accuracy=TP (True Positives) + TN (True Negatives) + FP (False Positives) + FN (False Negatives)TP (True Positives) + TN (True Negatives)
TP(真正例)表示被正确分类为正例的样本数量
TN(真反例)表示被正确分类为负例的样本数量
FP(假正例)表示实际为负例但被错误分类为正例的样本数量
FN(假反例)表示实际为正例但被错误分类为负例的样本数量
2.2 召回率(Recall)
预测为正占实际为正的样本的比例(值在0-1,越大越好)
Recall (TPR)
=
True Positives (TP)
True Positives (TP) + False Negatives (FN)
\text{Recall (TPR)} = \frac{\text{True Positives (TP)}}{\text{True Positives (TP) + False Negatives (FN)}}
Recall (TPR)=True Positives (TP) + False Negatives (FN)True Positives (TP)
True Positives (TP) 表示被正确分类为正例的样本数量。
False Negatives (FN) 表示实际为正例但被错误分类为负例的样本数量。
2.3 精准率(Precision)
真实为正占预测为正的比例(值在0-1,越大越好)
Precision
=
True Positives (TP)
True Positives (TP) + False Positives (FP)
\text{Precision} = \frac{\text{True Positives (TP)}}{\text{True Positives (TP) + False Positives (FP)}}
Precision=True Positives (TP) + False Positives (FP)True Positives (TP)
True Positives (TP) 表示被正确分类为正例的样本数量。
False Positives (FP) 表示实际为负例但被错误分类为正例的样本数量。
2.4 F1 score
衡量二分类模型精确度的指标,是模型精准率和召回率的调和均值(值在0-1,越大越好)
F1 Score
=
2
×
Precision
×
Recall
Precision
+
Recall
\text{F1 Score} = \frac{2 \times \text{Precision} \times \text{Recall}}{\text{Precision} + \text{Recall}}
F1 Score=Precision+Recall2×Precision×Recall
2.5 PR曲线
PR曲线中的P代表的是precision(查准率 / 精准率),R代表的是recall(查全率 / 召回率),其代表的是精准率与召回率的关系,一般情况下,将recall设置为横坐标,precision设置为纵坐标。
绘制步骤
① 排序预测结果:根据分类模型的预测概率值,对测试集中的样本进行排序,通常按照预测为正类的概率值降序排列。② 逐渐降低阈值:从预测概率值最高的样本开始,逐渐降低分类阈值,将样本逐个标记为正例。逐个计算当前的精确率(P)和召回率(R)值。通常,当阈值从1开始逐渐降低到0时,将计算一系列不同阈值下的P和R值。
③ 绘制PR曲线:在每个阈值下,将计算得到的P和R值绘制到图表上。通常,横坐标为召回率(R),纵坐标为精确率(P),并通过连接这些数据点来生成PR曲线。
如图,有一条y=x的斜线,如果平衡点在y=x斜线上,说明分类器预测为正例和真正为正例的比例一致,此时分类器具有较好的性能。但如果平衡点偏离y=x斜线,说明分类器在正例和负例之间存在偏差,需要进一步优化分类器的性能。
2.6 AUC/ROC曲线
AUC的全拼是Area under the Curve,即曲线下的面积。
ROC(Receiver Operating Characteristic)曲线,又称接受者操作特征曲线。ROC 曲线是基于混淆矩阵得出的。AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。
绘制步骤
① 假设已经得出一系列样本的分类概率值(Score),按照大小进行排序,通常按照概率值降序排列。② 从高到低,依次将分类概率值作为分类阈值(threshold),并使用该阈值来决定哪些样本被认为是正样本。对于每个阈值,将样本分类为正例(概率大于等于阈值)或负例(概率小于阈值)。举例来说,对于某个样本,其“Score”值为0.6,那么“Score”值大于等于0.6的样本都被认为是正样本,而其他样本则都认为是负样本。
③ 对于每个不同的阈值,计算真正例率(True Positive Rate,TPR)和假正例率(False PositiveRate,FPR)。TPR表示被正确分类为正例的正例样本占所有真正的正例样本的比例,而FPR表示被错误分类为正例的负例样本占所有真正的负例样本的比例。
④ 根据不同阈值下计算得到的TPR和FPR值,绘制ROC曲线。通常,ROC曲线是一个由不同阈值下的TPR和FPR数据点组成的曲线,其中横轴是FPR,纵轴是TPR。
真正例率(True Positive Rate,TPR)和假正例率(False Positive Rate,FPR)
TPR通常又称为召回率(Recall),它表示被正确分类为正例的正例样本在所有真正的正例样本中的比例。
FPR表示被错误分类为正例的负例样本在所有真正的负例样本中的比例。
TPR(召回率)公式:
TPR (Recall)
=
True Positives (TP)
True Positives (TP) + False Negatives (FN)
\text{TPR (Recall)} = \frac{\text{True Positives (TP)}}{\text{True Positives (TP) + False Negatives (FN)}}
TPR (Recall)=True Positives (TP) + False Negatives (FN)True Positives (TP)
FPR公式:
FPR
=
False Positives (FP)
False Positives (FP) + True Negatives (TN)
\text{FPR} = \frac{\text{False Positives (FP)}}{\text{False Positives (FP) + True Negatives (TN)}}
FPR=False Positives (FP) + True Negatives (TN)False Positives (FP)
- True Positives (TP) 表示被正确分类为正例的样本数量。
- False Negatives (FN) 表示实际为正例但被错误分类为负例的样本数量。
- False Positives (FP) 表示实际为负例但被错误分类为正例的样本数量。
- True Negatives (TN) 表示被正确分类为负例的样本数量。
评估指标:
-
AUC = 1,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
-
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
-
AUC = 0.5,跟随机猜测一样,模型没有预测价值。
-
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测,因此不存在AUC < 0.5的情况。
3. 代码实战
3.1 导入库和生成数据集以及K最近邻分类器的创建和训练:
① 使用make_classification生成一个分类数据集,然后将数据集分成训练集和测试集。
② K最近邻(KNN)分类器被创建,然后使用训练数据集X_train和y_train进行训练。K值在这里设置为5
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分类器
k = 5 # Number of neighbors
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train, y_train)
3.2 测试集上的预测:
使用训练好的KNN分类器,对测试集X_test进行预测,得到y_pred,即预测的类别标签。
# 预测测试集
y_pred = knn.predict(X_test)
3.3 精确度-召回率曲线计算:
在这一部分,计算了精确度-召回率曲线的数据点,包括精确度、召回率以及AUC值。
# 计算精确度-召回率曲线
precision, recall, _ = precision_recall_curve(y_test, y_pred)
3.4 ROC曲线计算:
类似地,计算了ROC曲线的数据点,包括真阳性率(TPR)和假阳性率(FPR),以及AUC-ROC值。
# 计算ROC曲线
fpr, tpr, _ = roc_curve(y_test, y_pred)
# 计算AUC值
roc_auc = auc(fpr, tpr)
3.5 可视化:
最后,使用Matplotlib库将精确度-召回率曲线和ROC曲线可视化。这部分包括绘制两个子图,一个用于精确度-召回率曲线,另一个用于ROC曲线。曲线下面积(AUC)也在图上进行了标注,以便直观评估分类器性能。
# 绘制精确度-召回率曲线
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.step(recall, precision, color='b', alpha=0.2, where='post')
plt.fill_between(recall, precision, alpha=0.2, color='b')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.title('Precision-Recall Curve')
# 绘制ROC曲线
plt.subplot(1, 2, 2)
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc='lower right')
plt.show()
3.6 结果分析
-
精确度-召回率曲线:这个曲线显示了在不同召回率下的分类器精确度。在精确度-召回率曲线中,我们希望获得尽可能高的精确度和召回率。曲线下面积(AUC)越大,分类器性能越好。在这个例子中,曲线下面积(AUC)越接近1,表示分类器在保持高精确度的同时能够捕获更多正例,这是一个好的结果。
-
ROC曲线:这个曲线显示了在不同假阳性率下的真阳性率。与精确度-召回率曲线不同,我们希望ROC曲线越靠近左上角越好,因为那里的真阳性率高,同时假阳性率低。AUC-ROC值越接近1,表示分类器的性能越好。
4. 小结
① 在评估二分类模型的性能时,确保有预测结果的样本标签和概率(或得分):在绘制精确度-召回率曲线和ROC曲线之前,确保你有每个样本的预测结果(类别标签,通常是二元的正例或负例)以及与该预测相关的概率或得分。这些概率或得分可以用来根据不同的阈值判断样本是否为正例或负例。
② 对于精确度-召回率曲线:在这种情况下,你需要使用不同的阈值将样本分为真正例、假正例、真负例和假负例,以计算精确度和召回率。精确度表示被划分为正例的样本中实际为正例的比例,召回率表示所有实际为正例的样本中被正确划分为正例的比例。曲线将展示分类器在不同阈值下的性能。
③ 对于ROC曲线:同样,你需要使用不同的阈值将样本分为真正例、假正例、真负例和假负例,以计算真正率和假正率。真正率表示所有实际为正例的样本中被正确划分为正例的比例,假正率表示所有实际为负例的样本中被错误划分为正例的比例。ROC曲线将展示分类器在不同阈值下的性能。
④ 调整阈值:在绘制这些曲线时,可以调整阈值以查看分类器在不同性能要求下的表现。通常,增加阈值会提高精确度但降低召回率,而降低阈值则会提高召回率但降低精确度。
⑤ 曲线下面积(AUC):精确度-召回率曲线下面积和ROC曲线下面积(AUC-PR和AUC-ROC)可用来量化分类器性能。AUC的值越接近1,表示分类器性能越好。