在模型评估过程中,往往需要使用多种不同的指标进行评估,在诸多的评价指标中,大部分指标只能片面的反应模型的一部分性能,如果不能合理的运用评估指标,不仅不能发现模型本身的问题,而且会得出错误的结论。
本文将详细介绍机器学习分类任务
的常用评价指标:准确率(Accuracy)
、精确率(Precision)
、召回率(Recall)
、P-R曲线(Precision-Recall Curve)
、F1 Score、混淆矩阵(Confuse Matrix)
、ROC
、AUC
。
准确率是分类问题中最简单也是最直观的评价指标,但存在明显的缺陷。比如,当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率。所以,当不同类别的样本比例非常不均衡时,占比大的类别往往成为影响准确率的最主要因素。
准确率的定义:准确率是指分类正确的样本占总样本个数的比例,即 A c c u r a c y = n c o r r e c t n t o t a l Accuracy=\frac{n_{correct}}{n_{total}} Accuracy=ntotalncorrect,其中 n c o r r e c c t n_{correcct} ncorrecct为正确分类的样本个数, n t o t a l n_{total} ntotal为总样本的个数 。
为了解决这个问题,可以使用**平均准确率(每个类别下的样本准确率的算术平均)**作为模型评估的指标;
模型的好坏,标准答案其实也不限于指标的选择,即使评估指标选择对了,仍会存在模型过拟合或欠拟合、测试集和训练集划为不合理、线下评估与线上测试的样本分布存在差异等一系列问题,但评估指标的选择是最容易被发现,也是最可能影响评估结果的因素。
首先明确两个概念:精确率和召回率。
在排序问题中,通常没有一个确定的阈值把得到的结果直接判定为正样本或负样本,而是采用Top N返回结果的Precision值和Recall值来衡量排序模型的性能,即认为模型返回的TopN的结果就是模型判定的正样本,然后计算前N个位置上的准确率Precision@N和前N个位置上的召回率Recall@N。
在模型评估时,是否应该同时关注Precision值和Recall值?进一步而言,是否应该选取不同的Top N的结果进行观察呢?是否应该选取更高阶的评估指标来更全面地反映模型的Precision值和Recall值两方面的表现?
肯定的,为了综合评估一个排序模型的好坏,最好还好绘制P-R(Precision-Recall)曲线。
P-R曲线的横轴是召回率,纵轴是精确率。对于一个排序模型来说,其P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到底移动而生成的。原点附近代表当阈值最大时模型的精确率和召回率。
除此之外,F1 score 和ROC曲线也能综合地反映一个排序模型的性能。F1 score是精确率和召回率的调和平均值,它定义为:
F
1
=
2
×
p
r
e
c
i
s
i
o
n
×
r
e
c
a
l
l
p
r
e
c
i
s
i
o
n
+
r
e
c
a
l
l
F1=\frac{2 \times precision \times recall}{precision+ recall}
F1=precision+recall2×precision×recall
MSE(Mean Square Error)均方误差(L2损失):是真实值与预测值的差值的平方,然后求和平均,是最常用的回归损失函数。
M
S
E
=
1
m
∑
i
=
1
m
(
y
i
−
f
(
x
i
)
)
2
MSE=\frac{1}{m}\sum_{i=1}^m {(y_i-f(x_i))^2}
MSE=m1i=1∑m(yi−f(xi))2
RMSE(Root Mean Square Error)均方根误差:是预测值与真实值偏差的平方与观测次数N比值的平方根。
R
M
S
E
=
1
N
∑
i
=
1
n
(
y
i
−
f
(
x
i
)
)
2
RMSE=\sqrt {\frac{1}{N}\sum_{i=1}^n (y_i-f(x_i))^2}
RMSE=N1i=1∑n(yi−f(xi))2
MAE(Mean Absolute Error)平均绝对误差,也称L1损失,是另一种用于回归模型的损失函数,是目标值和预测值之差的绝对值之和的平均值,能更好地反映预测值误差的实际情况。MAE只衡量了预测值误差的平均模长,而不考虑方向,取值范围也是从0到正无穷(如果考虑方向,则是残差/误差的总和——平均偏差(MBE))
M
A
E
=
1
m
∑
i
=
1
m
∣
y
i
−
y
i
^
∣
MAE=\frac{1}{m}\sum_{i=1}^m |y_i-\hat{y_i}|
MAE=m1i=1∑m∣yi−yi^∣
RMSE与标准差的区别:标准差是用来衡量一组数自身的离散程度,而均方根误差是用来衡量观测值同真实值之间的偏差,它们的研究对象和研究目的不同,尽管计算过程类似。
RMSE和MAE的区别:RMSE相当于L2范数,MAE相当于L1范数。次数越高,计算结果就越与较大的值有关,而忽略较小的值,用RMSE计算损失的模型会以牺牲了其他样本的误差为代价,朝着减小异常点误差的方向更新,这就会降低模型的整体性能。另外对于神经网络来说,MAE存在一个严重的问题:更新的梯度始终相同。为了解决这个问题使用变化的学习率。
RMSE经常被用来衡量回归模型的好坏,正如上面公式所述,
y
i
y_i
yi是第i个样本点的真实值,
f
(
x
i
)
f(x_i)
f(xi)是第i个样本点的预测值,N是样本点的个数。
一般情况下,RMSE能够很好反映回归模型预测值和真实值的偏离程度,但是实际中,如果存在个别偏离程度大的离群点时,即使离群点数量非常少,也会让RMSE指标变得很差。
针对这个问题,可以从三个角度来思考:
平均绝对百分比误差(Mean Absolute Percent Error, MAPE)
,它定义为:根据不同情况选择损失函数
总而言之,处理异常点时,L1损失函数更稳定,但它的导数不连续,因此求解效率较低。L2损失函数对异常点更敏感,但通过令其导数为0,可以得到更稳定的封闭解。
二者兼有的问题是:在某些情况下,上述两种损失函数都不能满足需求。例如,若数据中90%的样本对应的目标值为150,剩下10%在0到30之间。那么使用MAE作为损失函数的模型可能会忽视10%的异常点,而对所有样本的预测值都为150。这是因为模型会按中位数来预测。而使用MSE的模型则会给出很多介于0到30的预测值,因为模型会向异常点偏移。上述两种结果在许多商业场景中都是不可取的。
这些情况下应该怎么办呢?最简单的办法是对目标变量进行变换。而另一种办法则是换一个损失函数。如Huber损失
,Log-Cosh损失
,分位数损失
。也有些时候可以将利用MAE与MSE训练出的模型进行融合。
ROC曲线经常作为评估二值分类器最重要的指标之一。全称是Receiver Operating Characteristic Curve的简称,ROC曲线的横坐标为假阳性率(False Positive Rate, FPR);纵坐标为真阳性率(True Positive Rate, TPR)。计算公式为:
F
P
R
=
F
P
N
FPR=\frac{FP}{N}
FPR=NFP
T
P
R
=
T
P
P
TPR=\frac{TP}{P}
TPR=PTP
其中,P是真实的正样本的数量,N是真实的负样本的数量,TP是P个正样本中被分类器预测为正样本的个数,FP是N个负样本中被分类器预测为正样本的个数。
如何绘制ROC曲线?
事实上,ROC曲线是通过不断移动分类器的“截断点“来生成曲线上的一组关键点的。”截断点“指的就是区分正负预测结果的阈值。
通过动态地调整截断点,从最高的得分开始(实际上是从正无穷开始,对应着ROC曲线的零点),逐渐调整到最低得分,每一个截断点都会对应一个FPR和TPR,在ROC图上绘制出每个截断点对应的位置,再连接所有点就得到最终的ROC曲线。
其实,还有一种更直观地绘制ROC曲线的方法。
这 ROC 曲线到底有什么用呢?简单来说,ROC 曲线是用来评估不同二分类算法的性能的。那该如何评估某两个分类算法的优劣呢?这就要用到另一个概念 AUC 了。
AUC
是 Area Under Curve 的简称,顾名思义,它表示的是“曲线下的面积”。这里的“曲线”就是前面提到的 ROC 曲线。AUC就是ROC曲线下的面积总和,该值能够量化反映分类算法的性能。
如何计算AUC?
计算 AUC 的值并不复杂,只需要沿着ROC曲线的横轴做积分(或累加求和)即可。通常,ROC曲线都位于
y
=
x
y=x
y=x这条线的上方(如果不是这样的,只需要把模型预测概率 P 反转成 1-P 能得到一个更好的分类器)。因此,AUC 的取值范围一般是
0.5
~
1
0.5~1
0.5~1。通常来说,AUC 越大表明分类器性能越好,因为它可以把真正的正类样本排在前面,降低误判率。
相比P-R曲线,ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。这个特点让ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能。
那么这有什么实际意义呢? 在很多实际问题中,正负样本数量往往很不均衡。比如,计算广告领域经常涉及转化率模型,正样本的数量往往是负样本数量的1/1000 甚至1/10000。若选择不同的测试集,P-R曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多,被广泛用于排序、推荐、广告等领域。
当然,如果研究者希望更多地看到模型在特定数据集上的表现,P-R曲线则能够更直观地反映其性能。