第二章 模型评估

1. 评估指标的局限性

问题1 准确率的局限性
准确率是指分类正确的样本占总样本的比例,即
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
准确率是分类问题中最简单最直观的评价指标,存在很大的缺陷。比如,如果数据类别非常不均衡,99%的样本都为负样本,那么分类器把所有样本都预测为负样本,仍然有99%的准确率,这显然不是我们想要的结果。

问题2 精确率和召回率的权衡

精确率是指分类正确的正样本个数占分类器判定为正样本的样本个数的比例。 召回率是指分类正确的正样本个数占真正的正样本个数的比例。即:

P = T P T P + F P P = \frac{TP}{TP+FP} P=TP+FPTP R = T P T P + F N R = \frac{TP}{TP+FN} R=TP+FNTP
一般来说,精确率高时,召回率往往偏低;而召回率高时,精确率往往偏低。

为了综合评估一个排序模型的好坏,要权衡精确率和召回率,最好绘制出模型的P-R(Precision-Recall)曲线。
P-R曲线的横轴是召回率,纵轴是精确率。对于一个排序模型来说,其P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到低移动而生成的。

若一个学习器的P-R曲线被另一个学习器的曲线完全包住,则可断言后者的性能优于前者。当两个曲线发生交叉时,就会比较麻烦,一个比较合理的判据是比较P-R曲线下的面积。但是,这个值不太容易估算,所以又有了以下性能度量标准。

  1. “平衡点”
    它是“精确率”==“召回率”时的取值
  2. F 1 s c o r e F1-score F1score
    F 1 = 2 × P × R P + R F1 = \frac{2\times P\times R}{P+R} F1=P+R2×P×R
  3. F β F_\beta Fβ
    F β = ( 1 + β 2 ) × P × R ( β 2 × P ) + R F_\beta = \frac{(1+\beta^2)\times P\times R}{(\beta^2\times P)+R} Fβ=(β2×P)+R(1+β2)×P×R
    F β F_\beta Fβ F 1 F1 F1相比,更能表达对精确率和召回率的不同偏好

问题3 平方根误差的“意外”
以原书的例题为例,

Hulu作为一家流媒体公司,拥有众多的美剧资源,预测每部美剧的流量趋势对于广告投放、用户增长都非常重要。我们希望构建一个回归模型来预测某部美剧的流量趋势,但无论采用哪种回归模型,得到的RMSE指标都非常高。然而事实是,模型在95%的时间区间内的预测误差都小于1%,取得了相当不错的预测结果。那么,造成RMSE指标居高不下的最可能的原因是什么?

RMSE经常被用来衡量回归模型的好坏。RMSE公式如下,
R M S E = <munderover> i = 1 n </munderover> ( y i <mover accent="true"> y i ^ </mover> ) 2 n RMSE=\sqrt{\frac{\sum^n_{i=1}(y_i-\hat{y_i})^2}{n}} RMSE=ni=1n(yiyi^)2
一般情况下,RMSE能够很好地反映回归模型预测值与真实值的偏离程度。但在实际问题中,如果存在个别偏离程度非常大的离群点(Outlier)时,即使离群点数量非常少,也会让RMSE指标变得很差。

原书例题中,模型在95%的时间区间内的预测误差都小于1%,这说明,在大部分时间区间内,模型的预测效果都是非常优秀的。然而,RMSE却一直很差,这很可能是由于在其他的5%时间区间内存在非常严重的离群点。事实上,在流量预估这个问题中,噪声点确实是很容易产生的,比如流量特别小的美剧、刚上映的美剧或者刚获奖的美剧,甚至一些相关社交媒体突发事件带来的流量,都可能会造成离群点。

针对这一问题,有以下几个解决方法。

  1. 认定这些离群点是“噪声点”,则可以在数据预处理阶段把噪声点过滤掉;
  2. 如果不认为这些离群点是“噪声点”,则需要进一步提高模型的预测能力,将离群点产生的机制建模进去;
  3. 找一个更合适的指标来评估模型,比如MAPE(Mean Absolute Percent Error),
    M A P E = <munderover> i = 1 n </munderover> y i <mover accent="true"> y i ^ </mover> y i × 100 n MAPE=\sum^n_{i=1}\left|\frac{y_i-\hat{y_i}}{y_i}\right|\times \frac{100}{n} MAPE=i=1nyiyiyi^×n100
    相比RMSE,MAPE相当于把每个点的误差进行了归一化,降低了个别离群点带来的绝对误差的影响。

2. ROC曲线

ROC曲线是Receiver Operating Characteristic Curve的简称,中文名为“受试者工作特征曲线”。ROC曲线源于军事领域,而后在医学领域应用甚广,“受试者工作特征曲线”这一名称也正是来自于医学领域。

ROC曲线的横坐标为假阳性率(False Positive Rate,FPR);纵坐标为真阳性率(True Positive Rate,TPR)。FPR和TPR的计算方法分别为
T P R = T P T P + F N TPR = \frac{TP}{TP+FN} TPR=TP+FNTP F P R = F P F P + T N FPR = \frac{FP}{FP+TN} FPR=FP+TNFP
问题1 如何绘制ROC曲线
ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的。

在二值分类问题中,模型的输出一般都是预测样本为正例的概率。假设测试集中有20个样本,表2.1是模型的输出结果。样本按照预测概率从高到低排序。在输出最终的正例、负例之前,我们需要指定一个阈值,预测概率大于该阈值的样本会被判为正例,小于该阈值的样本则会被判为负例。比如,指定阈值为0.9,那么只有第一个样本会被预测为正例,其他全部都是负例。上面所说的“截断点”指的就是区分正负预测结果的阈值。

通过动态地调整截断点,从最高的得分开始(实际上是从正无穷开始,对应着ROC曲线的零点),逐渐调整到最低得分,每一个截断点都会对应一个FPR和TPR,在ROC图上绘制出每个截断点对应的位置,再连接所有点就得到最终的ROC曲线。

问题2 如何计算AUC
AUC指的是ROC曲线下的面积大小,该值能够量化地反映基于ROC曲线衡量出的模型性能。
AUC可通过对ROC曲线下各部分的面积求和而得,
A U C = 1 2 <munderover> i = 1 m 1 </munderover> ( x i + 1 x i ) ( y i + y i + 1 ) AUC = \frac{1}{2}\sum^{m-1}_{i=1}(x_{i+1}-x_i)(y_i+y_{i+1}) AUC=21i=1m1(xi+1xi)(yi+yi+1)
AUC越大,说明分类器越可能把真正的正样本排在前面,分类性能越好。

问题3 ROC曲线相比P-R曲线有什么特点
相比P-R曲线,ROC曲线有一个特点,当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化。

这个特点让ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能。、在很多实际问题中,正负样本数量往往很不均衡。比如,计算广告领域经常涉及转化率模型,正样本的数量往往是负样本数量的1/1000甚至1/10000。若选择不同的测试集,P-R曲线的变化就会非常大,而ROC曲线则能够更加稳定地反映模型本身的好坏。所以,ROC曲线的适用场景更多,被广泛用于排序、推荐、广告等领域。但需要注意的是,选择P-R曲线还是ROC曲线是因实际问题而异的,如果研究者希望更多地看到模型在特定数据集上的表现,P-R曲线则能够更直观地反映其性能。

3. 余弦距离的应用

在机器学习问题中,通常将特征表示为向量的形式,所以在分析两个特征向量之间的相似性时,常使用余弦相似度来表示。余弦相似度的取值范围是[−1,1],相同的两个向量之间的相似度为1。如果希望得到类似于距离的表示,将1减去余弦相似度即为余弦距离。因此,余弦距离的取值范围为[0,2],相同的两个向量余弦距离为0。

问题1 什么场景使用余弦相似度而不是欧氏距离
余弦相似度:
c o s ( A , B ) = A B A 2 B 2 cos(A,B)=\frac{A\cdot B}{\lVert A \rVert_2\lVert B \rVert_2} cos(A,B)=A2B2AB
当一对文本相似度的长度差距很大、但内容相近时,如果使用词频或词向量作为特征,它们在特征空间中的的欧氏距离通常很大;而如果使用余弦相似度的话,它们之间的夹角可能很小,因而相似度高。此外,在文本、图像、视频等领域,研究的对象的特征维度往往很高,余弦相似度在高维情况下依然保持“相同时为1,正交时为0,相反时为−1”的性质,而欧氏距离的数值则受维度的影响,范围不固定,并且含义也比较模糊。

总体来说,欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。

问题2 余弦距离是否是一个严格定义的距离

距离的定义:在一个集合中,如果每一对元素均可唯一确定一个实数,使得三条距离公理(正定性,对称性,三角不等式)成立,则该实数可称为这对元素之间的距离。

余弦距离满足正定性和对称性,但是不满足三角不等式,因此不是严格定义的距离。证明如下,

  • 正定性
    d i s t ( A , B ) = 1 c o s θ = A 2 B 2 A B A 2 B 2 dist(A,B) = 1- cos\theta = \frac{\lVert A \rVert_2 \lVert B \rVert_2-AB}{\lVert A \rVert_2 \lVert B \rVert_2} dist(A,B)=1cosθ=A2B2A2B2AB
    因为 A 2 B 2 A B 0 \lVert A \rVert_2 \lVert B \rVert_2-AB \geqslant0 A2B2AB0,所以 d i s t ( A , B ) 0 dist(A,B)\geqslant0 dist(A,B)0恒成立。
  • 对称性
    d i s t ( A , B ) = A 2 B 2 A B A 2 B 2 = B 2 A 2 A B B 2 A 2 dist(A,B)=\frac{\lVert A \rVert_2 \lVert B \rVert_2-AB}{\lVert A \rVert_2 \lVert B \rVert_2}=\frac{\lVert B \rVert_2 \lVert A \rVert_2-AB}{\lVert B \rVert_2 \lVert A \rVert_2} dist(A,B)=A2B2A2B2AB=B2A2B2A2AB
  • 三角不等式
    假设有三个点 A ( 0 , 1 ) , B ( 1 , 1 ) , C ( 1 , 0 ) A(0,1),B(1,1),C(1,0) A(0,1),B(1,1),C(1,0)
    d i s t ( A , B ) = 1 2 2 dist(A,B)=1-\frac{\sqrt2}{2} dist(A,B)=122 , d i s t ( B , C ) = 1 2 2 dist(B,C) = 1-\frac{\sqrt2}{2} dist(B,C)=122 , d i s t ( A , C ) = 1 dist(A,C)=1 dist(A,C)=1,所以三角不等式不成立。

在机器学习领域,被俗称为距离,却不满足三条距离公理的不仅仅有余弦距离,还有KL距离(Kullback-Leibler Divergence),也叫作相对熵,它常用于计算两个分布之间的差异,但不满足对称性和三角不等式。

4. A/B测试的陷阱

问题1 在对模型进行过充分的离线评估之后,为什么还要进行在线A/B测试?
需要进行在线A/B测试的原因如下。

  1. 离线评估无法完全消除模型过拟合的影响,因此,得出的离线评估结果无法完全替代线上评估结果。
  2. 离线评估无法完全还原线上的工程环境。一般来讲,离线评估往往不会考虑线上环境的延迟、数据丢失、标签数据缺失等情况。因此,离线评估的结果是理想工程环境下的结果。
  3. 线上系统的某些商业指标在离线评估中无法计算。离线评估一般是针对模型本身进行评估,而与模型相关的其他指标,特别是商业指标,往往无法直接获得。比如,上线了新的推荐算法,离线评估往往关注的是ROC曲线、P-R曲线等的改进,而线上评估可以全面了解该推荐算法带来的用户点击率、留存时长、PV访问量等的变化。这些都要由A/B测试来进行全面的评估。

问题2 如何进行线上A/B测试
进行A/B测试的主要手段是进行用户分桶,即将用户分成实验组和对照组,对实验组的用户施以新模型,对对照组的用户施以旧模型。在分桶的过程中,要注意样本的独立性和采样方式的无偏性,确保同一个用户每次只能分到同一个桶中,在分桶过程中所选取的user_id需要是一个随机数,这样才能保证桶中的样本是无偏的。

5. 模型评估的方法

问题 有哪些常用验证方法,它们有什么优缺点

  • Holdout检验
    Holdout 检验是最简单也是最直接的验证方法,它将原始的样本集合随机划分成训练集和验证集两部分。比方说,对于一个点击率预测模型,我们把样本按照 70%~30% 的比例分成两部分,70% 的样本用于模型训练;30% 的样本用于模型验证,包括绘制ROC曲线、计算精确率和召回率等指标来评估模型性能。
    Holdout 检验的缺点很明显,即在验证集上计算出来的最后评估指标与原始分组有很大关系。为了消除随机性,研究者们引入了“交叉检验”的思想。
  • 交叉检验
    k-fold交叉验证:首先将全部样本划分成k个大小相等的样本子集;依次遍历这k个子集,每次把当前子集作为验证集,其余所有子集作为训练集,进行模型的训练和评估;最后把k次评估指标的平均值作为最终的评估指标。在实际实验中,k经常取10。
    留一验证:每次留下1个样本作为验证集,其余所有样本作为测试集。样本总数为n,依次对n个样本进行遍历,进行n次验证,再将评估指标求平均值得到最终的评估指标。在样本总数较多的情况下,留一验证法的时间开销极大。
    自助法
    不管是Holdout检验还是交叉检验,都是基于划分训练集和测试集的方法进行模型评估的。然而,当样本规模比较小时,将样本集进行划分会让训练集进一步减小,这可能会影响模型训练效果。
    自助法是基于自助采样法的检验方法。对于总数为n的样本集合,进行n次有放回的随机抽样,得到大小为n的训练集。n次采样过程中,有的样本会被重复采样,有的样本没有被抽出过,将这些没有被抽出的样本作为验证集,进行模型验证,这就是自助法的验证过程。

6. 超参数调优

问题 超参数有哪些调优方法

超参数搜索算法一般包括三个要素。一是目标函数,即算法需要最大化/最小化的目标;二是搜索范围,一般通过上限和下限来确定;三是算法的其他参数,如搜索步长。

  • 网格搜索
    网格搜索可能是最简单、应用最广泛的超参数搜索算法,它通过查找搜索范围内的所有的点来确定最优值。如果采用较大的搜索范围以及较小的步长,网格搜索有很大概率找到全局最优值。然而,这种搜索方案十分消耗计算资源和时间,特别是需要调优的超参数比较多的时候。因此,在实际应用中,网格搜索法一般会先使用较广的搜索范围和较大的步长,来寻找全局最优值可能的位置;然后会逐渐缩小搜索范围和步长,来寻找更精确的最优值。这种操作方案可以降低所需的时间和计算量,但由于目标函数一般是非凸的,所以很可能会错过全局最优值。
  • 随机搜索
    随机搜索的思想与网格搜索比较相似,只是不再测试上界和下界之间的所有值,而是在搜索范围中随机选取样本点。它的理论依据是,如果样本点集足够大,那么通过随机采样也能大概率地找到全局最优值,或其近似值。随机搜索一般会比网格搜索要快一些,但是和网格搜索的快速版一样,它的结果也是没法保证的。
  • 贝叶斯优化算法
    贝叶斯优化算法在寻找最优最值参数时,采用了与网格搜索、随机搜索完全不同的方法。网格搜索和随机搜索在测试一个新点时,会忽略前一个点的信息;而贝叶斯优化算法则充分利用了之前的信息。贝叶斯优化算法通过对目标函数形状进行学习,找到使目标函数向全局最优值提升的参数。具体来说,它学习目标函数形状的方法是,首先根据先验分布,假设一个搜集函数;然后,每一次使用新的采样点来测试目标函数时,利用这个信息来更新目标函数的先验分布;最后,算法测试由后验分布给出的全局最值最可能出现的位置的点。对于贝叶斯优化算法,有一个需要注意的地方,一旦找到了一个局部最优值,它会在该区域不断采样,所以很容易陷入局部最优值。为了弥补这个缺陷,贝叶斯优化算***在探索和利用之间找到一个平衡点,“探索”就是在还未取样的区域获取采样点;而“利用”则是根据后验分布在最可能出现全局最值的区域进行采样。

7. 过拟合与欠拟合

问题 常用的降低过拟合与欠拟合的方法
1))降低过拟合

  • 从数据入手,获得更多的训练数据。使用更多的训练数据是解决过拟合问题最有效的手段,因为更多的样本能够让模型学习到更多更有效的特征,减小噪声的影响。当然,直接增加实验数据一般是很困难的,但是可以通过一定的规则来扩充训练数据。比如,在图像分类的问题上,可以通过图像的平移、旋转、缩放等方式扩充数据;更进一步地,可以使用生成式对抗网络来合成大量的新训练数据。
  • 降低模型复杂度。在数据较少时,模型过于复杂是产生过拟合的主要因素,适当降低模型复杂度可以避免模型拟合过多的采样噪声。例如,在神经网络模型中减少网络层数、神经元个数等;在决策树模型中降低树的深度、进行剪枝等。
  • 正则化方法。给模型的参数加上一定的正则约束,比如将权值的大小加入到损失函数中。
  • 集成学习方法。集成学习是把多个模型集成在一起,来降低单一模型的过拟合风险,如Bagging方法。
  • Dropout。Dropout是指在深度网络的训练中,以一定的概率随机地 “临时丢弃”一部分神经元节点。具体来讲,Dropout作用于每份小批量训练数据,由于其随机丢弃部分神经元的机制,相当于每次迭代都在训练不同结构的神经网络。

2)降低欠拟合

  • 添加新特征。当特征不足或者现有特征与样本标签的相关性不强时,模型容易出现欠拟合。通过挖掘“上下文特征”“ID类特征”“组合特征”等新的特征,往往能够取得更好的效果。在深度学习潮流中,有很多模型可以帮助完成特征工程,如因子分解机、梯度提升决策树、Deep-crossing等都可以成为丰富特征的方法。
  • 增加模型复杂度。简单模型的学习能力较差,通过增加模型的复杂度可以使模型拥有更强的拟合能力。例如,在线性模型中添加高次项,在神经网络模型中增加网络层数或神经元个数等。
  • 减小正则化系数。正则化是用来防止过拟合的,但当模型出现欠拟合现象时,则需要有针对性地减小正则化系数。