绘制ROC曲线
ROC曲线是在机器学习和统计学中用于评估分类器性能的重要工具。它以不同的阈值为基础,将分类器的真正率(TPR)与假正率( FPR)之间的关系可视化展示。探讨如何计算和绘制ROC曲线,以及如何解释和评估曲线下的面积(AUC)。
ROC曲线原理
ROC曲线是根据不同的分类阈值绘制的,这些阈值用于将模型的预测结果分为正类和负类。在构建ROC曲线时,我们关注两个关键指标:
-
真正率(TPR):也称为召回率,它表示正确预测为正样本的数量占所有实际为正样本的数量的比例。 TPR 衡量了分类器对正样本的识别能力。公式为 TPR = TP / (TP + FN),其中 TP 为真正例,FN 为假负例。
-
假正率(FPR):它表示错误预测为正样本的数量占所有实际为负样本的数量的比例。 FPR 衡量了分类器将负样本错误识别为正样本的能力。公式为 FPR = FP / (FP + TN),其中 FP 为假正例,TN 为真负例。
ROC曲线的横坐标是 FPR,纵坐标是 TPR。绘制ROC曲线的过程包括以下步骤:
- 计算不同阈值下的 TPR 和 FPR 值。
- 绘制这些值的图形,以可视化描述分类器性能。
代码实现
使用Python来实现绘制ROC曲线的代码。首先,需要计算不同阈值下的 TPR 和 FPR 值。在下面的示例中,使用一组样本标签(y_test)和相应的预测概率值(y_hat)来计算这些值。
def cal_tpfn(y_test, y_hat): tp = fp = tn = fn = 0 for y1, y2 in zip(y_test, y_hat): if (y1, y2) == (0, 0): tn += 1 if (y1, y2) == (0, 1): fp += 1 if (y1, y2) == (1, 0): fn += 1 if (y1, y2) == (1, 1): tp += 1 return tp, fp, tn, fn def simple_roc_curve(y_test, y_hat): thresholds = sorted(set(y_hat), reverse=True) thresholds.append(2) # 添加一个大于1的值,使ROC曲线包含 (0,0) 点 thresholds.sort(reverse=True) fprs = [] tprs = [] for threshold in thresholds: y_pred = [1 if value >= threshold else 0 for value in y_hat] tp, fp, tn, fn = cal_tpfn(y_test, y_pred) tpr = tp / (tp + fn) if (tp + fn) != 0 else 0 fpr = fp / (fp + tn) if (fp + tn) != 0 else 0 fprs.append(fpr) tprs.append(tpr) return fprs, tprs, thresholds
上述代码首先定义了计算 TP、FP、TN、FN 的函数 cal_tpfn
,然后实现了计算 ROC 曲线数据点的函数 simple_roc_curve
。在该函数中,添加了一个大于1的值,确保ROC曲线包含 (0,0) 点,并计算不同阈值下的 TPR 和 FPR。
运行结果
from sklearn.metrics import roc_auc_score
import matplotlib.pyplot as plt
# 示例数据(用真实数据替代)
y_test = [1, 0, 1, 0, 1, 1, 0, 0, 1, 1]
y_hat = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.05]
fprs, tprs, thresholds = simple_roc_curve(y_test, y_hat)
roc_auc = roc_auc_score(y_test, y_hat)
# 设置图形的长宽,使图形适当拉长
plt.figure(figsize=(12, 5))
# 绘制ROC曲线
plt.plot(fprs, tprs, color='red', lw=2, label='ROC CURVE (AUC = %0.2f)' % roc_auc)
# 添加对角线
plt.plot([0, 1], [0, 1], color='blue', lw=2, linestyle='--')
# 设置横纵坐标范围
plt.xlim([0, 1])
plt.ylim([0, 1.05])
# 设置横纵坐标标签
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
# 设置曲线标题
plt.title('Receiver Operating Characteristic Curve')
# 显示曲线标签
plt.legend(loc='lower right')
# 显示图形
plt.show()
结论
通过上述代码和绘图,成功绘制了ROC曲线并计算了曲线下的面积(AUC)。ROC曲线是评估分类器性能的有力工具,AUCPR的值越接近1,表示分类器性能越好。在这个例子中,我们得到了一个AUC值为0.95,表明该分类器的性能非常不错。
绘制PR曲线
PR曲线(Precision-Recall Curve)是在机器学习中用于评估分类器性能的重要工具。与ROC曲线不同,PR曲线关注的是正例的精确性(Precision)和召回率(Recall)。
PR曲线原理
PR曲线是根据不同的分类阈值绘制的,这些阈值用于将模型的预测结果分为正类和负类。在构建PR曲线时,关注两个关键指标:
-
精确率(Precision):表示正确预测为正样本的数量占所有预测为正的样本数量(包括正确预测和错误预测)的比例。 Precision = TP / (TP + FP)。它衡量的是分类器预测正样本的准确性,即在所有预测为正的样本中,正确预测的比例有多少。
-
召回率(Recall):与ROC曲线中的真正率(TPR)相同,表示正确预测为正样本的数量占所有实际为正的样本数量的比例。 Recall = TP / (TP + FN)。它衡量的是分类器对正样本的识别能力,即能够正确分类多少比例的正样本。
与ROC曲线不同,PR曲线的横坐标是召回率,纵坐标是精确率。绘制PR曲线的过程包括以下步骤:
- 计算不同阈值下的精确率和召回率值。
- 绘制这些值的图形,以可视化描述分类器性能。
代码实现
使用Python来实现绘制PR曲线的代码。首先,需要计算不同阈值下的精确率和召回率值。在下面的示例中,我们将使用一组样本标签(y_test)和相应的预测概率值(y_hat)来计算这些值。
def simple_pr_curve(y_test, y_hat): thresholds = sorted(set(y_hat)) precisions = [] recalls = [] for threshold in thresholds: y_pred = [1 if value >= threshold else 0 for value in y_hat] tp, fp, tn, fn = cal_tpfn(y_test, y_pred) precision = tp / (tp + fp) if (tp + fp) != 0 else 0 recall = tp / (tp + fn) if (tp + fn) != 0 else 0 precisions.append(precision) recalls.append(recall) precisions.append(1.) recalls.append(0.) return precisions, recalls, thresholds
上述代码定义了计算精确率和召回率的函数 simple_pr_curve
,并在函数中添加了一个(0,1)的数据点,以确保PR曲线包含完整的范围。
运行结果
from sklearn.metrics import average_precision_score
import matplotlib.pyplot as plt
# 示例数据(用真实数据替代)
y_test = [1, 0, 1, 0, 1, 1, 0, 0, 1, 1]
y_hat = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.05]
precisions, recalls, thresholds = simple_pr_curve(y_test, y_hat)
pr_auc = average_precision_score(y_test, y_hat)
plt.figure(figsize=(12, 5))
plt.plot(recalls, precisions, color='orange', lw=2, label='PR CURVE (AUC = %0.2f)' % pr_auc)
plt.xlim([0, 1])
plt.ylim([0, 1.05])
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-Recall Curve')
plt.legend(loc='lower right')
plt.show()
结论
通过上述代码和绘图,成功绘制了PR曲线并计算了曲线下的面积(AUC)。与ROC曲线不同,PR曲线的AUC衡量的是分类器对正样本的预测准确性和识别能力。在这个示例中,得到了一个AUC值为0.89,表明该分类器在维持高精确率的同时,也具有较高的召回率。