凛冬将至

从简单的例子开始

0%

二分类评估指标

介绍ROC、KS、AUC等二分类评估指标

混淆矩阵

TP, FP, FN, TN

预测1 预测0 合计
真实1 True Positive (TP) False Negative (FN) Actual Positive(TP+FN)
真实0 False Positive (FP) True Negative(TN) Actual Negative(FP+TN)
合计 Predicted Positive(TP+FP) Predicted Negative(FN+TN) TP+FP+FN+TN
  • True Positive Rate(TPR),计算公式为TPR=TP/(TP+FN);所有真实的“1”中,有多少被模型成功选出
  • False Positive Rate(FPR),计算公式为FPR=FP/(FP+TN);所有真实的“0”中,有多少被模型误判为1了;
  • Precision=TP/(TP+FP),或2TP/((TP+FN)+(TP+FP))。所有判为1的用户,判对的比例
  • 好的模型:TPR尽量高而FPR尽量低

ROC

  • ROC(Receiver Operating Characteristic Curve):接受者操作特征曲线。

  • ROC曲线:设定不同的阀值,计算不同的点(FPR,TPR),连成曲线

  • ROC曲线确定阈值的方法:

    • 给出ROC曲线的拟合函数表达式,然后计算出最优的阀值,这个目前通过软件实现难度不大:如何给出最优拟合函数,计算数学上有很多方法;
    • 计算出ΔTPR≈ΔFPR的点即为最优的阀值;
    • 从业务上给出最优的阀值。

AUC

  • AUC:ROC曲线下方的面积Area Under the ROC Curve,简称为AUC。这是评价模型的另一个方法,AUC值越大,说明模型的分辨效果越好
  • gini系数:在SAS的评分模型输出中,常用来判断收入分配公平程度,此时gini=2*AUC-1

XGB中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
double sum_pospair = 0.0;
double sum_npos = 0.0, sum_nneg = 0.0, buf_pos = 0.0, buf_neg = 0.0;
for (size_t j = 0; j < rec.size(); ++j) {
const float wt = info.GetWeight(rec[j].second);
const float ctr = info.labels[rec[j].second];
// keep bucketing predictions in same bucket
if (j != 0 && rec[j].first != rec[j - 1].first) { // 遍历所有的预测值
sum_pospair += buf_neg * (sum_npos + buf_pos *0.5); // 逐个梯形计算
sum_npos += buf_pos;
sum_nneg += buf_neg;
buf_neg = buf_pos = 0.0f;
}
buf_pos += ctr * wt; // 累计加权TP
buf_neg += (1.0f - ctr) * wt; // 累计加权FP
}
sum_pospair += buf_neg * (sum_npos + buf_pos *0.5);
sum_npos += buf_pos;
sum_nneg += buf_neg;
// check weird conditions
utils::Check(sum_npos > 0.0 && sum_nneg > 0.0,
"AUC: the dataset only contains pos or neg samples");
// this is the AUC
sum_auc += sum_pospair / (sum_npos*sum_nneg);// 计算AUC

R语言中的计算方法

1
2
3
4
5
6
7
8
9
function (y_pred, y_true) 
{
rank <- rank(y_pred) # rank[i] 为 y_pred[i]从小到大的排序号,最小为1,两个数并列第5,则都为5.5
n_pos <- sum(y_true == 1)
n_neg <- sum(y_true == 0)
AUC <- (sum(rank[y_true == 1]) - n_pos * (n_pos + 1)/2)/(n_pos *
n_neg)
return(AUC)
}

简化计算公式

原因:

KS

  • K-S曲线:它和ROC曲线的画法异曲同工。以Logistic模型为例,首先把Logistic模型输出的概率从大到小排序,然后取10%的值(也就是概率值)作为阀值,同理把10%*k(k=1,2,3,…,9)处的值作为阀值,计算出不同的FPR和TPR值,以10%*k(k=1,2,3,…,9)为横坐标,分别以TPR和FPR的值为纵坐标,就可以画出两个曲线,这就是K-S曲线。

  • KS值:KS=max(TPR-FPR),即是两条曲线之间的最大间隔距离。当(TPR-FPR)最大时,也就是ΔTPR-ΔFPR=0,这和ROC曲线上找最优阀值的条件ΔTPR=ΔFPR是一样的。从这点也可以看出,ROC曲线、K-S曲线、KS值的本质是相同的。

  • K-S曲线能直观地找出模型中差异最大的一个分段,比如评分模型就比较适合用KS值进行评估;

  • KS值只能反映出哪个分段是区分度最大的,不能反映出所有分段的效果。

因此,在实际应用中,模型评价一般需要将ROC曲线、K-S曲线、KS值、AUC指标结合起来使用。