Fork me on GitHub

机器学习系列文章-性能评估度量总结

背景

​ 机器学习方法(监督学习、无监督学习、强化学习)通常认为由模型、策略和算法三个部分构成。例如在监督学习,模型需要从数据中学习条件概率分布(概率模型)或者决策函数(非概率模型)。而模型的假设空间(hypothesis space)就是所有可能的条件概率分布或者决策函数的总体(集合)。

​ 假设空间通常是庞大的,例如深度神经网络结构能够表示一大类输入层到输出层的函数集合。这样就需要我们设定一个可以量化评测假设空间中函数优劣的度量标准,即选出最优解。

我们从数学角度去理解:这里定义在假设空间上的度量,其实是一个泛函(函数的函数)。

第一部分 几个概念的理解

​ 另外我们在优化模型中,经常遇到三个概念:损失函数(loss function)、代价函数(cost function)、目标函数(object function)。

​ 很多书对三个概念的定义范畴有差异。例如《统计学习方法(李航)》中认为损失函数和代价函数等同,而《深度学习(Yoshua)》书中认为三者等同。个人比较赞同下面的理解:

  • loss function ,为定义在单个样本(点)上的函数。

  • cost function 为全体样本误差的期望,也就是损失函数(loss function)的平均。

  • object function ,(目标函数 )定义为:cost function + 正则化项。

​ 这样,代价函数和目标函数就可以理解为:定义在假设空间上的性能度量(泛函)。

注意:大家在阅读其他材料时,在概念没有达成一致情况下,需根据前后文,寻找确切的定义,避免混淆。

第二部分 性能度量介绍

常用性能度量按照学习类型分类主要如下:

学习类型 性能度量
分类 accuracyprecisionrecallF1 ScoreROC Curveauc
回归 MAEMSE

2.1 回归问题

给定一个训练数据集:$Train={(x_1,y_1),(x_2,y_2),…,(x_N,y_N)}$,这里 $x_i \in R^n$ 和 $y_i \in R$ 分别是输入和输出。学习系统基于训练数据集构建拟合函数 $f st. Y=f(X)$,对新的输入$x_{new}$,函数$f$ 给出预测输出 $y_{new}$。

记测试集:$Test={(x_1,y_1),(x_2,y_2),…,(x_M,y_M)}$ ,记其中观测值:$Y={y_1,y_2,…,y_M}$ ,预测值为:$\hat{Y}={\hat{y_1},\hat{y_2},…,\hat{y_M}}$,则有下面两种泛函:

  • MAE(Mean Absolute Error 平均绝对误差)

$$
MAE(f)=MAE(Y,\hat{Y})=\dfrac{1}{M}\sum_{i=1}^M{|y_i-\hat{y_i}|}
$$

注:数学形式是向量的$L_1$范数。

  • MSE(Mean Squared Error 均方误差)

$$
MSE(f)=MSE(Y,\hat{Y})=\dfrac{1}{M}\sum_{i=1}^M{|y_i-\hat{y_i}|^2}
$$

注:数学形式是向量的$L_2$范数。

sklearn包中已经封装相关性能函数供调用:

性能容量函数
metrics.explained_variance_score(y_true, y_pred) Explained variance regression score function
metrics.mean_absolute_error(y_true, y_pred) Mean absolute error regression loss
metrics.mean_squared_error(y_true, y_pred[, …]) Mean squared error regression loss
metrics.mean_squared_log_error(y_true, y_pred) Mean squared logarithmic error regression loss
metrics.median_absolute_error(y_true, y_pred) Median absolute error regression loss
metrics.r2_score(y_true, y_pred[, …]) R^2 (coefficient of determination) regression score function.
1
2
3
4
5
6
from sklearn.metrics import mean_absolute_error as mae
from sklearn.metrics import mean_squared_error as mse
y_true = [3, -0.5, 2, 7]
y_pred = [2.5, 0.0, 2, 8]
mae(y_true, y_pred)
mse(y_true, y_pred)

注:其他性能函数可以查看sklearn的介绍。

2.2 分类问题

对于分类问题我们先介绍一个重要概念:混淆矩阵(Confusion matrix)。为了方便讨论,我们以二分类问题为例。

注意:混淆矩阵的定义很多材料也有差异,主要是记号上的区别。这里使用wiki百科的记号标准。

  • True Positive(TP):将正类预测为正类数(预测正确)
  • True Negative(TN):将负类预测为负类数(预测正确)
  • False Positive(FP):将负类预测为正类数 (预测错误)(Type I error
  • False Negative(FN):将正类预测为负类数(预测错误)(Type II error
预测\真实 Positive Negative
True True Positive(TP) False Positive(FP) (Type I error)
False False Negative(FN)(Type II error) True negative(TN)
  • ACC(accuracy)准确率

    分类正确的样本数占样本总数的比例 。

$$
ACC=\dfrac{正确预测的正类+正确预测的反类}{预测样本总量}=\dfrac{TP+TN}{TP+TN+FP+FN}
$$

缺点:在正负类样本分布不均衡的情况下,例如异常检测中如果使用该性能指标,由于样本中异常点(负类)占比很小,这样即使样本全部预测成正类,准确率也有很好的表现。该性能度量无法指导算法寻找最优解。

  • Precision(精确度)

​ 预测为True中,预测正确的样本占比。
$$
Precision=\dfrac{正确预测的正类}{预测为正类样本总量}=\dfrac{TP}{TP+FP}
$$

缺点:和ACC相同。

  • Recall(召回率)

​ 正确预测的正例占实际正例的比例。
$$
Recall=\dfrac{正确预测的正类}{实际正类样本总量}=\dfrac{TP}{TP+FN}
$$

  • F1(F-score)

    精确率和召回率的调和均值。

$$
\dfrac{1}{F_1}=\dfrac{1}{Precision}+\dfrac{1}{recall},整理:F_1=\dfrac{2TP}{2TP+FP+FN}
$$

精确率和召回率都高的情况下,F1 Score也会很高 。

  • ROC(receiver operating characteristic curve)曲线

对于分类问题,模型通常输出的结果为样本点属于类别的概率大小,例如样本属于正类(1类)的概率为0.76,等等。通常我们会设定一个阀值(例如0.5),概率值大于阀值则认为样本属于正类,否则属于负类。

上面的性能指标都是基于通过阀值判断后的结果(0或1)进行度量。

这里引入两个度量:
$$
TPR=\dfrac{TP}{TP+FN};FPR=\dfrac{FP}{FP+TN}
$$

TPR:实际为正样本中,被正确地判断为正例的比率 。

FPR:实际为负样本中,被错误地判断为正例的比率。

根据不同的概率阀值$threshold \in [0,1] $,计算FPR和TPR的值,得到坐标值$(FPR,TPR)$,即ROC曲线上的一点。采样足够多的坐标点就得到了ROC曲线。

  • AUC

    有了ROC曲线,可以计算曲线下的面积,这就是AUC(Area under the Curve of ROC )。 AUC值越大的分类器,正确率越高。对于AUC有下面的讨论:

  1. AUC=1,完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。下图红线。
  2. 0.5<AUC<1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  3. AUC=0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  4. 0<0.5AUC<0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测,因此不存在0<0.5AUC<0.5 的情况。
  • log_loss(对数损失 )

$$
logloss(f)=\dfrac{1}{M}\sum_{i=1}^M \sum_{j=1}^Cy_{i,j}log(P_{i,j}(x_i))
$$

​ 其中$M$为样本数,$C$为类别数,$y_{i,j}$为第$x_i$属于$j$类的符号函数。$p_{i,j}$为$x_i$为$j$类的概率。

这个性能度量其实是在算数据真实分布和预测分布的交叉熵(cross entropy )。交叉熵越小说明预测分布和真实分布越接近。表明模型具体有较强的泛化能力。

事实上,这里有个小的trick需要说明一下:

信息论中用相对熵用来度量同一个随机变量不同概率分布的“距离”,也称为KL散度。记随机变量$X$有两个分布$p和q$,数学形式为:
$$
KL(p||q)=\int_Xp(X)log(\dfrac{p(X)}{q(X)})dx=-\int_Xp(X)log(q(X))dx+\int_Xp(X)log(p(X))dx
$$
右边等式的第一项是交叉熵,第二项是p的信息熵(常量)。所以为了使得KL散度最小化,需要交叉熵越小。即极小化相对熵和交叉熵是一回事(等价)。

同样sklearn包中对上面的性能度量均有封装函数。

第三部分 性能度量使用和总结

选择恰当的性能函数对于提升模型的泛化能力是一个重要因素。学习的目的是得到泛化误差小的模型,实际问题中即使得测试集上误差最小。通常会遇到下面两种情况:

当模型在训练集上表现良好、在测试集上误差较大,称为过拟合;而模型在训练集上误差就很大时,称为欠拟合。

  • 欠拟合解决手段有:数据增强、增加训练次数等。
  • 过拟合则有:减少模型参数,减少特征空间,交叉验证,正则化项,Dropout(神经网络中使用)等。

为了防止模型的过拟合通常性能度量会包含正则项。

另外也可以使用多个性能度量对模型进行度量,例如$F_1 score$为精确率和召回率两个性能度量的调和值。

学习的过程转化为最小化性能度量的最优化问题。接着我们得到性能度量函数的极大似然函数。问题转换log极大似然函数最大化问题。这时通常没有解析解(线性回归是有解析解的),只能通过数值方法来寻找最优参数。

这里不再展开说了。

当然对于其他学习任务同样是有性能度量的。比如无监督的聚类问题,K-Means算法中性能度量为:寻找最佳K个质心,使得所有点到所属质心的距离和最小。无监督的降维技术PCA算法的性能度量为:寻找坐标变化,使得新的坐标系下,使得主要坐标轴上的分量的方差最大化。强化学习中Q Learing的性能容量为:对于每个状态(state)选择最佳动作(action)使得奖赏(reword)最大化。

广义上理解,性能度量是假设空间上的泛函,用于量化(度量)假设空间,从而指导算法寻找最优解。

参考文献

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

2、sklearn,链接:http://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics

3、wiki百科,链接:https://zh.wikipedia.org/wiki/ROC%E6%9B%B2%E7%BA%BF

4、《统计学习方法》

5、《深度学习》

0%