最近回顾机器学习基础知识部分的时候,看到了用于评估机器学习模型性能的ROC曲线。再次记录一下,想起之前学习的时候的茫然,希望这次可以更加清晰的了解这一指标。上课的时候听老师提起过,当时没有认真去看,所以这次可以全面的理解,并做些总结。
ROC的全称是“受试者工作特征”(Receiver Operating Characteristic)曲线,最初由二战中的电子工程师和雷达工程师发明,用于侦测战场上的敌军载具,例如飞机和船舰。该曲线最早应用于信号检测理论,随后被引入心理学领域,用于研究信号的知觉检测。由于其在评估分类和检测结果方面的有效性,ROC曲线很快在机器学习领域得到了广泛应用。因此,ROC曲线成为了一种重要且常见的统计分析方法。
ROC(Receiver Operating Characteristic)曲线和AUC(Area Under the Curve)是用于评估二分类模型性能的常见工具,它们主要关注模型在不同阈值下的真正例率(True Positive Rate,也称为召回率)和假正例率(False Positive Rate)之间的权衡。通俗的讲,它衡量的是ROC曲线下的面积,而ROC曲线则描绘了在不同阈值下,真阳性率(也称为敏感度或召回率)与假阳性率之间的关系。
ROC-AUC的评估主要借助下面的两个公式
ROC曲线:
ROC曲线是一条二维图,横轴表示假正例率(FPR),纵轴表示真正例率(TPR,召回率)。
每个点对应于模型在不同阈值下的性能,曲线展示了在不同阈值下TPR和FPR之间的权衡关系。
一条完全随机的ROC曲线表现为对角线(45度直线),而一条往左上角凸起的曲线表示模型性能较好。
召回率可以参考博主的前面博客:https://editor.csdn.net/md/?articleId=135736043
AUC值:
AUC是ROC曲线下的面积,用来量化模型性能的综合指标。AUC的取值范围在0到1之间,越接近1表示模型性能越好,0.5表示随机性能。
一个完全随机的分类器的AUC为0.5,而一个完美分类器的AUC为1.0。
绘制ROC曲线的步骤包括计算真正例率(True Positive Rate,TPR)和假正例率(False Positive Rate,FPR)的数值,并在坐标系上绘制这些点,最终得到ROC曲线。以下是详细的步骤:
1.准备数据: 有两个关键的输入数据,即真实标签(y_true)和模型的预测概率值(y_scores)。
2.排序: 将预测概率值按降序排列,并同时调整真实标签的顺序,使其与排序后的概率值一致。
3.计算TPR和FPR: 遍历排序后的样本,计算每个点对应的TPR和FPR。TPR表示正例被正确预测的比例,而FPR表示负例被错误预测为正例的比例。
初始化TPR和FPR为0。
对每个样本:
如果是正例,则更新TPR,并保持FPR不变。
如果是负例,则更新FPR,并保持TPR不变。
4.计算AUC: 使用梯形法则计算曲线下面积(AUC)。AUC值越接近1,说明模型性能越好。
5.绘制ROC曲线: 将计算得到的TPR和FPR点在坐标系上绘制成ROC曲线。通常还会添加对角线(随机猜测的线)作为参考。
不受类别不平衡的影响:在面对不平衡的分类问题时,准确率可能不是一个全面的评估指标,因为它受到类别分布不均的影响。而ROC-AUC通过考虑真正例率(召回率)和假正例率,更好地反映了模型在不同类别之间的平衡。
对不同阈值的鲁棒性:ROC曲线能够展示模型在不同阈值下的性能,使得我们能够全面了解模型在灵敏性和特异性之间的权衡。这对于不同应用场景下的需求非常重要。
综合考虑假阳性和假阴性:F1分数关注准确率和召回率的调和平均,而ROC-AUC通过曲线下的面积综合考虑了假阳性率和真阳性率,为评估模型在不同情境下的性能提供了更全面的视角。
能够比较不同模型:由于ROC-AUC是一个标准化的度量,它允许我们比较不同模型在相同任务上的性能,无论这些模型的具体实现和参数设置如何。
对于非平衡数据集更具敏感性:在处理非平衡数据集时,ROC-AUC更为敏感,能够更好地反映出模型对少数类别的性能。
3.1 面向多类别问题的改进: 未来的研究可以专注于将ROC-AUC扩展到多类别分类问题,并提供更全面的性能评估。
3.2 考虑不同代价的评估: 在一些应用场景中,对于假阳性和假阴性的代价可能不同,未来的发展方向可以考虑在ROC-AUC的基础上引入代价敏感性。
3.3 整合其他性能指标: ROC-AUC通常与其他指标结合使用,未来的发展可以考虑设计更全面的评估框架,同时综合考虑准确率、召回率等指标。
3.4 适应不同领域需求: 针对不同应用领域的需求,可以开发具有领域专业性的ROC-AUC变体,以更好地适应特定领域的性能评估。
下面是一个不使用封装的简单ROC-AUC的Python代码实现:
import numpy as np
import matplotlib.pyplot as plt
def calculate_roc_auc(y_true, y_scores):
# 将真实标签和预测概率按概率值降序排序
sorted_indices = np.argsort(y_scores)[::-1]
y_true_sorted = y_true[sorted_indices]
y_scores_sorted = y_scores[sorted_indices]
# 计算正例和负例样本的数量
num_positives = np.sum(y_true == 1)
num_negatives = np.sum(y_true == 0)
# 初始化ROC曲线的参数
tpr_points = [0]
fpr_points = [0]
auc = 0
# 遍历排序后的样本,更新TPR、FPR和AUC
for i in range(len(y_scores_sorted)):
if y_true_sorted[i] == 1:
tpr_points.append(tpr_points[-1] + 1 / num_positives)
fpr_points.append(fpr_points[-1])
auc += (fpr_points[-1] - fpr_points[-2]) * tpr_points[-1]
else:
tpr_points.append(tpr_points[-1])
fpr_points.append(fpr_points[-1] + 1 / num_negatives)
return fpr_points, tpr_points, auc
# 示例用法
y_true = np.array([1, 0, 1, 1, 0, 1, 0, 0])
y_scores = np.array([0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2])
fpr, tpr, auc = calculate_roc_auc(y_true, y_scores)
# 绘制ROC曲线
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (AUC = {:.2f})'.format(auc))
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic (ROC) Curve')
plt.legend(loc='lower right')
plt.show()
运行后的代码如下
使用sklearn库函数进行简单代码示例:
from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt
# 示例数据
true_labels = [1, 0, 1, 1, 0, 1]
predicted_probs = [0.8, 0.2, 0.6, 0.9, 0.3, 0.7]
# 计算ROC曲线的FPR和TPR
fpr, tpr, thresholds = roc_curve(true_labels, predicted_probs)
# 计算AUC值
auc = roc_auc_score(true_labels, predicted_probs)
# 绘制ROC曲线
plt.plot(fpr, tpr, label=f'AUC = {auc:.2f}')
plt.plot([0, 1], [0, 1], linestyle='--', color='gray', label='Random')
plt.xlabel('False Positive Rate (FPR)')
plt.ylabel('True Positive Rate (TPR)')
plt.title('ROC Curve')
plt.legend()
plt.show()
上述代码使用roc_curve和roc_auc_score函数计算ROC曲线和AUC值,并使用Matplotlib库绘制ROC曲线图。