【机器学习】模型评估
目录一、引言1.什么是模型评估2.为什么机器学习中需要进行模型评估3. ROC曲线与PR曲线二分类模型评估的核心工具二、关键指标与混淆矩阵理解评估的基础1. 混淆矩阵分类结果的四象限表示2. 核心评估指标2.1 基于正类识别的指标2.2 基于负类识别的指标2.3 综合指标2.4 各个指标的使用情况3. 指标间的权衡关系四、PR曲线介绍1.PR曲线原理查准率和查全率2.PR曲线绘制3.通过PR 曲线判断分类器性能五、ROC曲线介绍1. 混淆矩阵的基石2. ROC曲线坐标轴数学定义3. 动态阈值遍历机制4. AUC 的统计学本质5.如何判断 ROC 曲线的好坏6.代码7.AUC曲线下的面积AUC 的一般判断标准AUC 的物理意义六、ROC和PR曲线如何选择1. 核心区别2. 什么时候选择 ROC 曲线3. 什么时候选择 PR 曲线一、引言1.什么是模型评估模型评估是指对训练完成的模型进行性能分析和测试的过程以确定模型在新数据上的表现如何。在模型评估中,我们会将数据计划分成三个部分:训练集、验证集和测试集训练集(Traing Set用于训练模型通过调整模型的参数使其能够拟合数据验证集Validation Set用于在训练过程中评估模型的性能帮助调整超参数并防止过拟合测试集Test Set用于评估最终训练完成的模型在未见过的数据上的性能是衡量模型泛化能力的关键from sklearn.model_selection import train_test_split import numpy as np X, y np.arange(10).reshape((5, 2)), range(5) 首先将数据集划分为训练集和测试集测试集大小为20% X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) 然后将训练集进一步划分为实际的训练集和验证集验证集大小为训练集的20% X_train, X_val, y_train, y_val train_test_split(X_train, y_train, test_size0.2, random_state42) print(训练集特征, X_train) print(训练集标签, y_train) print(验证集特征, X_val) print(验证集标签, y_val) print(测试集特征, X_test) print(测试集标签, y_test)2.为什么机器学习中需要进行模型评估机器学习模型评估是验证模型泛化能力的关键环节直接影响模型在实际应用中的可靠性。通过系统化评估能够准确衡量模型在未知数据上的性能识别过拟合或欠拟合问题。评估过程不仅用于模型选择还能深入分析模型的局限性和优势例如处理数据分布不均的能力、对特定错误类型的鲁棒性等。科学的评估方法为模型调优提供依据确保其在实际场景中的稳定表现同时为后续改进提供明确方向。3. ROC曲线与PR曲线二分类模型评估的核心工具在机器学习模型评估中ROC曲线和PR曲线是两种至关重要的可视化工具专门用于评估二分类模型的性能。它们从不同角度揭示了模型在识别正类与控制误判之间的权衡关系为模型选择和阈值优化提供了直观依据。为什么需要这两种曲线传统的单一指标如准确率在类别不平衡或不同误判代价的场景下往往失效。例如在疾病检测中漏诊假阴性的代价远高于误诊假阳性而在垃圾邮件过滤中误判正常邮件为垃圾邮件的代价又很高。ROC曲线和PR曲线通过展示模型在不同阈值下的性能变化帮助我们找到最适合业务需求的平衡点。核心区别ROC曲线关注模型区分正负样本的整体能力横轴是假正例率FPR纵轴是真正例率TPR。PR曲线聚焦于模型对正类的识别质量横轴是召回率Recall纵轴是精确率Precision。理解这两种曲线的适用场景、绘制原理和解读方法是掌握模型评估的关键。接下来我们将从基础概念入手逐步深入探讨它们的应用。二、关键指标与混淆矩阵理解评估的基础混淆矩阵及其衍生的关键评估指标。这些概念是理解所有二分类评估工具的前提。1. 混淆矩阵分类结果的四象限表示混淆矩阵是一个2×2的表格直观展示了模型预测结果与实际标签的对应关系实际类别正类Positive负类Negative预测类别正类真正例TP预测正确实际为正预测为正假正例FP预测错误实际为负预测为正Type I Error负类假负例FN预测错误实际为正预测为负Type II Error真负例TN预测正确实际为负预测为负2. 核心评估指标从混淆矩阵中我们可以推导出多个关键指标每个指标从不同角度反映模型性能汇总见下图详细见下文介绍2.1 基于正类识别的指标召回率Recall也称真正例率TPR或灵敏度SensitivityRecall TPR Sensitivity TP / (TP FN)实际为正的样本中被正确识别为正的比例。精确率Precision也称查准率Precision TP / (TP FP)预测为正的样本中实际确实为正的比例。2.2 基于负类识别的指标真负例率TNR也称特异度SpecificityTNR Specificity TN / (TN FP)实际为负的样本中被正确识别为负的比例。假正例率FPRFPR FP / (FP TN) 1 - Specificity实际为负的样本中被错误识别为正的比例。这是ROC曲线的横坐标。2.3 综合指标F1分数F1-Score精确率和召回率的调和平均数平衡了两者的重要性F1 2 × (Precision × Recall) / (Precision Recall)准确率Accuracy所有预测正确的样本比例Accuracy (TP TN) / (TP TN FP FN)2.4 各个指标的使用情况1.分类器分对多少准确率Accuracy2.返回的图片中正确的有多少精确率Precision3.正确的图片中有多少被返回了召回率Recall以上都是针对二分类的那如果是N分类呢3. 指标间的权衡关系这些指标之间存在固有的权衡Trade-off关系精确率 vs 召回率提高召回率找到更多正例通常需要降低分类阈值这会引入更多假正例从而降低精确率。TPR vs FPR提高TPR识别更多正例通常会导致FPR增加更多负例被误判为正。敏感度 vs 特异度两者往往难以同时最大化需要根据业务需求寻找平衡点。正是这些权衡关系使得ROC曲线和PR曲线成为模型评估中不可或缺的工具。它们通过可视化这些权衡帮助我们选择最适合的分类阈值。四、PR曲线介绍1.PR曲线原理查准率和查全率查准率Pprecision表示所有被预测为正类的样本TPFP是真正类TP的比例召回率Rrecall)表示所有真正类的样本TPFN中被预测为真正类TP的比例2.PR曲线绘制PR曲线的横坐标为召回率R纵坐标为查准率P绘制步骤如下1. 将预测结果按照预测为正类概率值排序2. 将概率阈值由1开始逐渐降低按此顺序逐个把样本作为正例进行预测每次可以计算出当前的PR值3. 以P为纵坐标R为横坐标绘制点将所有点连成曲线后构成PR曲线图注正负样本极度不平衡下的 PR 曲线生成起点 (Threshold 1.00)(a) 左图概率分布与初始阈值。展示了典型的不平衡数据场景负类样本数量远超正类。此时分类判定阈值红色虚线设定为最高值 1.00模型处于最保守的预测状态。(b) 右图PR 曲线的坐标起点。对应左图的严格阈值模型此时的查全率Recall趋近于 0但查准率Precision达到 1.0即图中的红色起始点 (0, 1)。图中的灰色虚线 (Baseline 0.08) 代表数据集中正样本的真实比例即随机猜测的基准性能。随着阈值向左逐步放宽红点将向右侧延伸最终描绘出完整的 PR 曲线当前 AP 0.837。3.通过PR 曲线判断分类器性能如果一个学习器的P-R曲线被另一个学习器的P-R曲线完全包住则可断言后者的性能优于前者例如上面的A和B优于学习器C。但是A和B的性能无法直接判断我们可以根据曲线下方的面积大小来进行比较但更常用的是平衡点或者是F1值。平衡点BEP是PR时的取值如果这个值较大则说明学习器的性能较好。而同样F1值越大我们可以认为该学习器的性能较好。五、ROC曲线介绍1. 混淆矩阵的基石当我们设定一个固定的判定阈值 T例如 T 0.5时预测结果与真实标签会构成混淆矩阵。其中包含四个基本统计量TP (True Positive)真实为正类预测也为正类。FP (False Positive)真实为负类却被错误预测为正类。TN (True Negative)真实为负类预测也为负类。FN (False Negative)真实为正类却被错误预测为负类。2. ROC曲线坐标轴数学定义ROC 曲线将其二维空间映射为两个条件概率也就是混淆矩阵推导出的两个核心指标纵轴 (TPR - 真正例率 / 敏感度)物理意义在所有真实的正类样本中模型成功召回了多少比例。横轴 (FPR - 假正例率)物理意义在所有真实的负类样本中模型错误触发了多少比例的假警报。3. 动态阈值遍历机制学术上的 ROC 曲线不是一个静态的点而是一个连续积分过程。对于经过 Sigmoid 或 Softmax 激活输出概率的网络其工作流程如下将测试集中所有像素按模型输出的预测概率从高到低严格排序。将判定阈值从逐渐降低到。每次阈值降低都会有更多的像素被划分为“正类”这会导致 TP 和 FP 同时增加即 TPR 和 FPR 单调递增。记录下每一个对应的坐标点将其连线便构成了 ROC 曲线。4. AUC 的统计学本质ROC 曲线下的面积被称为 AUCArea Under Curve其取值范围在之间从统计学角度Mann-Whitney U 检验来看AUC 具有极其优雅的概率解释随机抽取一个正类样本和一个负类样本模型给该正类样本打出的预测概率严格大于给负类样本打出概率的概率即是 AUC 值。因此AUC 衡量的是模型对正负样本的相对排序能力。这使得它对极度不平衡的数据集具有很强的抗干扰性。如果一个模型的 AUC 为 0.9意味着在 90% 的情况下模型都能正确地将正样本排在负样本前面。5.如何判断 ROC 曲线的好坏改变阈值只是不断地改变预测的正负样本数即 TPR 和 FPR但是曲线本身是不会变的。那么如何判断一个模型的 ROC 曲线是好的呢这个还是要回归到我们的目的FPR 表示模型虚报的响应程度而 TPR 表示模型预测响应的覆盖程度。我们所希望的当然是虚报的越少越好覆盖的越多越好。所以总结一下就是TPR 越高同时 FPR 越低即 ROC 曲线越陡那么模型的性能就越好。图注无区分能力的分类器随机猜测及其 ROC 曲线表现(a) 左图概率分布重叠图中展示了模型对正样本Autism/自闭症和负样本Controls/健康对照组预测概率的核密度估计。两条分布曲线完全重叠表明分类器提取的特征无法在统计学上区分这两个群体。随着判定阈值垂直边界的移动被划分为正类的真实正样本比例与被误判为正类的真实负样本比例始终保持一致。(b) 右图对角线 ROC 曲线由于左图中两类样本分布完全一致其对应的受试者工作特征ROC曲线退化为一条连接点 (0,0) 与 (1,1) 的对角直线。此时真正例率Sensitivity与假正例率False Positive Rate呈 1:1 的线性关系。该曲线下的面积AUC等于 0.5在数学上等效于抛硬币式的随机盲猜证明当前模型在这个任务上没有任何预测价值。6.代码import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import roc_curve, auc from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier # 1. 初始化和清理环境 plt.rcdefaults() # 兼容性处理尝试加载新版样式若失败则退回旧版或默认 try: plt.style.use(seaborn-v0_8-whitegrid) except OSError: try: plt.style.use(seaborn-whitegrid) except OSError: pass # 如果都没有就用默认样式后面代码会自动画网格 plt.rcParams[font.family] sans-serif plt.rcParams[axes.linewidth] 1.0 # 2. 准备数据 X, y make_classification(n_samples1000, n_features20, n_classes2, random_state42) X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) classifier RandomForestClassifier(random_state42) classifier.fit(X_train, y_train) y_scores classifier.predict_proba(X_test)[:, 1] fpr, tpr, thresholds roc_curve(y_test, y_scores) roc_auc auc(fpr, tpr) # # 3. 核心修复区去除了冲突的布局指令 # fig, ax plt.subplots(figsize(7.5, 6.5), dpi300) # 绘制曲线 ax.plot(fpr, tpr, color#d62728, lw2.2, labelfProposed Model (AUC {roc_auc:.3f})) ax.plot([0, 1], [0, 1], colorgray, lw1.2, linestyle--, labelRandom Guessing (AUC 0.500)) # 设置字体大小变量 tick_fontsize 10 label_fontsize 12 title_fontsize 14 legend_fontsize 10 # 美化刻度和标签 ax.tick_params(axisboth, whichmajor, labelsizetick_fontsize) ax.set_xlabel(False Positive Rate, fontsizelabel_fontsize, fontweightbold) ax.set_ylabel(True Positive Rate, fontsizelabel_fontsize, fontweightbold) # 标题 (使用 pad 增加与图表的距离防止重叠) ax.set_title(Receiver Operating Characteristic, fontsizetitle_fontsize, fontweightbold, pad15) # 图例优化 ax.legend(loclower right, frameonTrue, fontsizelegend_fontsize, edgecolorblack, framealpha0.9) # 坐标轴范围 ax.set_xlim([-0.02, 1.02]) ax.set_ylim([-0.02, 1.02]) ax.grid(True, linestyle:, alpha0.5, colorgray) ax.spines[top].set_visible(False) ax.spines[right].set_visible(False) # 【核心修改】只保留 tight_layout并结合底部的 bbox_inchestight不再手动写死 margin plt.tight_layout() # 保存与展示 plt.savefig(ROC_Curve_Paper_Fixed.pdf, formatpdf, bbox_inchestight) plt.show()画图效果7.AUC曲线下的面积为了计算 ROC 曲线上的点可以使用不同的分类阈值多次评估逻辑回归模型 但这样做效率非常低。幸运的是有一种基于排序的高效算法可以为我们提供此类信息这种算法称为曲线下面积Area Under Curve。连接对角线它的面积正好是 0.5。对角线的实际含义是随机判断响应与不响应正负样本覆盖率应该都是 50%表示随机效果。 ROC 曲线越陡越好所以理想值就是 1一个正方形而最差的随机判断都有 0.5所以一般 AUC 的值是介于 0.5 到 1 之间的。AUC 的一般判断标准0.5 – 0.7 效果较低但用于预测股票已经很不错了0.7 – 0.85 效果一般0.85 – 0.95 效果很好0.95 – 1 效果非常好但一般不太可能AUC 的物理意义曲线下面积对所有可能的分类阈值的效果进行综合衡量。曲线下面积的一种解读方式是看作模型将某个随机正类别样本排列在某个随机负类别样本之上的概率。六、ROC和PR曲线如何选择1. 核心区别ROC 曲线的核心在于“兼顾”它的两个核心指标TPR和FPR分别独立计算了模型对正样本和负样本的处理能力将正负类放在了同等重要的地位。PR 曲线的核心在于“聚焦”它的两个指标Precision 和 Recall全部聚焦于正类目标在计算公式中彻底抛弃了对庞大负类True Negative即正确识别的背景的统计。2. 什么时候选择 ROC 曲线正负样本比例相对均衡当数据集中的正负样本数量处于同一数量级时ROC 能够给出一个宏观、无偏的综合评估。关注模型的整体概率排序能力在通用的二分类任务中如果你更看重模型“把正样本排在负样本前面”的潜力且对误报和漏报没有极端的偏好ROC 的 AUC 值是最权威的通用基准。3. 什么时候选择 PR 曲线正负样本极度不平衡Data Imbalance这是 PR 曲线绝对的主场。例如在进行医学图像语义分割或工业缺陷检测时背景像素量往往是目标区域的成百上千倍使用 PR 曲线能有效避免模型表现被庞大的背景基数“虚假繁荣”。极度关注“抓取准确度”在稀有目标检测中如果你极其看重模型“一旦框出目标就必须准确”的能力PR 曲线能清晰地放大模型在 Precision 上的剧烈震荡无情地暴露模型在困难样本上的真实短板。参考资料:PR曲线原理及通过曲线判断分类器优劣_模型的pr曲线的好坏-CSDN博客https://blog.csdn.net/Vermont_/article/details/108625669
