机器学习之类别不平衡问题 (2) —— ROC和PR曲线

本文详细探讨了ROC曲线和PR曲线在类别不平衡问题中的应用。ROC曲线通过真正例率(TPR)和假正例率(FPR)展示了模型在不同阈值下的表现,而PR曲线则关注Precision和Recall。ROC曲线适用于评估整体性能,不受类别分布影响,而PR曲线更适合关注正例。在类别不平衡问题中,PR曲线通常提供更准确的评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


机器学习之类别不平衡问题 (1) —— 各种评估指标
机器学习之类别不平衡问题 (2) —— ROC和PR曲线

完整代码


ROC曲线和PR(Precision - Recall)曲线皆为类别不平衡问题中常用的评估方法,二者既有相同也有不同点。本篇文章先给出ROC曲线的概述、实现方法、优缺点,再阐述PR曲线的各项特点,最后给出两种方法各自的使用场景。

ROC曲线

这里写图片描述
ROC曲线常用于二分类问题中的模型比较,主要表现为一种真正例率 (TPR) 和假正例率 (FPR) 的权衡。具体方法是在不同的分类阈值 (threshold) 设定下分别以TPR和FPR为纵、横轴作图。由ROC曲线的两个指标, TPR=TPP=TPTP+FN T P R = T P P = T P T P + F N FPR=FPN=FPFP+TN F P R = F P N = F P F P + T N 可以看出,当一个样本被分类器判为正例,若其本身是正例,则TPR增加;若其本身是负例,则FPR增加,因此ROC曲线可以看作是随着阈值的不断移动,所有样本中正例与负例之间的“对抗”。曲线越靠近左上角,意味着越多的正例优先于负例,模型的整体表现也就越好。

AUC (Area Under the Curve)

这里写图片描述
先看一下ROC曲线中的随机线,图中[0,0]到[1,1]的虚线即为随机线,该线上所有的点都表示该阈值下TPR=FPR,根据定义, TPR=

### 类别平衡问题下调整机器学习模型评估指标的方法 对于类别平衡的数据集,传统的准确率再是有效的评价标准,因为即使模型总是预测多数类也能获得较高的准确率。因此,在这种情况下应采用更加适合的评估指标。 #### 使用混淆矩阵衍生出来的指标 为了更好地理解量化模型的表现,可以依赖于由混淆矩阵派生出的一系列度量,如精度(Precision),召回率(Recall)以及F1分数(F1 Score)[^1]: - **Precision (精准率)** 表示被正确识别为正例的比例; - **Recall (召回率)** 反映的是所有实际为正的例子中有多少比例被成功检测出来; - **F1-Score** 是 Precision Recall 的调平均数,提供了一种综合考量两者平衡性的单一数值表示法。 这些基于混淆矩阵定义的统计量能够帮助我们更全面地认识分类效果,尤其是在面对均衡分布的任务场景时显得尤为重要。 #### AUC-ROCPRC的选择依据 除了上述提到的具体数值型指标外,还可以利用图形化的手段来进行直观展示——即接收者操作特征曲线(AUROC)及其对应的曲线下面积(Area Under Curve, AUC)或是精确率-召回率曲线(Precision-Recall Curve, PRC)。当正样本数量稀少或者误报的成本高于漏检时,则建议优先考虑PRC;而在其余大多数情形之下AUROC都是较为理想的选择[^5]。 ```python from sklearn.metrics import precision_recall_curve, auc, roc_curve, roc_auc_score # 计算 PR 曲线并求得 AUPRprecision, recall, _ = precision_recall_curve(y_true, y_pred_proba) aupr = auc(recall, precision) # 或者计算 ROC 曲线及 AUROC 值 fpr, tpr, thresholds = roc_curve(y_true, y_pred_proba) roc_auc = roc_auc_score(y_true, y_pred_proba) ``` #### 交叉验证的重要性 考虑到单次划分可能导致偶然偏差的影响,故推荐运用K折交叉验证(K-fold Cross Validation)技术来增强结论稳健性。这种方法仅有助于获取更为可靠的性能估计值,而且还能有效防止过拟合现象的发生[^3]。 ```python from sklearn.model_selection import cross_val_score scores = cross_val_score(model, X, y, cv=5, scoring='roc_auc') mean_roc_auc = scores.mean() std_roc_auc = scores.std() print(f'Mean ROC-AUC score: {mean_roc_auc:.3f} (+/-{std_roc_auc*2:.3f})') ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值