分类模型的性能评估——以SAS Logistic回归为例: 混淆矩阵

2018-03-13 11:18:49 浏览数 (1)

跑完分类模型(Logistic回归、决策树、神经网络等),我们经常面对一大堆模型评估的报表和指标,如Confusion Matrix、ROC、Lift、Gini、K-S之类(这个单子可以列很长),往往让很多在业务中需要解释它们的朋友头大:“这个模型的Lift是4,表明模型运作良好。——啊,怎么还要解释ROC,ROC如何如何,表明模型表现良好……”如果不明白这些评估指标的背后的直觉,就很可能陷入这样的机械解释中,不敢多说一句,就怕哪里说错。本文就试图用一个统一的例子(SAS Logistic回归),从实际应用而不是理论研究的角度,对以上提到的各个评估指标逐一点评,并力图表明:

  1. 这些评估指标,都是可以用白话(plain English, 普通话)解释清楚的;
  2. 它们是可以手算出来的,看到各种软件包输出结果,并不是一个无法探究的“黑箱”;
  3. 它们是相关的。你了解一个,就很容易了解另外一个。

本文从混淆矩阵(Confusion Matrix,或分类矩阵,Classification Matrix)开始,它最简单,而且是大多数指标的基础。

数据

本文使用一个在信用评分领域非常有名的免费数据集,German Credit Dataset,你可以在UCI Machine Learning Repository找到。另外,你还可以在SAS系统的Enterprise Miner的演示数据集中找到该数据的一个版本(dmagecr.sas7bdat)。以下把这个数据分为两部分,训练数据train和验证数据valid,所有的评估指标都是在valid数据中计算(纯粹为了演示评估指标,在train数据里计算也未尝不可),我们感兴趣的二分变量是good_bad,取值为{good, bad}:

代码语言:javascript复制
Train data
good_bad    Frequency     Percent
-------------------------------------------
bad               154              25.67
good             446              74.33

Valid data
good_bad    Frequency     Percent
--------------------------------------------
bad               146              36.50
good             254              63.50

信用评分指帮助贷款机构发放消费信贷的一整套决策模型及其支持技术。一般地,信用评分技术将客户分为好客户与坏客户两类,比如说,好客户(good)能够按期还本付息(履约),违约的就是坏客户(bad)。具体做法是根据历史上每个类别(履约、违约)的若干样本,从已知的数据中考察借款人的哪些特征对其拖欠或违约行为有影响,从而测量借款人的违约风险,为信贷决策提供依据。Logistic回归是信用评分领域运用最成熟最广泛的统计技术。

约定

在我们的示例数据中,要考察的二分变量是good_bad,我们把感兴趣的那个取值bad(我们想计算违约的概率),称作正例(Positive, 1),另外那个取值(good)称作负例(Negative, 0)。在SAS的Logistic回归中,默认按二分类取值的升序排列取第一个为positive,所以默认的就是求bad的概率。(若需要求good的概率,需要特别指定)。

模型

如果没有特别说明,以下所有的SAS代码都在SAS 9.1.3 SP4系统中调试并运行成功(在生成ROC曲线时,我还会提到SAS9.2的新功能)。

代码语言:javascript复制
proc logistic data=train;

model good_bad=checking history duration savings property;run;

这个数据很整齐,能做出很漂亮的模型,以下就直接贴出参数估计的结果:

代码语言:javascript复制
Analysis of Maximum Likelihood Estimates

Standard     Wald
Parameter    DF    Estimate       Error     Chi-Square    Pr > ChiSq

Intercept     1      0.6032      0.4466        1.8242        0.1768
checking      1     -0.6536      0.0931       49.3333        <.0001
history         1     -0.4083      0.0980       17.3597        <.0001
duration      1      0.0248     0.00907        7.4820        0.0062
savings        1     -0.2017      0.0745        7.3308        0.0068
property      1      0.3157      0.1052        9.0163        0.0027

回归方程就是:

代码语言:javascript复制
logit[p(bad)]=log(p/1-p)
             =0.6032-0.6536*checking-0.4083*history 0.0248*duration
              -0.2017*savings 0.3157*property

用下面的公式就可以求出正例的概率(bad的概率):

代码语言:javascript复制
p=exp(logit)/(exp(logit) 1)

上式求出的是概率值,如何根据概率值把各个客户归类,还需要一个阈值,比如,这里我们简单地规定,违约概率超过0.5的就归为bad,其余为good。把上述公式代入valid数据中,

代码语言:javascript复制
data valid_p;

set valid;

logit=0.6032-0.6536*checking-0.4083*history 0.0248*duration-0.2017*savings 0.3157*property;

p=exp(logit)/(exp(logit) 1);

if p<0.5 then good_bad_predicted='good';

else good_bad_predicted='bad';

keep good_bad p good_bad_predicted;run;

从下面的局部的数据valid_p可以看到,一些实际上是good的客户,根据我们的模型(阈值p取0.5),却预测他为bad(套用我们假设检验的黑话,这就犯了“弃真”的错误),对一些原本是bad的客户,却预测他为good(“取伪”错误),当然,对更多的客户,good还预测成good,bad还预测成bad:

代码语言:javascript复制
good_bad       p       good_bad_predicted
bad       0.61624       badbad       0.03607       goodgood      0.12437      good
good      0.21680      good
good      0.34833      goodgood      0.69602      badbad       0.68873       bad
good      0.48351      good
good      0.03288      good
good      0.06789      good
good      0.61195      bad
good      0.15306      good

Confusion Matrix, 混淆矩阵

一个完美的分类模型就是,如果一个客户实际上(Actual)属于类别good,也预测成(Predicted)good,处于类别bad,也就预测成bad。但从上面我们看到,一些实际上是good的客户,根据我们的模型,却预测他为bad,对一些原本是bad的客户,却预测他为good。我们需要知道,这个模型到底预测对了多少,预测错了多少,混淆矩阵就把所有这些信息,都归到一个表里:

代码语言:javascript复制
		预测
		1	0
实	1	d, True Positive	c, False Negative	c d, Actual Positive
际	0	b, False Positive	a, True Negative	a b, Actual Negative
		b d, Predicted Positive	a c, Predicted Negative

其中,

  1. a是正确预测到的负例的数量, True Negative(TN,0->0)
  2. b是把负例预测成正例的数量, False Positive(FP, 0->1)
  3. c是把正例预测成负例的数量, False Negative(FN, 1->0)
  4. d是正确预测到的正例的数量, True Positive(TP, 1->1)
  5. a b是实际上负例的数量,Actual Negative
  6. c d是实际上正例的个数,Actual Positive
  7. a c是预测的负例个数,Predicted Negative
  8. b d是预测的正例个数,Predicted Positive

以上似乎一下子引入了许多概念,其实不必像咋一看那么复杂,有必要过一下这里的概念。实际的数据中,客户有两种可能{good, bad},模型预测同样这两种可能,可能匹配可能不匹配。匹配的好说,0->0(读作,实际是Negative,预测成Negative),或者 1->1(读作,实际是Positive,预测成Positive),这就是True Negative(其中Negative是指预测成Negative)和True Positive(其中Positive是指预测成Positive)的情况。

同样,犯错也有两种情况。实际是Positive,预测成Negative (1->0) ,这就是False Negative;实际是Negative,预测成Positive (0->1) ,这就是False Positive;

我们可以通过SAS的proc freq得到以上数字:

代码语言:javascript复制
proc freq data=valid_p;
tables good_bad*good_bad_predicted/nopercent nocol norow;
run;

对照上表,结果如下:

代码语言:javascript复制
	预测
		1	0
实	1,bad	d, True Positive,48	c, False Negative,98	c d, Actual Positive,146
际	0,good	b, False Positive,25	a, True Negative,229	a b, Actual Negative,254
		b d, Predicted Positive,73	a c, Predicted Negative,327	400

根据上表,以下就有几组常用的评估指标(每个指标分中英文两行):

1. 准确(分类)率VS.误分类率

准确(分类)率=正确预测的正反例数/总数

Accuracy=true positive and true negative/total cases= a d/a b c d=(48 229)/(48 98 25 229)=69.25%

误分类率=错误预测的正反例数/总数

Error rate=false positive and false negative/total cases=b c/a b c d=1-Accuracy=30.75%

2. (正例的)覆盖率VS. (正例的)命中率

覆盖率=正确预测到的正例数/实际正例总数,

Recall(True Positive Rate,or Sensitivity)=true positive/total actual positive=d/c d=48/(48 98)=32.88%

/*注:覆盖率(Recall)这个词比较直观,在数据挖掘领域常用。因为感兴趣的是正例(positive),比如在信用卡欺诈建模中,我们感兴趣的是有高欺诈倾向的客户,那么我们最高兴看到的就是,用模型正确预测出来的欺诈客户(True Positive)cover到了大多数的实际上的欺诈客户,覆盖率,自然就是一个非常重要的指标。这个覆盖率又称Sensitivity, 这是生物统计学里的标准词汇,SAS系统也接受了(谁有直观解释?)。 以后提到这个概念,就表示为, Sensitivity(覆盖率,True Positive Rate)。 */

命中率=正确预测到的正例数/预测正例总数

Precision(Positive Predicted Value,PV )=true positive/ total predicted positive=d/b d=48/(48 25)=65.75%

/*注:这是一个跟覆盖率相对应的指标。对所有的客户,你的模型预测,有b d个正例,其实只有其中的d个才击中了目标(命中率)。在数据库营销里,你预测到b d个客户是正例,就给他们邮寄传单发邮件,但只有其中d个会给你反馈(这d个客户才是真正会响应的正例),这样,命中率就是一个非常有价值的指标。 以后提到这个概念,就表示为PV (命中率,Positive Predicted Value)*。/

3.Specificity VS. PV-

负例的覆盖率=正确预测到的负例个数/实际负例总数

Specificity(True Negative Rate)=true negative/total actual negative=a/a b=229/(25 229)=90.16%

/*注:Specificity跟Sensitivity(覆盖率,True Positive Rate)类似,或者可以称为“负例的覆盖率”,也是生物统计用语。以后提到这个概念,就表示为Specificity(负例的覆盖率,True Negative Rate) 。*/

负例的命中率=正确预测到的负例个数/预测负例总数

Negative predicted value(PV-)=true negative/total predicted negative=a/a c=229/(98 229)=70.03%

/*注:PV-跟PV (命中率,Positive Predicted value)类似,或者可以称为“负例的命中率”。 以后提到这个概念,就表示为PV-(负例的命中率,Negative Predicted Value)。*/

以上6个指标,可以方便地由上面的提到的proc freq得到:

代码语言:javascript复制
proc freq data=valid_p;

tables good_bad*good_bad_predicted ;run;

其中,准确率=12.00% 57.25%=69.25% ,覆盖率=32.88% ,命中率=65.75% ,Specificity=90.16%,PV-=70.03% 。

或者,我们可以通过SAS logistic回归的打分程序(score)得到一系列的Sensitivity和Specificity,

代码语言:javascript复制
proc logistic data=train;

model good_bad=checking history duration savings property;

score data=valid outroc=valid_roc;run;

数据valid_roc中有几个我们感兴趣的变量:

  • _PROB_:阈值,比如以上我们选定的0.5
  • _SENSIT_:sensitivity(覆盖率,true positive rate)
  • _1MSPEC_ :1-Specificity,为什么提供1-Specificity而不是Specificity,下文有讲究。
代码语言:javascript复制
_PROB_ _SENSIT_ _1MSPEC_

0.54866 0.26712 0.07087

0.54390 0.27397 0.07874

0.53939 0.28767 0.08661

0.52937 0.30137 0.09055

0.51633 0.31507 0.094490.50583 0.32877 0.098430.48368 0.36301 0.10236

0.47445 0.36986 0.10630

如果阈值选定为0.50583,sensitivity(覆盖率,true positive rate)就为0.32877,Specificity就是1-0.098425=0.901575,与以上我们通过列联表计算出来的差不多(阈值0.5)。

以上我们用列联表求覆盖率等指标,需要指定一个阈值(threshold)。同样,我们在valid_roc数据中,看到针对不同的阈值,而产生的相应的覆盖率。我们还可以看到,随着阈值的减小(更多的客户就会被归为正例),sensitivity和1-Specificity也相应增加(也即Specificity相应减少)。把基于不同的阈值而产生的一系列sensitivity和Specificity描绘到直角坐标上,就能更清楚地看到它们的对应关系。由于sensitivity和Specificity的方向刚好相反,我们把sensitivity和1-Specificity描绘到同一个图中,它们的对应关系,就是传说中的ROC曲线,全称是receiver operating characteristic curve,中文叫“接受者操作特性曲线”。

ROC曲线就是不同的阈值下,以下两个变量的组合:

Sensitivity(覆盖率,True Positive Rate) 1-Specificity (Specificity, 负例的覆盖率,True Negative Rate)

二话不说,先把它画出来(以下脚本的主体是标红部分,数据集valid_roc:

axis order=(0 to 1 by .1) label=none length=4in; symbol i=join v=none c=black; symbol2 i=join v=none c=black; proc gplot data = valid_roc; plot _SENSIT_*_1MSPEC_ _1MSPEC_*_1MSPEC_ / overlay vaxis=axis haxis=axis; run; quit;

上图那条曲线就是ROC曲线,横轴是1-Specificity,纵轴是Sensitivity。以前提到过,随着阈值的减小(更多的客户就会被归为正例),Sensitivity和1-Specificity也相应增加(也即Specificity相应减少),所以ROC呈递增态势(至于ROC曲线凹向原点而非凸向原点,不知道有无直观的解释,不提)。那条45度线是作为参照(baseline model)出现的,就是说,ROC的好坏,乃是跟45度线相比的,怎么讲?

回到以前,我们分析valid数据,知道有36.5%的bad客户(Actual Positive )和63.5%的good客户(Actual Negative)。这两个概率是根据以往的数据计算出来的,可以叫做“先验概率”( prior probability)。后来,我们用logistic回归模型,再给每个客户算了一个bad的概率,这个概率是用模型加以修正的概率,叫做“后验概率”(Posterior Probability)。

预测

1

0

1

d, True Positive

c, False Negative

c d, Actual Positive

0

b, False Positive

a, True Negative

a b, Actual Negative

b d, Predicted Positive

a c, Predicted Negative

如果不用模型,我们就根据原始数据的分布来指派,随机地把客户归为某个类别,那么,你得到的True Positive对False Positive之比,应该等于Actual Positive对Actual Negative之比(你做得跟样本分布一样好)——即,d/b=(c d)/(a b),可以有(d/c d)/(b/a b)=1,而这正好是Sensitivity/(1-Specificity)。在不使用模型的情况下,Sensitivity和1-Specificity之比恒等于1,这就是45度线的来历。一个模型要有所提升,首先就应该比这个baseline表现要好。ROC曲线就是来评估模型比baseline好坏的一个著名图例。这个可能不够直观,但可以想想线性回归的baseline model:

如果不用模型,对因变量的最好估计就是样本的均值(上图水平红线)。绿线是回归线(模型),回归线与水平线之间的偏离,称作Explained Variability, 就是由模型解释了的变动,这个变动(在方差分析里,又称作model sum of squares, SSM)越大,模型表现就越好了(决定系数R-square标准)。同样的类比,ROC曲线与45度线偏离越大,模型的效果就越好。最好好到什么程度呢?

在最好的情况下,Sensitivity为1(正确预测到的正例就刚好等于实际的正例总数),同时Specificity为1(正确预测到的负例个数就刚好等于实际的负例数),在上图中,就是左上方的点(0,1)。因此,ROC曲线越往左上方靠拢,Sensitivity和Specificity就越大,模型的预测效果就越好。同样的思路,你还可以解释为什么ROC曲线经过点(0,0)和(1.1),不提。

AUC, Area Under the ROC Curve

ROC曲线是根据与45度线的偏离来判断模型好坏。图示的好处是直观,不足就是不够精确。到底好在哪里,好了多少?这就要涉及另一个术语,AUC(Area Under the ROC Curve,ROC曲线下的面积),不过也不是新东西,只是ROC的一个派生而已。

回到先前那张ROC曲线图。45度线下的面积是0.5,ROC曲线与它偏离越大,ROC曲线就越向左上方靠拢,它下面的面积(AUC)也就应该越大。我们就可以根据AUC的值与0.5相比,来评估一个分类模型的预测效果。

SAS的Logistic回归能够后直接生成AUC值。跑完上面的模型,你可以在结果报告的Association Statistics找到一个叫c的指标,它就是AUC(本例中,c=AUC=0.803,45度线的c=0.5)。

/*注:以上提到的c不是AUC里面那个’C’。这个c是一个叫Wilcoxon-Mann-Whitney 检验的统计量。这个说来话长,不过这个c却等价于ROC曲线下的面积(AUC)。*/

ROC、AUC:SAS9.2一步到位

SAS9.2有个非常好的新功能,叫ODS Statistical Graphics,有兴趣可以去它主页看看。在SAS9.2平台提交以下代码,Logistic回归参数估计和ROC曲线、AUC值等结果就能一起出来(有了上面的铺垫,就不惧这个黑箱了):

ods graphics on; proc logistic data=train plots(only)=roc; model good_bad=checking history duration savings property; run; ods graphics off;

这个ROC图貌似还漂亮些,眼神好能看见标出来的AUC是0.8029。 最后提一句,ROC全称是Receiver Operating Characteristic Curve,中文叫“接受者操作特性曲线”,江湖黑话了(有朋友能不能出来解释一下,谁是Receiver,为什么Operating,何谓Characteristic——这个看着好像是Sensitivity和Specificity),不过并不妨碍我们使用ROC作为模型评估的工具。

跟ROC类似,Lift(提升)和Gain(增益)也一样能简单地从以前的Confusion Matrix以及Sensitivity、Specificity等信息中推导而来,也有跟一个baseline model的比较,然后也是很容易画出来,很容易解释。

  1. 一些准备

说,混淆矩阵(Confusion Matrix)是我们永远值得信赖的朋友:

预测

1

0

1

d, True Positive

c, False Negative

c d, Actual Positive

0

b, False Positive

a, True Negative

a b, Actual Negative

b d, Predicted Positive

a c, Predicted Negative

几个术语需要随时记起:

1. Sensitivity(覆盖率,True Positive Rate)=正确预测到的正例数/实际正例总数 Recall (True Positive Rate,or Sensitivity) =true positive/total actual positive=d/c d 2. PV (命中率,Precision, Positive Predicted Value) =正确预测到的正例数/预测正例总数 Precision (Positive Predicted Value, PV ) =true positive/ total predicted positive=d/b d 3. Specificity (负例的覆盖率,True Negative Rate) =正确预测到的负例个数/实际负例总数 Specificity (True Negative Rate) =true negative/total actual negative=a/a b

首先记我们valid数据中,正例的比例为pi1(念做pai 1),在我们的例子中,它等于c d/a b c d=0.365。单独提出pi1,是因为有时考虑oversampling后的一些小调整,比如正例的比例只有0.001,但我们把它调整为0.365(此时要在SAS proc logistic回归的score语句加一个priorevent=0.001选项)。本文不涉及oversampling。现在定义些新变量:

Ptp=proportion of true positives=d/a b c d=(c d/a b c d)*(d/c d) =pi1* Sensitivity,正确预测到的正例个数占总观测值的比例 Pfp=proportion of false positives=b/a b c d= (a b/a b c d)*(b/a b) = (1-c d/a b c d)*(1-a/a b) = (1-pi1)*(1- Specificity) ,把负例错误地预测成正例的个数占总数的比例 Depth=proportion allocated to class 1=b d/a b c d=Ptp Pfp,预测成正例的比例 PV_plus=Precision (Positive Predicted Value, PV ) = d/b d=Ptp/depth,正确预测到的正例数占预测正例总数的比例 Lift= (d/b d)/(c d/a b c d)=PV_plus/pi1,提升值,解释见下节。

以上都可以利用valid_roc数据计算出来:

%let pi1=0.365; data valid_lift; set valid_roc; cutoff=_PROB_; Ptp=&pi1*_SENSIT_; Pfp=(1-&pi1)*_1MSPEC_; depth=Ptp Pfp; PV_plus=Ptp/depth; lift=PV_plus/&pi1; keep cutoff _SENSIT_ _1MSPEC_ depth PV_plus lift; run;

先前我们说ROC curve是不同阈值下Sensitivity和1-Specificity的轨迹,类似,

Lift chart是不同阈值下Lift和Depth的轨迹 Gains chart是不同阈值下PV 和Depth的轨迹

Lift

Lift = (d/b d)/(c d/a b c d)=PV_plus/pi1),这个指标需要多说两句。它衡量的是,与不利用模型相比,模型的预测能力“变好”了多少。不利用模型,我们只能利用“正例的比例是c d/a b c d”这个样本信息来估计正例的比例(baseline model),而利用模型之后,我们不需要从整个样本中来挑选正例,只需要从我们预测为正例的那个样本的子集(b d)中挑选正例,这时预测的准确率为d/b d。

显然,lift(提升指数)越大,模型的运行效果越好。如果这个模型的预测能力跟baseline model一样,那么d/b d就等于c d/a b c d(lift等于1),这个模型就没有任何“提升”了(套一句金融市场的话,它的业绩没有跑过市场)。这个概念在数据库营销中非常有用,举个例子:

比如说你要向选定的1000人邮寄调查问卷(a b c d=1000)。以往的经验告诉你大概20%的人会把填好的问卷寄回给你,即1000人中有200人会对你的问卷作出回应(response,c d=200),用统计学的术语,我们说baseline response rate是20%(c d/a b c d=20%)。

如果你现在就漫天邮寄问卷,1000份你期望能收回200份,这可能达不到一次问卷调查所要求的回收率,比如说工作手册规定邮寄问卷回收率要在25%以上。

通过以前的问卷调查,你收集了关于问卷采访对象的相关资料,比如说年龄、教育程度之类。利用这些数据,你确定了哪类被访问者对问卷反应积极。假设你已经利用这些过去的数据建立了模型,这个模型把这1000人分了类,现在你可以从你的千人名单中挑选出反应最积极的100人来(b d=100),这10%的人的反应率 (response rate)为60%(d/b d=60%,d=60)。那么,对这100人的群体(我们称之为Top 10%),通过运用我们的模型,相对的提升(lift value)就为60%/20%=3;换句话说,与不运用模型而随机选择相比,运用模型而挑选,效果提升了3倍。

上面说lift chart是不同阈值下Lift和Depth的轨迹,先画出来:

symbol i=join v=none c=black; proc gplot data=valid_lift; plot lift*depth; run; quit;

上图的纵坐标是lift,意义已经很清楚。横坐标depth需要多提一句。以前说过,随着阈值的减小,更多的客户就会被归为正例,也就是depth(预测成正例的比例)变大。当阈值设得够大,只有一小部分观测值会归为正例,但这一小部分(一小撮)一定是最具有正例特征的观测值集合(用上面数据库营销的例子来说,这一部分人群对邮寄问卷反应最为活跃),所以在这个depth下,对应的lift值最大。

同样,当阈值设定得足够的小,那么几乎所有的观测值都会被归为正例(depth几乎为1)——这时分类的效果就跟baseline model差不多了,相对应的lift值就接近于1。

一个好的分类模型,就是要偏离baseline model足够远。在lift图中,表现就是,在depth为1之前,lift一直保持较高的(大于1的)数值,也即曲线足够的陡峭。

/*注:在一些应用中(比如信用评分),会根据分类模型的结果,把样本分成10个数目相同的子集,每一个子集称为一个decile,其中第一个decile拥有最多的正例特征,第二个decile次之,依次类推,以上lift和depth组合就可以改写成lift和decile的组合,也称作lift图,含义一样。刚才提到,“随着阈值的减小,更多的客户就会被归为正例,也就是depth(预测成正例的比例)变大。当阈值设得够大,只有一小部分观测值会归为正例,但这一小部分(第一个decile)一定是最具有正例特征的观测值集合。”*/

Gains

Gains (增益) 与 Lift (提升)相当类似:Lift chart是不同阈值下Lift和Depth的轨迹,Gains chart是不同阈值下PV 和Depth的轨迹,而PV =lift*pi1= d/b d(见上),所以它们显而易见的区别就在于纵轴刻度的不同:

symbol i=join v=none c=black; proc gplot data=valid_lift; plot pv_plus*depth; run; quit;

上图阈值的变化,含义与lift图一样。随着阈值的减小,更多的客户就会被归为正例,也就是depth(预测成正例的比例,b d/a b c d)变大(b d变大),这样PV (d/b d,正确预测到的正例数占预测正例总数的比例)就相应减小。当阈值设定得足够的小,那么几乎所有的观测值都会被归为正例(depth几乎为1),那么PV 就等于数据中正例的比例pi1了(这里是0.365。在Lift那一节里,我们说此时分类的效果就跟baseline model差不多,相对应的lift值就接近于1,而PV =lift*pi1。Lift的baseline model是纵轴上恒等于1的水平线,而Gains的baseline model是纵轴上恒等于pi1的水平线)。显然,跟lift 图类似,一个好的分类模型,在阈值变大时,相应的PV 就要变大,曲线足够陡峭。

/*注:我们一般看到的Gains Chart,图形是往上走的,咋一看跟上文相反,其实道理一致,只是坐标选择有差别,不提。*/

sas

0 人点赞