You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pgi29wjsp/classification_metrics.md

244 lines
11 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 分类模型性能评估指标
##准确度的缺陷
准确度这个概念相信对于大家来说肯定并不陌生,就是正确率。例如模型的预测结果与数据真实结果如下表所示:
| 编号 | 预测结果 | 真实结果 |
| :-: | :-: | :-: |
| 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>