Fork me on GitHub

机器学习之评价指标

    今天主要来总结一下机器学习的评价指标。在使用数据来训练一个或多个机器学习模型的时候,一般是通过评价指标来对构建的模型有一个数字化的度量。

监督学习

回归模型评价指标

    对于label是连续型的数据来说,机器学习主要是学习模型来预测新数据。那么我们应该如何度量学习到的模型的优劣呢?我们可能更多的会想到用距离来度量,下面我们根据一张线性回归的示意图为例:

在上图中其中$y_i$是实际数据,$\hat{y}_i$是预测的数据,$\bar{y}_i$是数据的平均值。
    关于距离度量,我们首先想到的可能就是采用预测值和真实值之间的距离来衡量。即所谓的绝对误差和SAE(Sum of Absolute Error),也可以称为$l1$范数损失:

思考1:采用MAE有哪些缺点
    仔细想想,并不是很合理,为什么?MAE虽然能够较好地衡量回归模型的好坏,但是绝对值的存在使得函数并不光滑,在求MAE最小值的时候通常会使用导数来求,然而,绝对值在某些点上并不可导,因此,我们可以考虑采用残差平方和,又可以称为$l2$范数损失。

SSE残差平方和

SSR回归平方和

SST总偏差平方和

在无偏估计(用样本统计量来估计总体参数时的一种无偏推断)中,存在如下等式关系:

否则:

$R^2$

    $R^2$是统计学当中的一个概念,一般称它为可决策系数。在实际中,没有必要对因变量是常量的数据建模进而预测。正是由于因变量是变化的,也就是数据的方差不为0,因此需要建立回归模型进行预测。决定系数可以反应因变量的全部变异能够通过回归关系被自变量解释的比例。其计算公式如下:

$R^2$越大,拟合效果越好,$R^2$可能为负值。如果结果为0,表示预测值为样本期望,则表示模型不能预测因变量。结果介于0-1之间的数,就代表了模型的好坏程度。

二分类模型评价指标

    对于label是离散型的数据,机器学习主要是根据数据学习模型进行分类新数据。
    在分类模型评价这一小节中,假设这样一个情景,判别一个人是否酒驾,假设非酒驾的人和酒驾的人, 酒精浓度度数概率密度也是成一定的分布的,用如下图进行实例总结。

    其中,蓝色代表的是非酒驾的人检测的酒精浓度度数的分布 ,橘黄色代表的是酒驾的人检测的酒精浓度度数的分布。

p-value

    p-value是基于假设检验的,在查酒驾案例中,我们一般假设没喝酒。即原假设:没喝酒
    p-value定义:在原假设中,出现观测值以及比观测值更极端情况的概率
备择假设:酒驾
    酒驾和非酒驾由阈值决定,阈值同时也可以决定是否拒绝原假设。如何定义阈值的分类效果?通俗来讲阈值的选取标准一般是该阈值能不能显著的区分两各类别的人,进而减少不确定性。
    接下来我们引入混淆矩阵(Confusion Matrix)的概念。

Confusoin Matrix

针对一个该案例中的酒驾问题,Confusoin Matrix(混淆矩阵)如图所示,
'混淆矩阵'
    在这里解释一下T代表的是预测正确,F代表的是预测错误,N(Negative)代表的是阴性,即没有拒绝原假设,P(Positive)代表的是阳性,即拒绝原假设。
接下来引入根据本案例,引入几个概念:

Accuracy

    准确率指的是在所有样本中,样本预测正确的比例,用公式可以表示为:

Precision

    Precision(精确率)是指在预测为“真”的样本中,实际中也为真的比例,用公式可以表示为:

Recall

    Recall(召回率)是指所有实际为真的样本中,被分类为“真”的比例,用公式表示为:

PRC

    PRC(precision recall curve)中,横轴是Recall,纵轴是Precision,在正负样本分布得及其不均匀的情况下,PRC比ROC更能有效地反应分类器的好坏。曲线所围成的面积越大越好。
问题2:precision和recall的应用场景
(1)地震的预测
    对于地震的预测,我们希望的是Recall非常高,也就是说每次地震我们都希望预测出来。这个时候我们可以牺牲Precision。情愿发出1000次警报,把10次地震都预测正确了;也不要预测100次对了8次漏了两次。
(2)嫌疑人定罪
    基于不错怪一个好人的原则,对于嫌疑人的定罪我们希望是非常准确的。即使有时候放过了一些罪犯,但也是值得的。因此我们希望有较高的Precision值,可以合理地牺牲Recall。
正如下面两个例子,我们希望Precision越高越好,同时Recall也越高越好,但事实上这两者在某些情况下有矛盾的。所以,我们接下来引入精确值和召回率的调和均值F1-score。

F1-score

    F1-score可以用如下公式计算:

整理得:

ROC

    ROC(Receiver operating characteristic curve),在最开始引入的混淆矩阵中,有两类错误,一类是FP,又被称之为是第一类错误$\alpha$,另一类是FN,又被称之为是第二类错误 $\beta$。ROC曲线的横轴所代表的是第一类错误假阳性FP,纵坐标所代表的是1-FN(被称之为$power$)。如下图所示,即为ROC曲线图:

ROC曲线特点如下:
\tag{1}ROC曲线斜率为正,阈值假设向左移,$\alpha$增大,$power$也会增大。
(2)ROC曲线在45度线之上。
    一般来说,如果ROC曲线是光滑的,那么基本可以判断没有过大的overfiting。

AUC

    AUC是指ROC曲线所围成的面积。AUC越大,分类器效果越好。
ROC曲线python代码
    更多python代码可以进入本人github博客所涉及到的代码仓库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
from sklearn.metrics import roc_curve,roc_auc_score,auc
import matplotlib as mpl
import matplotlib.pyplot as plt
if __name__=='__main__':
mpl.rcParams['font.sans-serif'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False
y=np.array([0,1,0,1,0,1])
y_hat=np.array([0.1,0.6,0.5,0.3,0.7,0.8])
fpr,tpr,threshold=roc_curve(y,y_hat)
fpr=np.insert(fpr,0,0)
tpr=np.insert(tpr,0,0)
auc=auc(fpr,tpr)#计算AUC
print(roc_auc_score(y,y_hat))
plt.figure(facecolor='w')
plt.plot(fpr,tpr,lw=3,marker='*',ls='-',mec='g',mfc='g',color='r')
plt.plot([0,1],[0,1],lw=2,ls='--',c='b')
plt.xlim((-0.01,1.01))
plt.ylim((-0.01,1.01))
plt.xticks(np.arange(0,1.1,0.1))
plt.yticks(np.arange(0,1.1,0.1))
plt.xlabel('False positive rate(fpr)第一类错误率',fontsize=16)
plt.ylabel('True positive rate(fpr)1-第二类错误率', fontsize=16)
plt.grid(b=True, ls='dotted')
plt.title('ROC曲线', fontsize=18)
plt.show()

Lift Curve

    先占坑,后期来填。

参考资料

机器学习评价指标知乎
机器学习评价指标ROC AUC PRC

坚持原创技术分享,您的支持将鼓励我继续创作