我做机器学习这几年,发现一个特别有意思的现象:很多人选模型的时候特别较真,XGBoost还是LightGBM、核函数用RBF还是多项式,研究得头头是道;但一到了模型评估环节,就只盯着准确率(Accuracy)看,准确率高了就觉得自己模型天下无敌,准确率低了就开始盲目调参。说实话,这是典型的还没入门的做法。
准确率这个指标,在绝大多数真实场景下是会骗人的。尤其是分类问题里正负样本不平衡的时候,比如垃圾邮件识别、欺诈交易检测、罕见病筛查,你就算写个"永远预测为负样本"的智障模型,准确率也能轻松超过95%。这时候真正能反映模型好坏、帮你做判断的,是PR曲线和ROC曲线这两个评估利器。
这篇文章我就用最直白的方式,把这俩曲线彻底聊透。不仅讲清楚它们的定义、怎么画、怎么看,还会把期末考试、面试里最刁钻的坑点一一点出来,最后带大家用Python在真实数据集上走一遍完整流程。不管是正在学机器学习的学生、准备复试的研究生,还是刚入行做算法应用开发的工程师,这篇文章都值得你花二十分钟读完,读完之后你对模型评估的认知会直接上一个台阶。
1. 为什么模型评估比调参更重要:从分类任务的两个基本问题说起
1.1 分类模型输出的不是“0/1”而是“分数”
很多人对分类模型有个误解,以为逻辑回归或者SVM输出的结果就是"样本属于正类还是负类"的硬标签。实际上绝大多数分类模型输出的都是一个分数,或者叫置信度——代表这个样本属于正类的概率或者置信程度。
以逻辑回归为例,模型计算出来的是一个在0到1之间的概率值,比如0.82、0.45、0.13这样的小数。我们之所以看到"预测为正类"和"预测为负类"这样的结果,是因为我们人为地设定了一个阈值(threshold),超过这个阈值就归为正类,低于就归为负类。默认情况下sklearn会把这个阈值设为0.5,但0.5并不是什么天经地义的标准,在很多场景下你完全可以把它调到0.3、0.7,没有对错,只看你想要什么样的评估效果。
理解了这一点,就理解了两条曲线存在的根本意义:PR曲线和ROC曲线,都是在"模型分数"的基础上,通过扫描不同阈值来全面评估模型能力的工具。它们不依赖某一个固定阈值,而是把所有可能阈值下的表现都画出来给你看,让你对模型有一个全貌式的认识。这是一个很关键的思维转变——模型好不好,不是某一个阈值下准不准,而是"分数排序是否合理"。
1.2 评估指标的起点:混淆矩阵和四个基础量
在聊PR和ROC之前,必须先建立一个公共语言:混淆矩阵(Confusion Matrix)。这玩意儿结构非常简单,就是把预测结果和真实情况做了一个二维交叉统计,一共四个格子:
- TP(真正例,True Positive):真实为正类,模型也预测为正类。
- FP(假正例,False Positive):真实为负类,但模型预测成了正类。这类错误也被称为"误报"。
- FN(假负例,False Negative):真实为正类,但模型预测成了负类。这类错误也被称为"漏报"。
- TN(真负例,True Negative):真实为负类,模型也预测为负类。
这四个量是一切分类评估指标的根源。准确率就是(TP+TN)除以总数,它把两个格子都'对了'的情况合计在一起,看起来很全面,但也正是因为太全面,反而容易掩盖问题。比如样本里99个负类、1个正类,模型把1个正类也判成负类,也就是TP=0、TN=99、FP=0、FN=1,准确率是99%,但正类一个都没找出来,这在很多业务场景下等于完全失败。
所以后来人们才设计出了更精细的指标——查准率(Precision)、查全率(Recall)、真正例率(TPR)、假正例率(FPR),分别从"预测为正类的样本里有多少是对的"、"真实正类里有多少被找出来了"、"真实负类里有多少被误伤了"等不同角度去度量一个模型。咱们接下来要讲的PR曲线和ROC曲线,就是围绕这些基础量构建的。
2. PR曲线:查准率与查全率的博弈
2.1 查准率、查全率:先用一个通俗例子看懂
把这两个指标放到一个具体场景里,会好理解得多。假设你在做一个电商平台的"风险订单识别"模型,任务是从每天几十万订单里找出那些可能是诈骗或者恶意下单的订单,交给风控团队去人工审核。
- 查准率(Precision):模型说"这是风险订单"的里面,有多少单是真有问题的。如果模型标记了100个订单,但人工复查发现只有50个确实有问题,那查准率就是50%。它衡量的是"抓出来的质量",也叫精确率。
- 查全率(Recall):当天全平台实际发生了20笔诈骗订单,模型成功找出了其中15笔,那查全率就是75%。它衡量的是"抓得全不全",也叫召回率。
这两个指标天然是矛盾的。你把阈值调低一点,模型会标记出更多"疑似风险订单",这样挖出来的真实诈骗单子会变多,查全率上去了,但同时也必然混进来很多正常订单,查准率就下降了。反过来,阈值调高,模型只敢标记那些概率极高的订单,查准率上去了,但很多狡猾的、分数不算高的诈骗单会被漏掉,查全率就下来了。
2.2 PR曲线的绘制逻辑与面积:AP值到底在衡量什么
PR曲线,全称是Precision-Recall Curve,横轴是查全率(Recall),纵轴是查准率(Precision),把模型输出概率从高到低排好,然后从概率最高的样本开始,逐个把样本点纳入"预测为正类"的集合中,每纳入一个样本就重新计算一组(查准率,查全率),把所有的点连起来,就得到一条PR曲线。
这里有个细节很多人容易忽略:PR曲线不一定是光滑的递减曲线。由于每次只增加一个样本,查准率会在这个样本是真正例时上升、是假正例时下降,所以曲线会带有锯齿状波动。当模型完全没有区分能力时,曲线会退化成一条水平线,高度约等于正样本占比。
有了PR曲线之后,咱们常说的AP值(Average Precision)其实就是"PR曲线下的面积"的一种计算方式,只不过更常用的做法是对每个样本点的查准率取平均(或者用插值法)。AP值越高,说明这个模型在"不牺牲太多查全率的同时保持高查准率"的能力越强。AP=1.0是完美模型的理想值,随机瞎猜的模型AP约等于正样本占比。
这里顺便提一个考试高频坑:PR曲线和ROC曲线相比,前者对样本不平衡更敏感,也更适合当正负样本极不均衡时的评估指标。这一点咱们后面专门展开讲,先记住结论就行。
2.3 PR曲线的适用场景:正负样本极度不平衡时的救命稻草
什么时候优先看PR曲线?一句话:当你更关心"正类样本"(少数类)能不能被准确找出来的时候。
拿垃圾邮件识别举例,真实场景中垃圾邮件可能只占全部邮件的1%不到。如果你用准确率来评判,全判为正常邮件都有99%的准确率,毫无意义。但如果你看PR曲线,因为正样本极少,模型但凡多标几个垃圾邮件,查准率就会明显下滑,曲线会非常敏感地反映模型在"区分少数正类"上的真实水平。
医疗领域的罕见病筛查、故障检测中的异常样本识别、金融领域的欺诈交易检测,全部是类似的场景。在这些场景下,我个人的习惯是主要看PR曲线和AP值,ROC曲线作为辅助参考。因为ROC曲线有一个特性我们马上就会提到——它在样本不平衡时表现得"过于乐观",容易让人觉得模型还不错,但实际上对少数类的捕捉能力可能很弱。
3. ROC曲线:真正例率与假正例率的对决
3.1 真正例率、假正例率:绕开查准率卷的另一组指标
ROC曲线,全称是Receiver Operating Characteristic Curve,中文常翻译为"受试者工作特征曲线"。这个名字听起来很神秘,其实它最初来源于二战时期的雷达信号检测,后来被引入心理学、医学,再到机器学习领域,成了最经典的二分类模型评估工具之一。
ROC曲线的横轴是假正例率(FPR,False Positive Rate),纵轴是真正例率(TPR,True Positive Rate)。这两个指标的定义如下:
- 真正例率(TPR)= TP ÷(TP + FN),也就是真实正类中被正确找出来的比例。等等,这看起来不是和查全率(Recall)一模一样吗?确实,TPR在数值上就等于Recall。
- 假正例率(FPR)= FP ÷(FP + TN),也就是真实负类中被误判为正类的比例。
你可以这么理解ROC曲线的思想:我们不再关心"预测为正类的那些里有多少是对的",而是换了一个角度——"在把所有真实正类捞出来的过程中,到底误伤了多少真实负类"。这个视角对类别不平衡没那么敏感,因为它本身是在用比率做比较。
3.2 从阈值移动到整条曲线:ROC的绘制与AUC
ROC曲线的绘制方式和PR曲线完全一致,也是把所有测试样本按模型输出分数从高到低排序,然后从阈值=1开始(即一个都不预测为正类),逐渐把阈值降低,每次把分数高于阈值的新样本判为正类,计算这一时刻的(FPR, TPR),把所有点连起来就得到了ROC曲线。
这个过程中有几个关键点位值得记一下:
- 当阈值=1时,没有任何样本被判为正类,TP=0、FP=0,所以TPR=0、FPR=0,曲线从(0,0)出发;
- 当阈值=0时,所有样本都被判为正类,FP=所有负类样本数、TP=所有正类样本数,所以TPR=1、FPR=1,曲线结束于(1,1);
- 对角线y=x代表随机瞎猜的模型:真正例率和假正例率永远相等,不管阈值怎么扫,捞到正类的比例和误伤负类的比例始终一样多。
ROC曲线下方的面积,就是AUC(Area Under the ROC Curve),它衡量的是"随机挑一个正样本和一个负样本,模型给正样本打的分比给负样本打的分高的概率"。这句话值得反复读几遍,因为它是AUC最本质的概率解释。AUC=0.5意味着模型和抛硬币没有区别;AUC=0.8意味着在正负样本随机配对的情况下,模型有80%的概率把正样本排在负样本前面。这是面试和期末考试的绝对高频考点。
3.3 ROC曲线的特点:对类别分布不敏感、横纵轴含义
ROC曲线有一个非常出色的性质:对测试集中的正负样本比例不敏感。这个性质不是玄学,而是一项统计学特性导致的——TPR和FPR在计算时,分别只用到了正样本内部的统计(TP和FN)和负样本内部的统计(FP和TN),两类样本之间不会互相干扰。所以你把测试集里正样本数量翻一倍,TPR和FPR的期望值基本不会变,ROC曲线基本稳定。
这个特性在实际工作里非常香。当训练集和测试集的正负比例发生变化时,ROC曲线和AUC依然能给你一个相对稳定的模型能力评估;PR曲线则不同,它的两个轴(Precision和Recall)都跟正样本占比直接相关,正负比例一变,曲线和AP值立刻大变样。但这并不意味着PR曲线不好,恰恰相反,正是因为它对分布敏感,才能暴露出那些"在样本极端不平衡下原形毕露"的模型。两条曲线是互补的关系,不是替代关系。
这里额外说一个做题时的常见误区:ROC曲线的面积AUC和"所有样本里预测对的比率"没有任何直接关系,AUC反映的是排序能力。比如一个模型把所有正样本打分都排在负样本前面,AUC就是1.0,但如果你强行用0.5的阈值去切,可能得到的准确率并不高。这两个评价维度完全不同,不要混为一谈。
4. PR曲线和ROC曲线,到底该选哪个
4.1 核心差异一张表看懂
很多初学者最大的困惑就是:这两条曲线看起来长得也差不多,都是衡量分类模型的能力,到底什么时候用哪个?我先用一张表给大家理清楚主要差异,再展开说背后的逻辑。
| 对比维度 | PR曲线 | ROC曲线 |
|---|---|---|
| 横轴 | 查全率(Recall / TPR) | 假正例率(FPR) |
| 纵轴 | 查准率(Precision) | 真正例率(TPR / Recall) |
| 对类别不平衡的敏感度 | 非常敏感 | 不敏感 |
| AUC的面积含义 | AP值,约等于PR曲线下面积 | 随机正样本排在随机负样本前面的概率 |
| 随机基线 | 约为正样本占比 | 对角线(0.5) |
| 适用场景 | 正负样本不平衡,关注少数类 | 类别相对均衡,需要全局排序能力评估 |
这张表的核心信息是:ROC曲线更像一个"端水大师",它综合评估模型在各类别上的排序能力,且不随样本分布剧烈波动;PR曲线则是一个"显微镜",专门盯着少数类看,只要你在少数类上表现不好,它立刻给你脸色。
4.2 为什么样本不平衡时ROC可能“骗人”而PR更真实
这是一个非常关键、也非常容易在面试中翻车的话题。假设你做一个欺诈检测任务,10000个样本里只有50个是真正欺诈,其余9950个都是正常样本。你训练了一个"尽量把所有样本都判为正常"的保守模型。
这个模型在ROC曲线上表现如何?ROC的纵轴是TPR,因为50个欺诈样本一个都没找出来,所以TPR=0;横轴是FPR,因为正常样本全被正确判为正常,误伤的很少,FPR也接近0。于是曲线几乎贴着左上角走,AUC可能依然很高,甚至能达到0.9以上。听起来很唬人是吧?但如果这时候你去看PR曲线,发现查全率同样是0,查准率也是0,AP值直接归零,模型的真实水平一目了然——它根本一个欺诈样本都没抓出来,纯粹是个摆设。
为什么会有这个反差?因为ROC计算FPR时,分母是全部负样本(9950个),少量误报在这么大的分母下被稀释了,曲线看起来依旧"优美";而PR曲线的两个轴都直接作用和"预测为正的那一撮样本"以及"真实正类的50个样本"上,任何一点失误都会被放大。所以在类别极度不平衡的业务场景里,PR曲线和AP值才是更能反映模型业务价值的评估方式。这也是我求求各位一句:别只盯着AUC好看就觉得自己模型牛,看看PR曲线再说。
4.3 两者在模型调参中的配合:先看ROC粗筛、再看PR细选
在实际项目里,我的习惯是把两条曲线配合起来用,而不是非此即彼。具体操作分三步走。
第一步,模型快速筛选阶段,数据集类别相对均衡或者没有明显的少数类倾向时,直接看ROC和AUC,因为AUC是标量、好对比,适合在几个候选模型之间快速拉开差距。第二步,进入优化阶段之后,把业务具体场景考虑进来,如果正负样本比例已经不均衡了,或者少数类才是业务核心,马上切换视角看PR曲线和AP值,同时结合业务上能接受的最大误报率来调阈值。第三步,确定阈值时不要用默认的0.5,而是根据PR曲线上的(Precision, Recall)组合,或者ROC曲线上离左上角最近的点,去选出实际业务最满意的操作点。
这个方法说白了就是:宏观上用AUC判断"模型底子怎么样",微观上用PR判断"模型对目标少数类的真正战斗力",阈值用需求反推。这几步走完,一个二分类模型的评估闭环才算真正闭合了。
5. 实操:用Python从零绘制PR曲线和ROC曲线
5.1 准备数据与模型:随便造一个二分类,但要让代码能直接用
理论说得再多,不跑一遍代码全是空中楼阁。下面我用Python带大家完整走一遍绘制PR曲线和ROC曲线的流程。
先说明一下使用的环境:Python 3.9以上,scikit-learn版本1.2以上,matplotlib画图,numpy处理数据。没有装的同学用pip安装一下就行,非常快。这里我就不用某个具体业务数据了,直接调用sklearn的make_classification函数人工生成一份样本,因为这样任何人都能复制代码直接跑出来,而且我们可以精确控制正负样本比例,方便演示两条曲线的差异。
生成数据的代码如下:
from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import (precision_recall_curve, roc_curve, auc, average_precision_score) import numpy as np import matplotlib.pyplot as plt # 生成2000个样本,其中正类比例约10%,用来模拟不平衡场景 X, y = make_classification( n_samples=2000, n_features=20, n_informative=10, n_redundant=5, n_clusters_per_class=1, weights=[0.9, 0.1], # 90%负类,10%正类 random_state=42 ) X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=42, stratify=y ) model = LogisticRegression(max_iter=1000) model.fit(X_train, y_train) y_score = model.predict_proba(X_test)[:, 1] # 取正类概率作为分数这里我用weights=[0.9, 0.1]硬生生制造了一个不平衡数据,目的就是为了后面演示PR曲线和ROC曲线在不平衡样本下的表现差异。这组数据的正样本占比只有10%,如果你用一个"永远预测负类"的模型,准确率能到90%,但屁用没有——后面画出的曲线会把这个残酷现实暴露无遗。
5.2 计算混淆矩阵与各指标:把四个基础量搞到手
在实际绘制曲线之前,先选一个固定阈值算出混淆矩阵和各基础指标,满足一下直觉。默认阈值0.5的情况下,代码如下:
from sklearn.metrics import confusion_matrix, classification_report y_pred = (y_score >= 0.5).astype(int) tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel() print(f"TP={tp}, FP={fp}, FN={fn}, TN={tn}") print(f"Precision = {tp / (tp + fp):.3f}") print(f"Recall = {tp / (tp + fn):.3f}") print(f"TPR = {tp / (tp + fn):.3f}") print(f"FPR = {fp / (fp + tn):.3f}") print(classification_report(y_test, y_pred))从这份输出里我们就能直观看到各指标的数值关系:TPR和Recall本来就完全相等,Precision反映的是"预测为正类里有多少是对的",FPR反映的是"负类被误伤的比例"。这几个具体数值会为接下来理解曲线上的每个点做好铺垫。
5.3 从零绘制PR曲线并计算AP值
实际操作中,我们不需要自己写阈值扫描逻辑,sklearn的precision_recall_curve函数已经帮你做完了全部事情。你只需要把真实标签和模型预测分数传进去就行。
precision, recall, thresholds = precision_recall_curve(y_test, y_score) ap_score = average_precision_score(y_test, y_score) print(f"AP = {ap_score:.3f}") plt.figure(figsize=(7, 6)) plt.plot(recall, precision, color='darkorange', lw=2, label=f'PR curve (AP = {ap_score:.3f})') plt.xlabel('Recall') plt.ylabel('Precision') plt.title('Precision-Recall Curve') plt.legend(loc='upper right') plt.grid(True) plt.show()这里我要展开解释一下precision_recall_curve返回的三个值的含义。第一个precision和第二个recall是浮点数组,一一对应组成PR曲线上的坐标点;第三个thresholds则记录着每个坐标点对应的阈值。注意这个函数返回的precision和recall长度会比thresholds多1,因为最后一个点对应的阈值是"全部判为正类"的情况,此时没有明确的单一阈值,曲线坐标里多出一个终结点(此时precision等于正样本占比、recall=1.0)。如果你面试时候能把这一句话讲清楚,面试官基本就会认定你真的调过包,而不是背过八股文。
至于AP值,average_precision_score的实现方式是:对每个recall阈值点,取"该点及之后的最大precision"作为插值后的precision,然后对所有阈值变化区间的precision取加权平均,权重是recall的增量。这也是为什么它可以直接无量纲地表示PR曲线的整体水平。
5.4 从零绘制ROC曲线并计算AUC
ROC曲线的绘制思路和PR曲线几乎一模一样,只是换了一个评估函数,把纵轴换成TPR、横轴换成FPR。
fpr, tpr, thresholds = roc_curve(y_test, y_score) roc_auc = auc(fpr, tpr) print(f"AUC = {roc_auc:.3f}") plt.figure(figsize=(7, 6)) plt.plot(fpr, tpr, color='blue', lw=2, label=f'ROC curve (AUC = {roc_auc:.3f})') plt.plot([0, 1], [0, 1], color='gray', linestyle='--', label='Random Classifier') plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic Curve') plt.legend(loc='lower right') plt.grid(True) plt.show()打印出来的AUC通常在0.9左右甚至更高,看起来非常好看。但配合上刚才那份10%正样本占比的数据,你会发现ROC曲线给出的"乐观"判断和PR曲线用AP=0.7左右数值给出的"没你想的那么好"之间,存在一个明显的落差。这恰好呼应了前面第4节的核心观点——类别不平衡时,ROC容易给出偏乐观的评价,PR曲线才更接地气。
有个细节顺带提一下:roc_curve返回的thresholds长度和fpr、tpr是相等的,而PR曲线的precision、recall长度比thresholds多1,这俩函数的返回值长度习惯不一样,很多新手在这里被坑过,写代码取索引的时候一不小心就数组越界。建议大家在拿到返回值之后先print(len(...))看一眼,心里有个底。
6. 期末复习与面试高频:那些要命的坑和底层逻辑
6.1 高频概念辨析题:别再混淆的三个陷阱
本部分内容来自我平时帮学弟学妹辅导、以及在技术社区回答问题时发现的高频误区,如果你正在准备期末考试或者面试,下面这些点建议逐条核对一下。
第一,TPR、Recall到底是不是一回事?是,但在ROC曲线的语境下我们习惯叫TPR,在PR曲线的语境下习惯叫Recall,数值定义完全一致。考试时如果在一道题里同时看到这两个名字,要立刻反应过来它们是一个东西。
第二,AUC=0.5到底意味着什么?有两种等价理解:一是模型是随机猜测的;二是随机抽一个正样本和一个负样本,模型给正样本打高分、负样本打低分的概率是50%。但注意,这并不意味着模型"一定全错",更不意味着准确率是50%,不少初学者在这里栽跟头。
第三,PR曲线的随机基线为什么不是0.5?很多教材不会特意提这事,因为PR曲线的随机基线是正样本占比p(比如正样本占10%,随机线的高度就是0.1),而ROC曲线的随机基线永远是0.5这条对角线。这个区别理解透了,你在解释"为什么同一模型在不平衡数据上PR曲线看起来比ROC曲线低那么多"的时候,就能抓住本质了。
6.2 高频计算题套路:混淆矩阵倒推一切指标
期末和面试里最常见的一类计算题,就是给你一个混淆矩阵,让你求准确率、查准率、查全率、F1、TPR、FPR,甚至让你手绘ROC曲线上的一个点。这类题没有任何技术含量,唯一的难点就是别把公式记混。我的建议是记混淆矩阵的时候,别死记字母,死记"行是预测、列是真实"这种表格结构,然后每次现场推导一遍。
举一个标准例子,假设测试集100个样本,混淆矩阵如下:TP=40、FP=10、FN=20、TN=30。那么查准率=40/(40+10)=0.8,查全率=40/(40+20)≈0.667,F1=2×0.8×0.667/(0.8+0.667)≈0.727,FPR=10/(10+30)=0.25,TPR=0.667。如果把(0.25, 0.667)画到ROC平面里,就是这个模型在特定阈值下的操作点。一次题做下来,你就把PR曲线和ROC曲线的基础坐标全部打通了。
6.3 实际工作中的踩坑记录:比书本更痛的教训
最后聊几个我在实际项目里掉过坑的经历,希望你能绕开。
第一个坑:只看AUC选模型,上线后效果稀烂。我在一个金融客户项目里,两个候选模型的AUC分别是0.93和0.92,前者略微胜出,我就选了前者。结果A/B测试阶段,前者在真实业务上的转化率反而明显低于后者。后来复盘发现,真实业务的正负样本比例跟测试集差了一个数量级,而前者的高AUC主要靠"能把一堆负样本排到最后"撑起来,跟业务真正关心的少数类没关系。从那以后,我再也不单凭一个AUC做决策了。
第二个坑:只画了PR曲线,忘记看具体操作点对应的阈值。PR曲线和ROC曲线本质上都是"阈值扫描全景图",曲线好看不代表当前默认阈值下的业务指标好看。后来我养成了一个习惯:画完曲线之后,直接打印出几个关键阈值对应的Precision和Recall,结合业务上对误报和漏报的容忍度,手动选出真正能用的阈值。默认0.5在绝大多数实际场景里都是一个糟糕的选择,需要自己去抠。
第三个坑:在数据集上做分类时,忘了先检查正负样本分布的稳定性。我见过一个团队用ROC做日常模型监控,某天AUC突然暴跌,排查了几天,最后发现是新接入的数据流里正样本比例发生了漂移。虽然ROC对测试集正负比例不敏感,但业务上样本分布变化本身就是一个值得关注的大事件,别被评估指标的"稳定性"蒙蔽了。样本分布变化本身就是信号,曲线稳定只是说明模型排序能力没崩,不代表业务没问题。
做评估从来不是算几个数那么简单,你要把指标当成一副透视镜,透过它看清模型在真实场景里到底行不行。PR曲线和ROC曲线这两条曲线,一个让我们紧盯少数类的死活,一个让我们站高一点看全局排序,配合使用就是一套完整的模型体检套餐。
最后再分享一个小技巧,如果你画完这两条曲线之后,还想快速判断一个模型有没有改进空间,先看看ROC曲线左上角那一带的曲线是否够"鼓",再看看PR曲线在Recall从0.8到1.0这一段是不是断崖式下跌。如果PR曲线在高Recall段突然垂直坠落,说明模型虽然能找到绝大多数正样本,但代价是误报率爆炸——这时候你就要考虑是否该换模型、引入更多特征,或者在业务侧加人工兜底了。这两个小细节,是我在无数次模型调优中用血泪换来的经验,今天一并交给你们了。