分类评价指标之ROC
什么是ROC曲线
ROC(Receiver operating Characteristic Curve),中文名叫受试者工作特征曲线。ROC的横坐标表示假阳性率FPR,纵坐标表示正阳性率TPR。它们的计算公式如下
$$\begin{cases}TPR = \frac{TP}{TP+FN}\\FPR=\frac{FP}{FP+TN}\end{cases}$$
举一个简单的例子,现在有10名疑似肺炎的患者,使用模型预测得出,7名为肺炎患者,其余为正常。而经过医院检测得到,预测为肺炎患者的7人中6人确认患病,其余四人正常。由此,可以得出
$$\begin{cases} TPR=\frac{6}{6}=1 \\ FPR=\frac{1}{1+3}=\frac{1}{4}\end{cases}$$
如何绘制ROC曲线
对于一个二分类问题,通常模型会预测正类别的概率,但这个概率高于指定的阈值时,被认为是正类。通过不断的调整这个阈值得到不同的(FPR, TPR),连接这些点所得到的曲线就是ROC曲线。
下面还是举一个简单的例子,下表是某个二分类模型所得到的预测(已经按照概率排好序)
样本序号 | 真实标签 | 预测概率 |
---|---|---|
1 | p | 0.9 |
2 | p | 0.8 |
3 | n | 0.7 |
4 | p | 0.6 |
5 | p | 0.55 |
6 | p | 0.54 |
7 | n | 0.53 |
8 | n | 0.52 |
9 | p | 0.51 |
10 | n | 0.505 |
11 | p | 0.4 |
12 | n | 0.39 |
13 | p | 0.38 |
14 | n | 0.37 |
15 | n | 0.36 |
16 | n | 0.35 |
17 | p | 0.34 |
18 | n | 0.33 |
19 | p | 0.30 |
20 | n | 0.1 |
首先从第一个点开始,即将阈值设定为无穷大,这时模型的所有预测均对应n,即TPR=0, FPR=0, 得到ROC曲线的第一个点(0, 0)。
将阈值降到0.9,这时模型预测出一个正类,其余全为负类,即$TPR=\frac{1}{10},FPR=0$,得到第二个点(0, 0.1)。
不断下调阈值,直到画出所有的关键点。
实现过程如下
- 将预测概率降序排序;
- 得到所有的切分点/阈值(对概率取唯一值);
- 依次得到每个切分点对应的TPR和FPR;
- 绘制ROC曲线;
其实还有一种更简单的方法来绘制ROC曲线,过程如下:
- 统计样本中正负样本的数目,正样本的数目为P,负样本的数目为N;
- 将坐标横轴划分为N份,每一份$\frac{1}{N}$,将坐标纵轴划分为P份,每一份$\frac{1}{P}$;
- 将预测概率降序排序;
- 遍历所有预测,遇到正样本,往纵轴方向移动一格,遇到负样本,往横轴方向移动一格;
- 最终曲线将结束在(1, 1)位置;
这里展示的是二分类下的ROC曲线绘制过程。多分类的过程类似,只不过多分类任务中,模型的输出是每个类别的概率,取具有最大概率的类别作为预测类别。
什么叫AUC
AUC指的是ROC曲线与坐标轴围成的面积。需要注意的是,AUC是处于$(0.5, 1]$范围的。这里可能大家都会觉得有些疑惑,明明ROC曲线可以在$y=x$下方呀。这是因为当AUC小于0.5时,我们可以用$1-AUC$,所以AUC始终在$(0.5, 1]$。
AUC越大,说明分类器可以把真正的正样本排在前面, 分类性能更好。
ROC曲线的特点
- ROC曲线对样本的类别不均衡更加鲁棒
这里也举一个例子。使用一个数据集,训练了2个模型。我们使用测试集来评估模型的性能,测试集中包含了100个正样本,2000个负样本。
模型A预测了100个正样本,90个正确。
模型A预测了500个正样本,90个正确。
模型 | 模型B | |
---|---|---|
TPR | 0.9 | 0.9 |
Recall | 0.9 | 0.9 |
FPR | 0.005 | 0.204 |
Precision | 0.9 | 0.18 |
我们可以看出,在数据集类别严重不均衡时,两个模型的FPR差异为0.199, 而Precision的差异高达0.72。
可以得到,这两个模型的PR曲线相差极大(Precision相差接近1), 而ROC曲线则较为接近。
之所以会导致如此大的差异,主要原因是,PR曲线只针对正样本,而ROC曲线同时关注正负样本(可以从计算公式看出)。至于应该选ROC还是PR则需要根据具体的任务来定,比如疾病的检测,我们更关注正样本,这个时候可以选择PR。而ROC曲线在推荐领域应用广泛。
Refernce
《百面机器学习》
机器学习面试之AUC三问
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。