【机器学习02】模型评估

一、评估指标的局限性 

“没有测量,就没有科学。”这是科学家门捷列夫的名言。在计算机科学特别是机器学习领域中,对模型的评估同样至关重要。只有选择与问题相匹配的评估方法,才能快速地发现模型选择或训练过程中出现的问题,迭代地对模型进行优化。模型评估主要分为离线评估和在线评估两个阶段。针对分类、排序、回归、序列预测等不同类型的机器学习问题,评估指标的选择也有所不同。知道每种评估指标的精确定义、有针对性地选择合适的评估指标、根据评估指标的反馈进行模型调整,这些都是机器学习在模型评估阶段的关键问题,也是一名合格的算法工程师应当具备的基本功。

在模型评估过程中,分类问题、排序问题、回归问题往往需要使用不同的指标进行评估。在诸多评估指标中,大部分指标只能片面地反映模型的一部分性能。如果不能合理地运用评估指标,不仅不能发现模型本身的问题,而且会得出错误的结论。

1.准确率的局限性

假设公司客户希望把产品定向投放给目标用户。而公司通过第三方渠道拿到一部分目标用户的数据,并以此为训练集和测试集,训练和测试目标用户的分类模型。该模型的分类准确率超过了95%,但在实际广告投放过程中,该模型还是把大部分广告投给了非目标用户。这可能是什么原因造成的?

在解答该问题之前,我们首先回顾一下分类准确率的定义。准确率是指分类正确的样本占总样本个数的比例,即

Accuracy=\frac{n_{correct}}{n_{total}}

其中,n_{correct}为被正确分类的样本个数,n_{total}为总样本个数。

准确率是分类问题中最简单,也是最直观的评价指标,但存在明显的缺陷。比如,当负样本占99%时,分类器把所有样本都预测为负样本也可以获得99%的准确率。所以当不同类别的样本比例非常不均衡时,占比大的类别往往称为影响准确率的最主要因素。

明确了这一点,这个问题也就迎刃而解了。第三方数据给的目标用户只占全体用户的一小部分,虽然模型的分类准确率高,但是不代表对目标用户整体的分类准确率也很高。在线上投放过程中,我们只会对模型判定的“目标用户”进行投放,因此,对目标用户判定的准确率不够高的问题就被放大了。为了解决这个问题,可以使用更为有效地平均准确率(每个类别下的样本准确率的算术平均)作为模型评估的指标。

事实上,这是一道比较开放的问题,可以根据遇到的问题一步步地排查原因。标准答案也不限于指标的选择,即使评估指标选择对了,仍会存在模型过拟合或欠拟合、测试集和训练集划分不合理、线下评估与线上测试的样本分布存在差异等一系列问题,但评估指标的选择是最容易被发现,也是最可能影响评估结果的因素。

2.精确率与召回率的权衡

假设公司提供视频的模糊搜索功能,搜索排序模型返回的Top5的精确率非常高,但在实际使用过程中,用户还是经常找不到想要的视频,特别是一些比较冷门的剧集,这可能是哪个环节出了问题呢?

要回答这个问题,首先明确两个概念,精确率和召回率。

  • 精确率(Precision)是指分类正确的正样本个数占分类器判定为正样本的样本个数的比例。
  • 召回率(Recall)是指分类正确的正样本个数占真正的正样本个数的比例

在排序问题中,通常没有一个确定的阈值把得到的结果直接判定为正样本或负样本,而是采用Top N返回结果的Precision值和Recall指来衡量排序模型的性能,即认为模型返回的Top N 的结果就是模型判定的正样本,然后计算前N个位置上的准确率Precision@N和前N个位置上的召回率Recall@N。

Precision值和Recall值是既矛盾又统一的两个指标,为了提高Precision值,分类器需要尽量在“更有把握”时才把样本预测为正样本,但此时往往会因为过于保守而漏掉很多“没有把握”的正样本,导致Recall值降低。

回到问题中来,模型返回的Precision@5的结果非常好,也就是说排序模型Top5的返回值的质量是很高的。但在实际应用过程中,用户为了找一些冷门的视频,往往会寻找排在较靠后位置的结果,甚至翻页去查找目标视频。但根据题目描述,用户经常找不到想要的视频,这说明模型没有把相关的视频都找出来呈现给用户。显然,问题出现在召回率上:如果相关结果有100个,即使Precision@5达到了100%,而Recall@5却仅仅只有5%。在模型评估时,我们是否应该同时关注Precision值和Recall值?是否应该选取更高阶的评估指标来更全面地反映模型在Precision值和Recall值两方面的表现?

答案都是肯定的,为了综合评估一个排序模型的好坏,不仅要看模型在不同Top N下的Precision@N和Recall@N,而且最好绘制出模型的P-R(Precision-Recall)曲线。这里简单介绍一下P-R曲线的绘制方法。

P-R曲线的横轴是召回率,纵轴是精确率。对于一个排序模型来说,其P-R曲线上的一个点代表着,在某一阈值下,模型将大于该阈值的结果判定为正样本,小于该阈值的结果判定为负样本,此时返回结果对应的召回率和精确率。整条P-R曲线是通过将阈值从高到低移动而生成的。图2.1是P-R曲线样例图,其中实线代表模型A的P-R曲线,虚线代表模型B的P-R曲线。原点附近代表当阈值最大时模型的精确率和召回率。

由图可见,当召回率接近于0时,模型A的精确率为0.9,模型B的精确率是1,这说明模型B得分前几位的样本全部是真正的正样本,而模型A即使得分最高的几个样本也存在预测错误的情况。并且,随着召回率的增加,精确率整体呈下降趋势。但是,当召回率为1时,模型A的精确率反而超过了模型B。这充分说明,只用某个点对应的精确率和召回率是不能全面地衡量模型的性能,只有通过P-R曲线的整体表现,才能够对模型进行更为全面的评估

除此之外,F1score和ROC曲线也能综合地反映一个排序模型的性能。F1score是精确率和召回率的调和平均值,它定义为

F1=\frac{2\times precision\times recall}{precision+recall}

3.平方根误差的意外

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

RMSE经常被用来衡量回归模型的好坏,但按照题目的叙述,RMSE这个指标却失效了。先看一下RMSE的计算公式为

RMSE=\sqrt{\frac{\sum\limits_{i=1}^n(y_i-\widehat y_i)^2}{n}}

其中,yi 是第 i 个样本点的真实值,\widehat y_i 是第 i 个样本点的预测值,n是样本点的个数。

一般情况下,RMSE能够很好地反映回归模型预测值与真实值的偏离程度。但在实际问题中,如果存在个别偏离程度非常大的利群点(Outlier)时,即使离群点数量非常少,也会让RMSE指标变得很差。

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

针对这个问题,有什么解决方案呢?可以从三个角度来思考。

第一,如果我们认定这些离群点是噪声点的话,就需要在数据预处理的阶段把这些噪声点过滤掉。

第二,如果不认为这些离群点是噪声点的话,就需要进一步提高模型的预测能力,将离群点产生的机制建模进去(这又是一个宏大的话题)。

第三,可以找一个更合适的指标来评估该模型。关于评估指标,其实是存在比RMSE的鲁棒性更好的指标,比如平均绝对百分比误差(Mean Absolute Percent Error, MAPE),它定义为

MAPE=\sum\limits_{i=1}^{n}|\frac{y_i-\widehat y_i}{y_i}|\times \frac{100}{n}

相比RMSE,MAPE相当于把每个点的误差进行了归一化,降低了个别离群点带来的绝对误差的影响。


总结:本文基于三个假想的实际应用场景和遇到的问题,说明了选择合适的评估指标的重要性。每个评估指标都有其价值,但如果只从单一的评估指标出发去评估模型,往往会得出片面甚至错误的结论;只有通过一组互补的指标去评估模型,才能更好地发现并解决模型存在的问题,从而更好地解决实际业务场景中遇到的问题。

二、ROC曲线

二值分类器(Binary Classifier)是机器学习领域中最常见也是应用最广泛的分类器。评价二值分类器的指标很多,比如precision、recall、F1 score、P-R曲线等。相比而言,ROC曲线有很多优点,经常作为评估而知分类器最重要的指标之一。下面我们来详细了解一下ROC曲线的绘制方法和特点。

1. 什么是ROC曲线?

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

ROC曲线的横坐标为假阳性率(False Positive Rate, FPR);纵坐标为真阳性率(True Positive Rate, TPR)。FPR和TPR的计算方法分别为

FPR=\frac{FP}{N}

TPR=\frac{TP}{P}

上式中,P是真正的正样本的数量,N是真实的负样本数量,TP是P个正样本中被分类器预测为正样本的个数,FP是N个负样本中被分类器预测为正样本的个数。

为了更直观地说明这个问题,我们举一个医院诊断病人的例子。假设有10为意思癌症患者,其中有3位很不幸确实患了癌症(P=3),另外7位不是癌症患者(N=7)。医院对这10位疑似患者做了诊断,判断出3位癌症患者,其中有2位确实是真正的患者(TP=2)。那么真阳性率TPR=TP/P=2/3. 对于7为非癌症的患者来说,有一位很不幸被误诊为癌症患者(FP=1),那么假阳性率FPR=FP/N=1/7. 对于“该医院”这个分类器来说,这组分类结果就对应ROC曲线上的一个点(1/7,2/3)。

2.如何绘制ROC曲线?

事实上,ROC曲线是通过不断移动分类器的“截断点”来生成曲线上的一组关键点的,通过下面的例子进一步来解释“截断点”的概念。

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

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

就此例来说,当截断点选择为正无穷时,模型把全部样本预测为负例,那么FP和TP必然都为0,FPR和TPR也都为0,因此曲线的第一个点的坐标就是(0,0)。当把截断点调整为0.9时,模型预测1号样本为正样本,并且该样本确实是正样本,因此,TP=1, 20个样本中,所有正例数量为P=10,故TPR=TP/P=1/10, 负样本总数N=10,故FPR=FP/N=0/10=0,对应ROC曲线上的点(0,0.1)。依次调整截断点,直到画出全部的关键点,再连接关键点即得到最终的ROC曲线,如图2.2所示。

 

其实,还有一种更直观地绘制ROC曲线的方法。首先,根据样本标签统计出正负样本的数量,假设正样本数量为P,负样本数量为N;接下来,把横轴的刻度间隔设置为1/N,纵轴的刻度间隔设置为1/P;再根据模型输出的预测概率对样本进行排序(从高到低);依次遍历样本,同时从零点开始绘制ROC曲线,每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,直到遍历完所有样本,曲线最终停在(1,1)这个点,整个ROC曲线绘制完成。

 3.如何计算AUC?

AUC指的是ROC曲线下的面积大小,该值能够量化地反映基于ROC曲线衡量出的模型性能。计算AUC值只需要沿着ROC横轴做dx积分就可以了。由于ROC曲线一般都处于y=x这条直线的上方(如果不是的话,只要把模型预测的概率反转成1-p就可以得到一个更好的分类器),所以AUC的取值一般在0.5-1之间。AUC越大,说明分类器越可能把真正的正样本排在前面,分类性能越好

4.ROC曲线相比P-R曲线有什么特点?

当正负样本的分布发生变化时,ROC曲线的形状能够基本保持不变,而P-R曲线的形状一般会发生较剧烈的变化

举例来说,图2.3是ROC曲线和P-R曲线的对比图,其中图2.3(a)和图2.3(c)是ROC曲线,图2.3(b)和图2.3(d)是P-R曲线,图2.3(c)和图2.3(d)则是将测试集中的负样本数量增加10倍之后的曲线图。

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

三、余弦距离的应用

其实在模型训练过程中,我们在不断地评估着样本间的距离,如何评估样本距离也是定义优化目标和训练方法的基础。

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

1.为什么在一些场景中要使用余弦相似度而不是欧氏距离

对于两个向量A和B,其余弦相似度定义为\cos (A,B)=\frac{A\cdot B}{||A||_{2}||B||_2},即两个向量夹角的余弦,关注的是向量之间的角度关系,并不关心它们的绝对大小,其取值范围是[-1,1]。当一对文本相似度的长度差距很大,但内容十分相近时,如果使用词频或词向量作为特征,它们在特征空间中的欧氏距离通常很大;而如果使用余弦相似度的话,它们之间的夹角可能很小,因而相似度高。此外,在文本、图像、视频等领域,研究的对象的特征维度往往很高,余弦相似度在高维情况下依然保持“相同时为1,正交时为0,相反时为-1”的性质,而欧氏距离的数值则受维度的影响,范围不固定,并且含义也比较模糊。

在一些场景,例如Word2Vec中,其向量的模长是经过归一化的,此时欧氏距离与余弦距离有着单调的关系,即

||A-B||_2=\sqrt{2(1-\cos(A,B))}

其中||A-B||_2表示欧氏距离,\cos(A,B)表示余弦相似度,(1-\cos(A,B))表示余弦距离。在此场景下,如果选择距离最小(相似度最大)的近邻,那么使用余弦相似度和欧式距离的结果是相同的。

总体来说,欧氏距离体现数值上的绝对差异,而余弦距离体现方向上的相对差异。例如,统计两部剧的用户观看行为,用户A的观看向量为(0,1),用户B为(1,0);此时二者的余弦距离很大,而欧氏距离很小;我们分析两个用户对于不同视频的偏好,更关注相对差异,显然应当使用余弦距离。而当我们分析用户活跃度,以登录次数(单位:次)和平均观看时长(单位:分钟)作为特征时,余弦距离会认为(1,10)、(10,100)两个用户距离很近;但显然这两个用户活跃度是有着极大差异的,此时我们更关注数值绝对差异,应当使用欧氏距离

特定的度量方法适用于什么样的问题,需要在学习和研究中多总结和思考,这样在遇到新的问题时也可以活学活用。

2.余弦距离是否是一个严格定义的距离?

该题主要考察对距离的定义的理解,以及简单的反证和推导。首先看距离的定义:在一个集合中,如果每一对元素均可唯一确定一个实数,使得三条距离公理(正定型、对称性、三角不等式)成立,则该实数可称为这对元素之间的距离。

余弦距离满足正定型和对称性,但是不满足三角不等式,因此他并不是严格定义的距离。具体来说,对于向量A和B,三条距离公理的证明过程如下。

  • 正定性

根据余弦距离的定义,有

\text{dist}(A,B)=1-\cos(\theta)=\frac{||A||_2||B||_2-AB}{||A||_2||B||_2}

考虑到 ||A||_2||B||_2-AB\geq0,因此有\text{dist}(A,B)\geq0恒成立。特别地,有

\text{dist}(A,B)=0 \Leftrightarrow ||A||_2||B||_2=AB\Leftrightarrow A=B

  • 对称性

根据余弦距离的定义,有

 \text{dist}(A,B)=\frac{||A||_2||B||_2-AB}{||A||_2||B||_2}=\frac{||B||_2||A||_2-AB}{||B||_2||A||_2}=\text{dist}(B,A)

因此余弦距离满足对称性。

  • 三角不等式

该性质并不成立,下面给出一个反例。给定一个A=(1,0),B=(1,1),C=(0,1),则有

 \text{dist}(A,B)=1-\frac{\sqrt 2}{2}

\text{dist}(B,C)=1-\frac{\sqrt 2}{2}

\text{dist}(A,C)=1

因此有

 \text{dist}(A,B)+\text{dist}(B,C)=2-\sqrt 2<1=\text{dist}(A,C)

其实从问题1中,我们也能够得出:单位圆上欧氏距离和余弦距离满足

||A-B||=\sqrt{2\text{dist}(A,B)}

即有如下关系

 \text{dist}(A,B)=\frac{1}{2}||A-B||^2

显然在单位圆上,余弦距离和欧氏距离的范围都是[0,2]。我们已知欧氏距离是一个合法的距离,而余弦距离与欧氏距离有二次关系,自然不满足三角不等式。具体来说,可以假设A与B、B与C非常近,其欧氏距离为极小量u;此时A、B、C虽然在圆弧上,但近似在一条直线上,所以A与C的欧氏距离接近于2u。因此,A与B、B与C的余弦距离为u^2/2;A与C的余弦距离接近于2u^2,大于A与B、B与C的余弦距离之和。

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

四、A/B测试的陷阱

互联网公司中,A/B测试是验证新模块、新功能、新产品是否有效;新算法、新模型的效果是否有提升;新设计是否受到用户欢迎;新更改是否影响用户体验的主要测试方法。在机器学习领域中,A/B测试是验证模型最终效果的主要手段。

1. 在对模型进行过充分的离线评估之后,为什么还要进行在线A/B测试?

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

2. 如何进行线上A/B测试?

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

3. 如何划分实验组和对照组?

H公司的算法工程师们最近针对系统中的“美国用户”研发了一套全新的视频推荐模型A,而目前正在使用的针对全体用户的推荐模型是B。在正式上线之前,工程师们希望通过A/B测试来验证新推荐模型的效果。下面有三种实验组和对照组的划分方法,请指出哪种划分方法是正确的?

  1. 根据user_id(user_id完全随机生成)个位数的奇偶性将用户划分为实验组和对照组,对实验组施以推荐模型A,对照组施以推荐模型B;
  2. 将user_id个位数为奇数且为美国用户的作为实验组,其余用户为对照组;
  3. 将user_id个位数为奇数且为美国用户的作为实验组,user_id个位数为偶数的用户作为对照组。

上述三种A/B测试的划分方法都不正确。我们用包含关系图来说明三种划分方法,如图2.4所示。

  • 方法1(见图2.4(a))没有区分是否为美国用户,实验组和对照组的实验结果均有稀释;
  • 方法2(见图2.4(b))的实验组选取无误,并将其余所有用户划分为对照组,导致对照组的结果被稀释;
  • 方法3(见图2.4(c))的对照组存在偏差。
  • 正确做法(见图2.4(d))是将所有美国用户根据user_id个位数划分为实验组和对照组,分别施以模型A和B,才能够验证模型A的效果。

五、Holdout、交叉检验、自助法

机器学习中,我们通常把样本分为训练集和测试集,训练集用于训练模型,测试集用于评估模型。在样本划分和模型验证的过程中,存在着不同的抽样方法和验证方法。

1. 在模型评估过程中,有哪些主要的验证方法,它们的优缺点是什么?

  • Holdout检验

Holdout检验是最简单也是最直接的验证方法,它将原始的样本集合随机划分成训练集和验证集两部分。比方说,对于一个点击率预测模型,我们把样本按照70%~30%的比例分成两部分,70%的样本用于模型训练;30%的样本用于模型验证,包括绘制ROC曲线、计算精确率和召回率等指标来评估模型性能。

Holdout检验的缺点很明显,即在验证集上计算出来的最后评估指标与原始分组有很大关系。为了消除随机性,研究者们引入了“交叉检验”的思想。

  • 交叉检验

k-fold交叉检验:首先将全部样本划分成k个大小相等的样本子集;依次遍历这k个子集,每次把当前子集作为验证集,其余所有子集作为训练集,进行模型的训练和评估;最后把k次评估指标的平均值作为最终的评估指标。在实际实验中,k经常取10.

留一验证:每次留下1个样本作为验证集,其余所有样本作为训练集。样本总数为n,依次对n个样本进行遍历,进行n次验证,再将评估指标求平均值得到最终的评估指标。在样本总数较多的情况下,留一验证法的时间开销极大。事实上,留一验证是留p验证的特例。留p验证是每次留下p个样本作为验证集,而从n个元素中选择p个元素有C_n^p种可能,因此它的时间开销更是远远高于留一验证,故而很少在实际工程中被应用。

  • 自助法

不管是Holdout检验还是交叉检验,都是基于划分训练集和验证集的方法进行模型评估的。然而,当样本规模比较小时,将样本集进行划分会让训练集进一步减小,这可能会影响模型训练效果。有没有能维持训练集样本规模的验证方法呢?自助法可以比较好地解决这个问题。

自助法是基于自助采样法的检验方法,对于总数为n的样本集合,进行n次有放回的随机抽样,得到大小为n的训练集。n次采样过程中,有的样本会被重复采样,有的样本没有被抽出过,将这些没有被抽出的样本作为验证集,进行模型验证,这就是自助法的验证过程。

2. 在自助法的采样过程中,对n个样本进行n次自主抽样,当n趋于无穷大时,最终有多少数据从未被选择过?

一个样本在一次抽样过程中未被抽中的概率为(1-\frac{1}{n}),n次抽样均为抽中的概率为(1-\frac{1}{n})^n。当n趋于无穷大时,概率为\lim\limits_{n\to \infty}(1-\frac{1}{n})^n=\frac{1}{e}\approx 0.368,因此,当样本数很大时,大约有36.8%的样本从未被选择过,可作为验证集

六、超参数调优

对于很多算法工程师来说,超参数调优是一件非常头疼的事情。除了根据经验设定所谓的“合理值”之外,一般很难找到合理的方法去寻找超参数的最优取值。而与此同时,超参数对于模型效果的影响又至关重要。有没有一些可行的办法去进行超参数的调优呢?

超参数有哪些调优方法?

为了进行超参数调优,我们一般会采用网格搜索、随机搜索、贝叶斯优化等算法。在具体介绍算法之前,需要明确超参数搜索算法一般包括哪几个要素。

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

1. 网格搜索

网格搜索可能是最简单、应用最广泛的超参数搜索算法,他通过查找搜索范围内的所有点来确定最优值。如果采用较大的搜索范围以及较小的步长,网格搜索有很大概率找到全局最优值。然而,这种搜索方案十分消耗计算资源和时间,特别是需要调优的超参数比较多的时候。因此,在实际应用中,网格搜索一般会先使用较广的搜索范围和较大的步长,来寻找全局最优值可能的位置;然后会逐渐缩小搜索范围和步长,来寻找更精确的最优值。这种操作方案可以降低所需的时间和计算量,但由于目标函数一般是非凸的,所以很可能会错过全局最优值

2. 随机搜索

随机搜索的思想与网格搜索比较相似,只是不再测试上界和下界之间的所有之,而是在搜索范围中随机选取样本点。它的理论依据是,如果样本点集足够大,那么通过随机采样也能大概率地找到全局最优值或其近似值。随机搜索一般会比网格搜索要快一些,但是和网格搜索的快速版一样。它的结果也是没法保证的。

3. 贝叶斯优化算法

贝叶斯优化算法在寻找最优最值参数时,采用了与网格搜索、随机搜索完全不同的方法。网格搜索和随机搜索在测试一个新点时,会忽略前一个点的信息;而贝叶斯优化算法则充分利用了之前的信息。贝叶斯优化算法通过对目标函数形状进行学习,找到使目标函数向全局最优值提升的参数。具体来说,它学习目标函数形状的方法是

  • 首先根据先验分布,假设一个搜集函数;
  • 然后,每一次使用新的采样点来测试目标函数时,利用这个信息来更新目标函数的先验分布。
  • 最后,算法测试由后验分布给出的全局最值最可能出现的位置的点。

对于贝叶斯优化算法,有一个需要注意的地方,一旦找到了一个局部最优值,它会在该区域不断采样,所以很容易陷入局部最优值。为了弥补这个缺陷,贝叶斯优化算法会在探索和利用之间找到一个平衡点,“探索”就是在还未取样的区域获取采样点;而“利用”则是根据后验分布在最可能出现全局最值的区域进行采样


代码实现

这些算法在Python中通常通过第三方库如scikit-learn、hyperopt和skopt等进行实现。以下是一些基本示例:

1. 网格搜索(Grid Search)使用scikit-learn:

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

param_grid = {'C': [0.1, 1, 10, 100, 1000], 
              'gamma': [1, 0.1, 0.01, 0.001, 0.0001],
              'kernel': ['rbf', 'poly', 'sigmoid']}

grid = GridSearchCV(SVC(), param_grid, refit=True, verbose=2)
grid.fit(X_train, y_train)

# 找到最佳参数
best_params = grid.best_params_

2. 随机搜索(Randomized Search)使用scikit-learn:

from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform

param_dist = {'C': uniform(0.1, 1000),
              'gamma': uniform(0.0001, 1),
              'kernel': ['rbf', 'poly', 'sigmoid']}

random_search = RandomizedSearchCV(SVC(), param_distributions=param_dist, n_iter=100, cv=5, verbose=2)
random_search.fit(X_train, y_train)

# 找到最佳参数
best_params = random_search.best_params_

3. 贝叶斯优化(Bayesian Optimization)使用hyperopt库:

from hyperopt import fmin, tpe, hp, STATUS_OK

space = {
    'C': hp.loguniform('C', -5, 5),
    'gamma': hp.loguniform('gamma', -8, 3),
    'kernel': hp.choice('kernel', ['rbf', 'poly', 'sigmoid'])
}

def objective(params):
    model = SVC(**params)
    score = cross_val_score(model, X_train, y_train, cv=5).mean()
    return{'loss': -score, 'status': STATUS_OK}

best = fmin(objective, space, algo=tpe.suggest, max_evals=100)

# 最佳参数
best_params = dict(best)

请注意,以上代码需要根据你的实际数据集X_train和y_train进行调整,并且假设你正在优化支持向量机(SVC)的参数。在贝叶斯优化中,你需要定义一个目标函数(objective function),这里我们用交叉验证得分作为目标。

七、过拟合与欠拟合

在模型评估与调整的过程中,我们往往会遇到“过拟合”或“欠拟合”的情况。如何有效地识别“过拟合”和“欠拟合”现象,并有针对性地进行模型调整,是不断改进机器学习模型的关键。特别是在实际项目中,采用多种方法、从多个角度降低“过拟合”和“欠拟合”的风险是算法工程师应当具备的领域知识。

1.在模型评估过程中,过拟合和欠拟合具体是指什么现象?

  • 过拟合是指模型对于训练数据拟合呈过当的情况,反映到评估指标上,就是模型在训练集上的表现很好,但在测试集和新数据上的表现较差。
  • 欠拟合指的是模型在训练和预测时表现都不好的情况。

图2.5形象地描述了过拟合和欠拟合的区别。

可以看出

  • 图2.5(a)是欠拟合的情况,拟合的黄线没有很好地捕捉到数据的特征,不能够很好地拟合数据。
  • 图2.5(c)则是过拟合的情况,模型过于复杂,把噪声数据的特征也学习到模型中,导致模型泛化能力下降,在后期应用过程中很容易输出错误的预测结果。

2.能否说出几种降低过拟合和欠拟合风险的方法?

  • 降低“过拟合”风险的方法

 (1)从数据入手,获得更多的训练数据。使用更多的训练数据是解决过拟合问题最有效的途径手段,因为更多的样本能够让模型学习到更多更有效的特征,减小噪声的影响。当然,直接增加实验数据一般是很困难的,但是可以通过一定的规则来扩充训练数据。比如在图像分类的问题上,可以通过图像的平移、旋转、缩放等方式扩充数据;更进一步地,可以使用生成式对抗网络来合成大量的新训练数据。

(2)降低模型复杂度。在数据较少时,模型过于复杂是产生过拟合的主要因素,适当降低模型复杂度可以避免模型拟合过多的采样噪声。例如在神经网络模型中减少网络层数、神经元个数等;在决策树模型中降低树的深度、进行剪枝等。

(3)正则化方法。给模型的参数加上一定的正则约束,比如将权值的大小加入到损失函数中。以L2正则化为例:

C=C_0+\frac{\lambda}{2n}\cdot \sum\limits_{i}w_i^2

这样,在优化原来的目标函数C0的同时,也能避免权值过大带来的过拟合风险。

(4)集成学习方法。集成学习是把多个模型集成在一起,来降低单一模型的过拟合风险,如Bagging方法。

  •  降低“欠拟合”风险的方法

(1)添加新特征。当特征不足或者现有特征与样本标签的相关性不强时,模型容易出现欠拟合。通过挖掘“上下文特征” “ID类特征” “组合特征”等新的特征,往往能够取得更好的效果。在深度学习潮流中,有很多模型可以帮助完成特征工程,如因子分解机、梯度提升决策树、Deep-crossing等都可以成为丰富特征的方法。

(2)增加模型复杂度。简单模型的学习能力较差,通过增加模型的复杂度可以使模型拥有更强的拟合能力。例如,在线性模型中添加高次项,在神经网络模型中增加网络层数或神经元个数等。

(3)减小正则化系数。正则化是用来防止过拟合的,担当模型出现欠拟合现象时,则需要有针对性地减小正则化系数。

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习模型的评估指标主要分为分类和回归两大类。在分类模型中,常用的评估指标包括混淆矩阵、准确率、错误率、精确率、召回率、F1 score、ROC曲线、AUC、PR曲线、对数损失和分类指标的文本报告。而在回归模型中,常用的评估指标包括平均绝对误差(MAE)、均方误差(MSE)、均方根误差(RMSE)、归一化均方根误差(NRMSE)和决定系数(R2)。\[3\] 其中,ROC曲线是一种常用的评估分类模型性能的指标,它独立于responders比例的变化,可以帮助我们了解模型在不同阈值下的表现。\[1\]而MAE(平均绝对误差)是一种常用的评估回归模型性能的指标,它衡量了预测值与真实值之间的平均绝对差异。\[2\] 综上所述,机器学习模型的评估指标根据不同的任务和模型类型选择不同的指标进行评估,以帮助我们了解模型的性能和效果。 #### 引用[.reference_title] - *1* [你知道这11个重要的机器学习模型评估指标吗?](https://blog.csdn.net/fendouaini/article/details/100013633)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [机器学习模型评估指标](https://blog.csdn.net/dfly_zx/article/details/123142984)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值