# 数据指标好坏的评判

在[数据基础算法](数据基础算法.md)中介绍了一些算法模型，但是不知道你有没有一个疑问，那就是我们可能针对同一个问题设计了很多个算法模型，
但是我们怎么量化的评判哪个算法模型比较好。

例如：怎么衡量爬虫存疑指标的质量怎么样？

这就是本文要分享的重点，如果评判一个算法模型（或者说是数据指标）的好坏，即以下指标：

1. **准确率** —— 准确率衡量整体准确情况

1. **精确率** —— 查准率，也就是结果准不准
   
2. **召回率** —— 查全率，也就是结果全不全

3. **置信区间和置信度** —— 识别出来的范围以及你在这个范围内的信心

## 准确率

衡量一个算法准不准，我们的第一感觉就是要看这个模型的准确率。的确，在算法衡量里就有一个指标就叫准确率，英文叫做 Accuracy。
顾名思义，准确率就是看整体里预测准确的概率是多少。

准确率 = 预测正确的样本数量 / 预测总的样本数量

这个公式乍一看很有作用，但是用这样的方式来评估一个算法模型是有问题的。假设我设计了一个算法来辨别鹿的照片。我准备了 100 张图片，图片里边有 1 张鹿，99 张马。
现在，我要让算法来识别这个图片里到底是鹿还是马。

假如这个算法模型很准确，把一个鹿识别出来了，然后我们看这个准确率是多少呢，用刚刚的那个公式，你容易得出是 1/100，也就是说只有 1% 的准确率。
这个和我们当时预期的明显不对。

## 精确率

> 精确率为预测正确的正例 (TP) 在所有预测为正例的样本中出现的概率，即分类正确的正样本个数占分类器判定为正样本的样本个数的比例

那怎么样更好的去衡量这个算法模型呢？我们就有了一个新的概念，叫做精确率，英文叫做 precision，也叫作 P 值、查准率。这个概念稍微复杂了一些。
还用刚才预测鹿和马的这个例子，我们先把几种预测结果的情况都列出来，整体上就是 4 种：

1. 预测马，它的确是马；
   
2. 本来是鹿，预测成马；
   
3. 本来是马，把它预测成鹿了；
   
4. 本来是鹿，预测对了还是鹿。
   
你可以参考下面这个表，会更为直观一些。

![情况分类](img/data-thinking/马鹿1.png)

官方说法是精确率为预测正确的正例 (TP) 在所有预测为正例的样本中出现的概率，即分类正确的正样本个数占分类器判定为正样本的样本个数的比例。是不是有点绕？
你可以把表格和下面这个公式对照起来看，会更容易理解一些。

**精确率 =TP（指马为马）/(TP（指马为马）+FP（指鹿为马）)**

比如说，现在有马和鹿共 100 匹，其中 40 只鹿，60 匹马。预测出来的结果，如下面这个表。

![](img/data-thinking/马鹿2.png)

那么 AI 算法模型精确率就是 40/（40+10）=80%。

光有精确率不够，如果我们现在下个指令，要把那些指鹿为马的 AI 算法都给干掉，这样可以把精确率直接提到 100%（指鹿为马变成 0）。

这样做，看起来精确度足够高、足够精确了。但却会导致最后很多的马识别不出来，因为 AI 看到很多稍微长得像鹿的马，完全不敢识别成马，宁愿说这些马是鹿。

## 召回率

> 召回率用官方的说法是预测正确的正例 (TP) 在原始的所有正例样本中出现的概率，即分类正确的正样本个数占真正的正样本个数的比例

那我们怎么能避免这种情况出现呢，我们就会用到另外一个指标——召回率（recall，也叫作查全率）。用公式来表示就是下面这样。

召回率 =TP（指马为马）/(TP（指马为马）+FN（指马为鹿）)

那么上面这个 AI 算法模型召回率就是 40/(40+20)=66.7%。

简单来说，召回率就是看你查得全不全。目标就是不让你太过于严查指马是鹿，出现上面说的 AI 即使看到真的马也不敢指出来它是马的情况。

我们现在把精确率和召回率放在一起看，精确率 80%，召回率 67.7%。这个数据说明什么呢，说明 AI 算法怕把马认错了，宁可指马为鹿，也不指鹿为马。
在这样一个结论下，接下来我们可以适当优化模型，去找一个最优解。

精确率和召回率（也叫查准率和查全率）是一对孪生兄弟，一般情况下它们是成对出现，用来衡量一个算法模型到底好不好。
**单一指标高并没有意义，避免指鹿为马也避免指马为鹿才是最好的模型。**

## 置信区间

光有精确率和召回率就可以衡量一个算法到底好不好么？
其实还是不够的，我们现实中很多时候不是光看鹿和马的，而是要去预测一些连续的数字。
举个例子，你高考完不知道多少分，你找算命先生帮你预测一下高考成绩。
有一个算命先生告诉你，我有 100% 的把握，你考的分数在 0 到 750 分之间。
另外一个算命先生说，我有 95% 的把握，你在 600 到 630 之间。

这两个算命先生，谁强谁弱，一眼就看出来了，对吧？为了解释每个算命先生（算法）的识别能力范围，我们有了一个新的衡量指标，叫做**置信区间**。

用官方说法来说，置信区间估计是参数估算的一种，它是用一个区间来估计参数值，英文叫做`confidence interval`也就是一定信心下的区间。
这个信心我们可以用前面讲到的准确率来去衡量，这个时候准确率有了一个新名字，叫做置信度。
刚刚提到的 95%、100% 就是**置信度**，[0，750]和[600，630]就是**置信区间**
。一般来讲置信度和置信区间是同向的，啥意思呢？就是置信度和置信区间一般是相同趋势。
当置信度很高时，置信区间也会很大；当置信区间很大时，置信度也会很高。
不过越高其实这个算法越没有用处。 如果一个算命先生告诉你，我有 100% 把握你生命是在 1 岁到 200 岁之间，虽然置信度高，
但显然是一句废话。所以**置信度和置信区间是一组参数，来告诉你这个算法模型误差有多大**。

## 取舍

精确率、召回率、置信区间这三个参数是衡量一个数据算法的核心指标，算命先生既要算得准、算得全还不能范围猜得太大，这才是好的算命先生。
但是现实工作中，要想达到这样的效果，其实是很难的。只能根据具体的业务进行取舍。

## 总结

所以现在在评价一个算法模型的好坏，如一个爬虫的存疑指标时，我们可以通过：

1. **准确率** —— 准确率衡量整体准确情况

1. **精确率** —— 查准率，也就是结果准不准
   
2. **召回率** —— 查全率，也就是结果全不全

3. **置信区间和置信度** —— 识别出来的范围以及你在这个范围内的信心

回答文档开始的问题，对于爬虫存疑指标，我们就应该采用"精确率"和"召回率"来衡量，但是两者很难兼得，我们就可以通过具体的数值去进行调整，从而达到一个平衡点。
如过精确率远远比召回率高，那我们就应该提升召回率；如果精确率比召回率低，那我们就应该提升精确率。从而这个这个指标更有价值，
别要么告警了100个爬虫，结果只有2、3个真正存疑（即召回率高于精确率）；要么只告警了两三个爬虫，结果确实都是真正异常的了，但是其实还有几十个异常爬虫没被发现。

## 参考资料

- [《数据分析思维课》12 | 精确率与置信区间：两种预测，你究竟应该相信哪一个？](https://time.geekbang.org/column/article/410422)