|
|
# 分类模型性能评估指标
|
|
|
|
|
|
|
|
|
##准确度的缺陷
|
|
|
|
|
|
准确度这个概念相信对于大家来说肯定并不陌生,就是正确率。例如模型的预测结果与数据真实结果如下表所示:
|
|
|
|
|
|
| 编号 | 预测结果 | 真实结果 |
|
|
|
| ------------ | ------------ | ------------ |
|
|
|
| 1 | 1 | 2 |
|
|
|
| 2 | 2 | 2 |
|
|
|
| 3 | 3 | 3 |
|
|
|
| 4 | 1 | 1 |
|
|
|
| 5 | 2 | 3 |
|
|
|
|
|
|
很明显,连小朋友都能算出来该模型的准确度为`3/5`。
|
|
|
|
|
|
那么准确对越高就能说明模型的分类性能越好吗?非也!举个例子,现在我开发了一套癌症检测系统,只要输入你的一些基本健康信息,就能预测出你现在是否患有癌症,并且分类的准确度为`0.999`。您认为这样的系统的预测性能好不好呢?
|
|
|
|
|
|
您可能会觉得,哇,这么高的准确度!这个系统肯定很牛逼!但是我们知道,一般年轻人患癌症的概率非常低,假设患癌症的概率为 0.001 ,那么其实我这个癌症检测系统只要一直输出您没有患癌症,准确度也可能能够达到`0.999`。
|
|
|
|
|
|
假如现在有一个人本身已经患有癌症,但是他自己不知道自己患有癌症。这个时候用我的癌症检测系统检测发现他没有得癌症,那很显然我这个系统已经把他给坑了(耽误了治疗)。
|
|
|
|
|
|
看到这里您应该已经体会到了,一个分类模型如果光看准确度是不够的,尤其是对这种样本**极度不平衡**的情况(`10000`条健康信息数据中,只有`1`条的类别是患有癌症,其他的类别都是健康)。
|
|
|
|
|
|
|
|
|
##混淆矩阵
|
|
|
|
|
|
想进一步的考量分类模型的性能如何,可以使用其他的一些性能指标,例如精准率和召回率。但这些指标计算的基础是**混淆矩阵**。
|
|
|
|
|
|
继续以癌症检测系统为例,癌症检测系统的输出不是有癌症就是健康,这里为了方便,就用`1`表示患有癌症,`0`表示健康。假设现在拿`10000`条数据来进行测试,其中有`9978`条数据的真实类别是`0`,系统预测的类别也是`0` ,有`2`条数据的真实类别是`1`却预测成了`0`,有`12`条数据的真实类别是`0`但预测成了`1`,有`8`条数据的真实类别是`1` ,预测结果也是`1`。
|
|
|
|
|
|
如果我们把这些结果组成如下矩阵,则该矩阵就成为**混淆矩阵**。
|
|
|
|
|
|
| 真实\预测 | 0 | 1 |
|
|
|
| ------------ | ------------ | ------------ |
|
|
|
| 0 | 9978 | 12 |
|
|
|
| 1 | 2 | 8 |
|
|
|
|
|
|
混淆矩阵中每个格子所代表的的意义也很明显,意义如下:
|
|
|
|
|
|
| 真实\预测 | 0 | 1 |
|
|
|
| ------------ | ------------ | ------------ |
|
|
|
| 0 | 预测 0 正确的数量 | 预测 1 错误的数量 |
|
|
|
| 1 | 预测 0 错误的数量 | 预测 1 正确的数量 |
|
|
|
|
|
|
如果将正确看成是`True`,错误看成是`False`, `0`看成是 `Negtive`,`1`看成是`Positive`。然后将上表中的文字替换掉,混淆矩阵如下:
|
|
|
|
|
|
| 真实\预测 | 0 | 1 |
|
|
|
| ------------ | ------------ | ------------ |
|
|
|
| 0 | TN | FP |
|
|
|
| 1 | FN | TP |
|
|
|
|
|
|
因此`TN`表示真实类别是`Negtive`,预测结果也是`Negtive`的数量; `FP`表示真实类别是`Negtive`,预测结果是`Positive`的数量; `FN`表示真实类别是`Positive`,预测结果是`Negtive`的数量; `TP`表示真实类别是`Positive`,预测结果也是`Positive`的数量。
|
|
|
|
|
|
很明显,当`FN`和`FP`都等于`0`时,模型的性能应该是最好的,因为模型并没有在预测的时候犯错误。即如下混淆矩阵:
|
|
|
|
|
|
| 真实\预测 | 0 | 1 |
|
|
|
| ------------ | ------------ | ------------ |
|
|
|
| 0 | 9978 | 0 |
|
|
|
| 1 | 0 | 22 |
|
|
|
|
|
|
**所以模型分类性能越好,混淆矩阵中非对角线上的数值越小。**
|
|
|
|
|
|
## 精准率
|
|
|
|
|
|
**精准率(Precision)**指的是模型预测为`Positive`时的预测准确度,其计算公式如下:
|
|
|
|
|
|
<center>
|
|
|
$$
|
|
|
Precisioin=\frac{TP}{TP+FP}
|
|
|
$$
|
|
|
</center>
|
|
|
<br>
|
|
|
|
|
|
假如癌症检测系统的混淆矩阵如下:
|
|
|
|
|
|
| 真实\预测 | 0 | 1 |
|
|
|
| ------------ | ------------ | ------------ |
|
|
|
| 0 | 9978 | 12 |
|
|
|
| 1 | 2 | 8 |
|
|
|
|
|
|
则该系统的精准率为:`8/(8+12)=0.4`。
|
|
|
|
|
|
`0.4`这个值表示癌症检测系统的预测结果中如果有`100`个人被预测成患有癌症,那么其中有`40`人是真的患有癌症。**也就是说,精准率越高,那么癌症检测系统预测某人患有癌症的可信度就越高。**
|
|
|
|
|
|
|
|
|
##召回率
|
|
|
|
|
|
**召回率(Recall)**指的是我们关注的事件发生了,并且模型预测正确了的比值,其计算公式如下:
|
|
|
|
|
|
<center>
|
|
|
$$
|
|
|
Recall=\frac{TP}{FN+TP}
|
|
|
$$
|
|
|
</center>
|
|
|
<br>
|
|
|
|
|
|
假如癌症检测系统的混淆矩阵如下:
|
|
|
|
|
|
| 真实\预测 | 0 | 1 |
|
|
|
| ------------ | ------------ | ------------ |
|
|
|
| 0 | 9978 | 12 |
|
|
|
| 1 | 2 | 8 |
|
|
|
|
|
|
则该系统的召回率为:`8/(8+2)=0.8`。
|
|
|
|
|
|
从计算出的召回率可以看出,假设有`100`个患有癌症的病人使用这个系统进行癌症检测,系统能够检测出`80`人是患有癌症的。**也就是说,召回率越高,那么我们感兴趣的对象成为漏网之鱼的可能性越低。**
|
|
|
|
|
|
|
|
|
##精准率与召回率之间的关系
|
|
|
|
|
|
假设有这么一组数据,菱形代表`Positive`,圆形代表`Negtive` 。
|
|
|
|
|
|
<div align=center><img src="./img/66.jpg", height="50" width="300"/></div>
|
|
|
|
|
|
|
|
|
现在需要训练一个模型对数据进行分类,假如该模型非常简单,就是在数据上画一条线作为分类边界。模型认为边界的左边是`Negtive`,右边是`Positive`。如果该模型的分类边界向左或者向右移动的话,模型所对应的精准率和召回率如下图所示:
|
|
|
|
|
|
<div align=center><img src="./img/67.jpg", height="120" width="300"/></div>
|
|
|
|
|
|
从上图可知,**模型的精准率变高,召回率会变低,精准率变低,召回率会变高。**
|
|
|
|
|
|
##F1 Score
|
|
|
|
|
|
上一节中提到了精准率变高,召回率会变低,精准率变低,召回率会变高。那如果想要同时兼顾精准率和召回率,这个时候就可以使用**F1 Score**来作为性能度量指标了。
|
|
|
|
|
|
`F1 Score`是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的准确率和召回率。`F1 Score`可以看作是模型准确率和召回率的一种加权平均,它的最大值是`1`,最小值是`0` 。其公式如下:
|
|
|
|
|
|
<center>
|
|
|
$$
|
|
|
F1=\frac{2*precision*recall}{precision+recall}
|
|
|
$$
|
|
|
</center>
|
|
|
<br>
|
|
|
|
|
|
- 假设模型`A`的精准率为`0.2`,召回率为`0.7`,那么模型`A`的`F1 Score`为`0.31111`。
|
|
|
|
|
|
- 假设模型`B`的精准率为`0.7`,召回率为`0.2`,那么模型`B`的`F1 Score`为`0.31111`。
|
|
|
|
|
|
- 假设模型`C`的精准率为`0.8`,召回率为`0.7`,那么模型`C`的`F1 Score`为`0.74667`。
|
|
|
|
|
|
- 假设模型`D`的精准率为`0.2`,召回率为`0.3`,那么模型`D`的`F1 Score`为`0.24`。
|
|
|
|
|
|
从上述`4`个模型的各种性能可以看出,模型C的精准率和召回率都比较高,因此它的`F1 Score`也比较高。而其他模型的精准率和召回率要么都比较低,要么一个低一个高,所以它们的`F1 Score`比较低。
|
|
|
|
|
|
这也说明了只有当模型的精准率和召回率都比较高时`F1 Score`才会比较高。这也是`F1 Score`能够同时兼顾精准率和召回率的原因。
|
|
|
|
|
|
|
|
|
## ROC曲线
|
|
|
|
|
|
`ROC`曲线(`Receiver Operating Characteristic Curve`)描述的是`TPR`(`True Positive Rate`)与 `FPR`(`False Positive Rate`)之间关系的曲线。
|
|
|
|
|
|
`TPR`与`FPR`的计算公式如下:
|
|
|
|
|
|
<center>
|
|
|
$$
|
|
|
TPR=\frac{TP}{TP+FN}
|
|
|
$$
|
|
|
</center>
|
|
|
<br>
|
|
|
|
|
|
<center>
|
|
|
$$
|
|
|
FPR=\frac{FP}{FP+TN}
|
|
|
$$
|
|
|
</center>
|
|
|
<br>
|
|
|
|
|
|
其中`TPR`的计算公式您可能有点眼熟,没错!就是召回率的计算公式。**也就是说 TPR 就是召回率**。**所以 TPR 描述的是模型预测 Positive 并且预测正确的数量占真实类别为 Positive 样本的比例。而 FPR 描述的模型预测 Positive 并且预测错了的数量占真实类别为 Negtive 样本的比例。**
|
|
|
|
|
|
和精准率与召回率一样,`TPR`与`FPR`之间也存在关系。假设有这么一组数据,菱形代表`Positive`,圆形代表`Negtive`。
|
|
|
|
|
|
<div align=center><img src="./img/66.jpg", height="50" width="300"/></div>
|
|
|
|
|
|
现在需要训练一个逻辑回归的模型对数据进行分类,假如将从`0`到 `1`中的一些值作为模型的分类阈值。若模型认为当前数据是 `Positive`的概率**小于**分类阈值则分类为 Negtive ,**否则**就分类为`Positive`(**假设分类阈值为 0.8 ,模型认为这条数据是 Positive 的概率为 0.7 , 0.7 小于 0.8 ,那么模型就认为这条数据是 Negtive**)。在不同的分类阈值下,模型所对应的`TPR`与`FPR`如下图所示(竖线代表分类阈值,模型会将竖线左边的数据分类成`Negtive`,竖线右边的分类成`Positive`):
|
|
|
|
|
|
<div align=center><img src="./img/68.jpg", height="120" width="300"/></div>
|
|
|
|
|
|
从图中可以看出,**当模型的 TPR 越高 FPR 也会越高, TPR 越低 FPR 也会越低。这与精准率和召回率之间的关系刚好相反。**并且,模型的分类阈值一但改变,就有一组对应的`TPR`与`FPR`。假设该模型在不同的分类阈值下其对应的`TPR`与`FPR`如下表所示:
|
|
|
|
|
|
| TPR | FPR |
|
|
|
| ------------ | ------------ |
|
|
|
| 0.2 | 0.08 |
|
|
|
| 0.35 | 0.1 |
|
|
|
| 0.37 | 0.111 |
|
|
|
| 0.51 | 0.12 |
|
|
|
| 0.53 | 0.13 |
|
|
|
| 0.56 | 0.14 |
|
|
|
| 0.71 | 0.21 |
|
|
|
| 0.82 | 0.26 |
|
|
|
| 0.92 | 0.41 |
|
|
|
| 0.93 | 0.42 |
|
|
|
|
|
|
若将`FPR`作为横轴,`TPR`作为纵轴,将上面的表格以折线图的形式画出来就是**ROC曲线**。
|
|
|
|
|
|
<div align=center><img src="./img/69.jpg"/, height="300" width="300"></div>
|
|
|
|
|
|
假设现在有模型`A`和模型`B`,它们的`ROC`曲线如下图所示(其中模型`A`的`ROC`曲线为黄色,模型`B`的`ROC`曲线为蓝色):
|
|
|
|
|
|
<div align=center><img src="./img/70.jpg", height="300" width="300"/></div>
|
|
|
|
|
|
那么模型`A`的性能比模型`B`的性能好,因为模型`A`当`FPR`较低时所对应的`TPR`比模型`B`的低`FPR`所对应的`TPR`更高。由由于随着`FPR`的增大,`TPR`也会增大。所以ROC曲线与横轴所围成的面积越大,模型的分类性能就越高。而ROC曲线的面积称为`AUC`。
|
|
|
|
|
|
|
|
|
#####AUC
|
|
|
|
|
|
很明显模型的`AUC`越高,模型的二分类性能就越强。`AUC`的计算公式如下:
|
|
|
|
|
|
<center>
|
|
|
$$
|
|
|
AUC=\frac{\sum_{ie positive class}rank_i-\frac{M(M+1)}{2}}{M*N}
|
|
|
$$
|
|
|
</center>
|
|
|
<br>
|
|
|
|
|
|
其中`M`为真实类别为`Positive`的样本数量,`N`为真实类别为 `Negtive`的样本数量。`ranki`代表了真实类别为`Positive`的样本点额预测概率从小到大排序后,该预测概率排在第几。
|
|
|
|
|
|
举个例子,现有预测概率与真实类别的表格如下所示(其中`0`表示 `Negtive` ,`1`表示`Positive`):
|
|
|
|
|
|
| 编号 | 预测概率 | 真实类别 |
|
|
|
| ------------ | ------------ | ------------ |
|
|
|
| 1 | 0.1 | 0 |
|
|
|
| 2 | 0.4 | 0 |
|
|
|
| 3 | 0.3 | 1 |
|
|
|
| 4 | 0.8 | 1 |
|
|
|
|
|
|
想要得到公式中的`rank` ,就需要将预测概率从小到大排序,排序后如下:
|
|
|
|
|
|
| 编号 | 预测概率 | 真实类别 |
|
|
|
| ------------ | ------------ | ------------ |
|
|
|
| 1 | 0.1 | 0 |
|
|
|
| 3 | 0.3 | 1 |
|
|
|
| 2 | 0.4 | 0 |
|
|
|
| 4 | 0.8 | 1 |
|
|
|
|
|
|
排序后的表格中,真实类别为`Positive`只有编号为`3`和编号为`4`的数据,并且编号为`3`的数据排在第`2` ,编号为`4`的数据排在第`4`。所以`rank=[2, 4]`。又因表格中真是类别为 `Positive`的数据有`2`条,`Negtive`的数据有`2`条。因此`M`为`2`,`N`为`2`。所以根据`AUC`的计算公式可知:
|
|
|
|
|
|
<center>
|
|
|
$$
|
|
|
AUC=\frac{(2+4)-\frac{2(2+1)}{2}}{2*2}=0.75
|
|
|
$$
|
|
|
</center>
|
|
|
<br> |