# 机器学习评估指标的前世今生

• 很多同学在入门机器学习的时候都会好奇，这么多的机器学习指标，到底要用哪个？这些指标的含义和优缺点是什么？他们之间有没有联系？像AUC这种常用的指标到底是什么意思，它的核心idea又是什么？它是怎样计算出来的？
• 下面，我会用通俗易懂的语言，介绍不同的机器学习评估指标的具体含义，优缺点，以及它们之间的联系，将常用的机器学习评估指标串成一条线。然后重点介绍了AUC的来历，核心的idea以及计算过程。并简要介绍了评估指标和代价函数之间的关系和区别。里面有一些自己的观点和体会，如有不当，请大家指正。废话少说，上正文哈！！！
• 我们先来看一下sklearn中支持哪些机器学习的评估指标：

 12 from sklearn.metrics import SCORERSSCORERS

{‘accuracy’: make_scorer(accuracy_score),
‘average_precision’: make_scorer(average_precision_score, needs_threshold=True),
‘f1’: make_scorer(f1_score),
‘f1_macro’: make_scorer(f1_score, average=macro, pos_label=None),
‘f1_micro’: make_scorer(f1_score, average=micro, pos_label=None),
‘f1_samples’: make_scorer(f1_score, average=samples, pos_label=None),
‘f1_weighted’: make_scorer(f1_score, average=weighted, pos_label=None),
‘log_loss’: make_scorer(log_loss, greater_is_better=False, needs_proba=True),
‘mean_absolute_error’: make_scorer(mean_absolute_error, greater_is_better=False),
‘mean_squared_error’: make_scorer(mean_squared_error, greater_is_better=False),
‘median_absolute_error’: make_scorer(median_absolute_error, greater_is_better=False),
‘neg_log_loss’: make_scorer(log_loss, greater_is_better=False, needs_proba=True),
‘neg_mean_absolute_error’: make_scorer(mean_absolute_error, greater_is_better=False),
‘neg_mean_squared_error’: make_scorer(mean_squared_error, greater_is_better=False),
‘neg_median_absolute_error’: make_scorer(median_absolute_error, greater_is_better=False),
‘precision’: make_scorer(precision_score),
‘precision_macro’: make_scorer(precision_score, average=macro, pos_label=None),
‘precision_micro’: make_scorer(precision_score, average=micro, pos_label=None),
‘precision_samples’: make_scorer(precision_score, average=samples, pos_label=None),
‘precision_weighted’: make_scorer(precision_score, average=weighted, pos_label=None),
‘r2’: make_scorer(r2_score),
‘recall’: make_scorer(recall_score),
‘recall_macro’: make_scorer(recall_score, average=macro, pos_label=None),
‘recall_micro’: make_scorer(recall_score, average=micro, pos_label=None),
‘recall_samples’: make_scorer(recall_score, average=samples, pos_label=None),
‘recall_weighted’: make_scorer(recall_score, average=weighted, pos_label=None),
‘roc_auc’: make_scorer(roc_auc_score, needs_threshold=True)}

# 回归（Regression）算法指标大揭秘

• Mean Absolute Error 平均绝对误差
• Mean Squared Error 均方误差
• Root Mean Squared Error：均方根误差

• Coefficient of determination 决定系数

## 平均绝对误差 MAE

MAE虽能较好衡量回归模型的好坏，但是绝对值的存在导致函数不光滑，在某些点上不能求导，可以考虑将绝对值改为残差的平方，这就是均方误差。

## 决定系数 $R^2$

$\text{SST} = \sum \limits_i^m(y_i - \bar y)^2 \qquad \text{SST = total sum of squares}$

$\text{SSR} = \sum \limits_i^m(\hat y_i - \bar y)^2 \qquad \text{SSR = sum of due to regression}$

$\text{SSE} = \sum \limits_i^m(\hat y_i - y_i)^2 \qquad \text{SSE = sum of due to erros}$

$\text{SST = SSR + SSE}$

## 解决评估指标鲁棒性问题

• 剔除异常值

• 使用误差的分位数来代替，

MAPE是一个相对误差的中位数，当然也可以使用别的分位数。

# 分类（Classification）算法指标大揭秘

• 精度 Accuracy
• 混淆矩阵 Confusion Matrix
• 准确率（查准率） Precision
• 召回率（查全率）Recall
• $F_\beta$ Score
• AUC Area Under Curve

• KS Kolmogorov-Smirnov

## 精度 Acc

• 对于有倾向性的问题，往往不能用精度指标来衡量。比如，判断空中的飞行物是导弹还是其他飞行物，很显然为了减少损失，我们更倾向于相信是导弹而采用相应的防护措施。此时判断为导弹实际上是其他飞行物与判断为其他飞行物实际上是导弹这两种情况的重要性是不一样的；
• 对于样本类别数量严重不均衡的情况，也不能用精度指标来衡量。比如银行客户样本中好客户990个，坏客户10个。如果一个模型直接把所有客户都判断为好客户，得到精度为99%，但这显然是没有意义的。

## 混淆矩阵 Confusion Matrix

• True positive (TP)

真实值为Positive，预测正确（预测值为Positive）

• True negative (TN)

真实值为Negative，预测正确（预测值为Negative）

• False positive (FP)

真实值为Negative，预测错误（预测值为Positive），第一类错误， Type I error。

• False negative (FN)

真实值为Positive，预测错误（预测值为 Negative），第二类错误， Type II error。

## 准确率 (查准率) Precision

Precision 是分类器预测的正样本中预测正确的比例，取值范围为[0,1]，取值越大，模型预测能力越好。

## 召回率 (查全率) Recall

Recall 是分类器所预测正确的正样本占所有正样本的比例，取值范围为[0,1]，取值越大，模型预测能力越好。

1. 地震的预测
对于地震的预测，我们希望的是Recall非常高，也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲Precision。情愿发出1000次警报，把10次地震都预测正确了；也不要预测100次对了8次漏了两次。
2. 嫌疑人定罪
基于不错怪一个好人的原则，对于嫌疑人的定罪我们希望是非常准确的。即使有时候放过了一些罪犯，但也是值得的。因此我们希望有较高的Precision值，可以合理地牺牲Recall。

## $F_\beta$ Score

Precision和Recall 是互相影响的，理想情况下肯定是做到两者都高，但是一般情况下Precision高、Recall 就低，Recall 高、Precision就低。为了均衡两个指标，我们可以采用Precision和Recall的加权调和平均（weighted harmonic mean）来衡量，即$F_\beta$ Score，公式如下：

$\beta$ 表示权重，

$$$\begin{split} F_{\beta}& = \frac{(1+\beta^2)\times\text{P}\times\text{R}}{\beta^2\times\text{P}+\text{R}} \ & = \frac {1}{\frac{\beta^2}{(1+\beta^2)\times R}+\frac{1}{(1+\beta^2)\times P}}\ & = \frac {1}{\frac{1}{(1+\frac{1}{\beta^2})\times R}+\frac{1}{(1+\beta^2)\times P}} \end{split}$$$

## ROC 和 AUC

### ROC

ROC曲线为 FPR 与 TPR 之间的关系曲线，这个组合以 FPR 对 TPR，即是以代价 (costs) 对收益 (benefits)，显然收益越高，代价越低，模型的性能就越好。

• x 轴为假阳性率（FPR）：在所有的负样本中，分类器预测错误的比例

• y 轴为真阳性率（TPR）：在所有的正样本中，分类器预测正确的比例（等于Recall）

### AUC

AUC定义：

AUC 值为 ROC 曲线所覆盖的区域面积，显然，AUC越大，分类器分类效果越好。

AUC = 1，是完美分类器。

0.5 < AUC < 1，优于随机猜测。有预测价值。

AUC = 0.5，跟随机猜测一样（例：丢铜板），没有预测价值。

AUC < 0.5，比随机猜测还差；但只要总是反预测而行，就优于随机猜测。

AUC的物理意义

AUC的物理意义正样本的预测结果大于负样本的预测结果的概率。所以AUC反应的是分类器对样本的排序能力。

1. AUC更多的是关注对计算概率的排序，关注的是概率值的相对大小，与阈值和概率值的绝对大小没有关系

小明姐姐妈妈爸爸
a 0.12 0.35 0.76 0.85
b 0.12 0.35 0.44 0.49
c 0.52 0.65 0.76 0.85

AUC只与概率的相对大小（概率排序）有关，和绝对大小没关系。由于三个模型概率排序的前两位都是未成年人（小明，姐姐），后两位都是成年人（妈妈，爸爸），因此三个模型的AUC都等于1。

1. AUC只关注正负样本之间的排序，并不关心正样本内部，或者负样本内部的排序。这也体现了AUC的本质：任意个正样本的概率都大于负样本的概率的能力

例子中AUC只需要保证（小明和姐姐）（爸爸和妈妈），小明和姐姐在前2个排序，爸爸和妈妈在后2个排序，而不会考虑小明和姐姐谁在前，或者爸爸和妈妈谁在前。

D 模型, E模型和F模型的AUC值为1，C 模型的AUC值为0（爸妈为成年人的概率小于小明和姐姐，显然这个模型预测反了）。

AUC的计算：

• 法1：AUC 为 ROC 曲线下的面积，那我们直接计算面积可得。面积为一个个小的梯形面积（曲线）之和。计算的精度与阈值的精度有关。
• 法2：根据 AUC 的物理意义，我们计算正样本预测结果大于负样本预测结果的概率。取 $n_1n_0$($n_1$ 为正样本数，$n_0$ 为负样本数)个二元组，比较 score（预测结果），最后得到 AUC。时间复杂度为 O(NM)。
• 首先把所有样本按照 score 排序，依次用 rank 表示他们，如最大 score 的样本，$rank=n$ ( $n=n_0+n_1$，其中 $n_0$ 为负样本个数，$n_1$ 为正样本个数)，其次为 $n-1$。对于正样本中 rank 最大的样本 $rank_max$，有 $n_1-1$ 个其他正样本比它小。有 $rank_max-n_1$ 个负样本比它小。其次为$rank_second-(n_1-1)$。最后我们得到正样本大于负样本的概率为：

• 真实标签为 (1, 0, 0, 1, 0)
• 预测结果1:（0.9, 0.3, 0.2, 0.7, 0.5）
• 预测结果2:（0.9, 0.3, 0.2, 0.7, 0.8）)
• 分别对两个预测结果进行排序，并提取他们的序号:
• 结果1: (5, 2, 1, 4, 3)
• 结果2: (5, 2, 1, 3, 4)
• 对正分类序号累加 :
• 结果1: $\sum_{正样本}{RANK(score)}=5+4=9$
• 结果2: $\sum_{正样本}{RANK(score)}=5+3=8$
• 计算两个结果的 AUC:
• 结果1：
• 结果2：

ROC曲线只与横坐标 (FPR) 和 纵坐标 (TPR) 有关系，我们知道：

## KS Kolmogorov-Smirnov

KS值是在模型中用于区分预测正负样本分隔程度的评价指标，一般应用于金融风控领域。与ROC曲线相似，ROC是以FPR作为横坐标，TPR作为纵坐标，通过改变不同阈值，从而得到ROC曲线。而在KS曲线中，则是以阈值作为横坐标，以FPR和TPR作为纵坐标，ks曲线则为TPR-FPR，ks曲线的最大值通常为ks值。

KS值的取值范围是[0，1]。通常来说，值越大，模型区分正负样本的能力越强（一般0.3以上，说明模型的效果比较好）。

# 评估指标和代价函数是一家人吗？

1. 直观，可以理解

……

1. 函数光滑且可导：可用梯度下降求解极值
2. 函数为凸函数：可用梯度下降求解最优解

……

# 补充小知识点：micro还是macro？

## macro方法

1. 计算出各混淆矩阵的Recall，Precision，记为$(P_1, R_1)，(P_2，R_2)，\cdots，(P_n，R_n)$：

2. 对各个混淆矩阵的Recall，Precision求平均，然后再根据求得的Recall，Precision计算F1。

## micro方法

1. 将各混淆矩阵对应的元素进行平均，得到平均混淆矩阵：

2. 再基于平均混淆矩阵计算Recall，Precision，然后再根据求得的Recall，Precision计算F1：

ROC 和 AUC 介绍以及如何计算AUC http://alexkong.net/2013/06/introduction-to-auc-and-roc/

posted @ 2018-10-04 10:32  Little_Rookie  阅读(1065)  评论(0编辑  收藏