模型的评估有一套完整的方法论,对于有监督机器学习,通常进行特征工程计算后,会把数据分成训练集和测试集,训练集用于训练模型,模型生成后,通过模型对测试集中数据的特征进行预测,把预测得到的值与测试集中事先标记的数据标签一对比,就能判断模型的预测是否正确。在算法平台上,模型训练完成后系统会生成一份模型评估
1、 准确率、精确率、召回率、F1-score
准确率(Accuracy): 衡量所有样本被分类准确的比例
Accuracy=(TP+TN)/(TP+FP+TN+FN)
精确率(Precision): 也叫查准率,衡量正样本的分类准确率,就是说倍预测为正样本的样本有多少是真的正样本。
Precision=TP/(TP+FP)
召回率(Recall): 表示分类正确的正样本占总的分类正确样本的比例
Recall=TP/(TP+FN)
F1-score: 精确率和召回率的调和平均
2F/1=1/P+1/R⟹F1=2PR/(P+R)=2TP/(2TP+FP+TN)
可以看到,在上式里我们认为精确率和召回率是一样重要的(他们的权重一样),当我们的评估更加注重精确率或者召回率的时候,该怎么处理呢?
我们引入 Fβ ,对于任意的非负值 β,我们定义
Fβ=(β^2+1)⋅PR/(β^2⋅P+R )
可以看到,我们可以通过调整 β来帮助我们更好地评估结果。
最好的分类器当然是准确率、精确率,召回率都为1,但实际场景中几乎是不可能的,而且精确率和召回率往往会相互影响,一个高了另一个会有所下降,因此在实际应用中要根据具体需求做适当平衡。
2、ROC、AUC
ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣,ROC曲线横坐标是FPR(False Positive Rate),纵坐标是TPR(True Positive Rate)
FPR=FP(FP+TN),TPR=TP/(TP+FN)
接下来我们考虑ROC曲线图中的四个点和一条线。第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false positive)=0。Wow,这是一个完美的分类器,它将所有的样本都正确分类。第二个点,(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。类似的,第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好。
2.1 如何画ROC曲线
对于一个特定的分类器和测试数据集,显然只能得到一组FPR和TPR结果,而要得到一个曲线,我们实际上需要一系列FPR和TPR的值,这又是如何得到的呢?我们先来看一下wikipedia上对ROC曲线的定义
ROC曲线是由一系列因区分阈值变化产生的点,用于描述二分类模型的判断能力
这里的关键在于 “its discrimination threshold is varied” ,因为对于一个二分类模型,它的输出结果其实是判断这个样本属于正样本的概率值,假如我们已经得到了所有样本的概率输出(属于正样本的概率),现在的问题是如何改变“discrimination threashold”?我们根据每个测试样本属于正样本的概率值从大到小排序。下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率然后我们按照样本的score值,从大到小依次作为阈值,当样本score值大于等于阈值时则判定为正样本,否则为负样本。
例如第一个阈值取0.9,这时只有id=1的样本被预测为正样本,其余都是负样本,此时TPR=1/1+9=0.1, FPR=0/0+10=0,
当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。
2.2 计算AUC值
AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好.
可以看到AUC应该理解为对随机取出一个正样本和一个负样本,模型预测正样本为正样本的概率大于预测负样本为正样本的概率的概率值。
可能不太好理解这句话,那我们还是用上面的例子来说明,假设二分类模型A要找到所有正样本,对20个样本的预测概率根据概率值大小得到一个排序,我们希望有尽可能多的正样本排在负样本前面,最好的模型当然是所有的正样本都排在负样本前,但这种分类器要不就是过拟合要不就不存在,当有越多正样本排在负样本前的时候,我们得到的ROC曲线上的点的分布会越靠近y轴(FPR=0)和y=1(TPR=1)这两条线,显然这时候曲线下的面积值(AUC) 会越接近于1,这个时候我们再看上面对AUC的理解这句话,随机取出一个正样本和一个负样本,
如果auc值大,当然会有更多的正样本被更大概率预测准确,负样本被预测为正样本的概率也会越小。
2.3 为什么要用ROC曲线
因为ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。
将测试集中负样本的数量增加到原来的10倍后,ROC曲线基本保持原貌,而Precision-Recall曲线则变化较大。
评价指标是机器学习任务中非常重要的一环。不同的机器学习任务, 如分类(classification)、回归(regression)、排序(ranking)、聚类(clustering)、主题模型(topic modeling),有着不同的评价指标。而有些指标可以对多种不同的机器学习模型进行评价,如精确率-召回率(precision-recall),可以用在分类、推荐、排序等任务中。机器学习应用的很大一类是监督式机器学习,像分类、回归、排序。因此本报告的重点是介绍监督式机器学习的一些评价指标。
分类的评估指标
分类是指对给定的数据项预测该数据所属的类别。在二元分类中,结果包括两个类别。在多元分类中,结果是两个以上的类别。这里我将主要关注二元分类,但是所有的评估参数都可以被用于多元分类。
二元分类的一个例子便是垃圾邮件检测。分类器的输入可以包括邮件的文字内容以及元数据(比如发件人、发送时间等),而输出则是一个标签,表明邮件是“垃圾”还是“正常”,如图2-1所示。有时也用一些更一般的名称来定义这两个类,如“负"(negative)与“正”
(positive),或者“类1”和“类0”。
评估分类的好坏有很多指标。准确率、混淆矩阵、ROC曲线下面积是最常用的指标。
准确率(Accuracy)
准确率是计算分类器做出正确分类的频度。它是指在分类中,使用测试集对模型进行分类,分类正确的记录个数占总记录个数的比例。
准确率=正确分类的个数/总记录的个数
混淆矩阵(Confusion Matrix)
准确率看起来非常简单。然而,准确率没有对不同类别进行区分,即其平等对待每个类别的正确结果。但是这种评价有时是不够的,比如有时要看类别0与类别1下分类错误的各自个数。因为不同类别下分类错误的代价不同,或者某一个类别下的样本远多于另外一个类别。例如在疾病诊断中,医生诊断成患有癌症而实际上却未患癌症(即假正,False Positive),与诊断成未患有癌症而实际上却患有癌症(假负,False Negative)的这两种情况的结果会截然不同。混淆矩阵(或叫混淆表) 是对分类的结果进行详细描述的一个表。列出了每一个类别下面分类结果正确和错误的数值。矩阵的行对应着真正的分类事实。矩阵的列里面对应的是分类器分的结果。
平均类准确率(Per-class Accuracy)
准确率的一个变形是平均类准确率,即计算每个类别下的准确率,然后再计算它们的平均值。准确率是宏观平均,而平均类准确率则是一个微观的平均。在上述的例子里,平均准确率为(80%+97.5%)/2=88.75%。这和准确率值(91.7%)的区别还是很大的。
通常情况下,当每个类别下类别的样本个数不一样,则平均准确率不等于准确率(有兴趣的读者可以自己证明一下)。为什么这点会重要?当某一个类别下的样本远多于另外的类别,准确率会给出一个扭曲的结论,因为 数量多的那个类的结果会很强地影响准确率。这种情况下, 就应该检查一下每一类别的准确率和平均类准确率。
平均准确率也有自己的缺点,比如,如果某个类别的样本个数很少,那么可能造成该类的准确率的方差过大,意味着该类的准确率可靠性比其他类要差。使用平均类准确率就会遮盖了这个类的问题。
对数损失函数(Log-loss)
对数损失函数(Log-loss,或者全拼是Logarithmic loss)能对分类器的表现进行更细微的观察。尤其是如果分类输出输出不再是0或1,而是数值,即属于每个类别的概率,那么可以使用Log-loss对分类结果进行评价。这个概率可以理解为某样本对所属的的类别的置信度。
对数损失函数的美妙之处在于它和信息论紧密的关联。对数损失函数就是真实分类分布和分类器预测分布的交叉熵。它和相对熵,或者叫Kullback-Leibler散度,非常的相关。熵度量事物的不确定性。交叉熵结合了真实分类分布的熵,再加上当预测假定了一个不同的分布后带来的不确定性。所以对数损失函数是基于信息论对“额外噪声”的衡量,这个噪声是由于预测分类和真实分类不一致所产生的。通过最小化交叉熵,我们就可以最大化分类准确性。
AUC
AUC的全拼是Area under the Curve,即曲线下的面积。这里的曲线是指ROC曲线(Receiver Operating Characteristic Curve)。
ROC曲线不是一个数,它是一整条线。它能展现出分类器行为的细微变化,但同时也很难快速地比较出不同ROC曲线的好坏。在实际项目中,如果使用某些自动超参数调优的方法(第四章中会详细介绍)产生了不同的结果,那么就需要一个量化的指标来比较结果,而不是依赖于人工来看所产生的不同的ROC曲线。AUC就是其中一个量化ROC曲线的方法,它把ROC曲线转换成曲线下的面积这一数字,从而方便了自动比对。一个好的ROC曲线下面积应该很大(这样真正率会很快趋近于100%),而不好的ROC曲线下面积就比较小。因此AUC越大越好。
排序的评估指标
下面我们来看看排序的评估指标。但是在继续前,我们还是要再看一看分类的指标。因为排序所用的最主要的评估指标之一,精确度-召回率,也是非常流行的分类评估指标。
排序有些类似于分类。以互联网搜索为例,搜索引擎充当了排序器。用户输入一个(或多个)查询关键词,搜索引擎返回一系列它认为和用户的查询关键词相关连的网页,同时按照相关关系对这些网页进行排序。概念上来说,可以认为搜索引擎的第一步就是一个二元分类(与查询相关或者不相关),然后才是排序的过程来把最相关的放到列表的开始。在实际实现的时候,搜索引擎就不是简单的分类,而是给出一个数值型的相关度评分,然后再按照这个数字来进行排序(简单的情况下)。
另外一个排序问题的例子就是个性化推荐。推荐器或者是一个排序器,也可能是一个评分预测器。第一种情况下,输出就是对应于每个用户的一个排序过的推荐物品项的列表;而第二种情况下,推荐器需要返回一个用户—物品项的对应,每一对应都有一个预测的评分。这样就变成了一个回归的模型,后面会详细讨论。
精确率—召回率(Precision-Recall)
精确率—召回率其实是两个评价指标。但是它们一般都是同时使用。精确率回答这样的问题:“在排序器或者分类器给出的相关的返回集里,到底有多少是真正的相关项?”。而召回率则是回答“在所有真正相关的项里,排序器或者分类器找到了多少个?”
精确率和召回率的数学定义是:
精确率=回答正确的结果数/排序器返回集的总结果数召回率=回答正确的结果数/相关的项目总数
常见的情况是,我们只看排序器返回的那K个最前面的项,如K=5,
10,20,100等。精确率和召回率则会表示成精确率@k和召回率@k。
对于推荐的场景,则输入的查询关键词有多个,每个用户对应于所有的推荐项目就是一个关键词。对于每个用户,我们都可以给出一个精确率和召回率的平均,即平均精确率@k和平均召回率@k(这一点和准确率与平均类准确率的关系有些类似)
精确率—召回率曲线和F1值
改变排序器返回的答案的个数,即k值,相应的精确率—召回率也会发生改变。如果画一张图,精确率和召回率分别是x和y轴,而数值点是不同k的时候的精确率和召回率,则我们就得到了一条精确率—召回率曲线。这个曲线和ROC曲线是相关联的(有兴趣的读者可以自己研究一下,精确率和假正率的关系是什么?和召回率的关系是什么?)
如ROC曲线一下,比较不同的精确率—召回率曲线也是很困难的。因此也需要一个数字的度量来表征精确率—召回率曲线中某个固定值, F1值就是其中之一。F1值是精确率和召回率的调和平均值。
F1=2×(精确率×召回率)/(精确率+召回率)
与算术平均值不同,调和平均值受两个变量里小的那个影响更大。因此精确率或召回率中的某一个比较小,则F1值也会小。
归一化折损累积增益(NDCG)
在精确率与召回率中,返回集中每个项目的地位(权值)是一样,即位置k处的项目与位置1处的项目地位一样。但用户对返回结果的理解却不是这样。对于搜索引擎给出的排序结果,最前面的答案会远比排在后面的答案重要。
归一化折损累积增益(NDCG,Normalized Discounted Cumulative G a i n) 便考虑了这种情况。N D C C包含了3 个递进的指标: 累积增益(CG,Cumulative Gain),折损累积增益(DCG,Discounted Cumulative Gain),进而得到归一化折损累积增益。CG是对排序返回的最前面k个项目的相关性得分求和,而DCG在每个项目的得分乘上一个权值,该权值与位置成反关系,即位置越靠前,权值越大。NDCG则对每项的带权值得分先进行归一化(把每个项目的得分除以最好的那个项目的得分),这样得分总是落在0.0和1.0之间。维基百科上的相关文章有更详细的数学公式。
DCG或NDCG在信息检索中或者那些对项目的返回位置关心的模型方法找中用的比较多。
回归的评估指标
回归模型的输出不是分类的标签,而是一个连续型的数值。例如使用某公司的历史股票价格和市场的一些信息来预测未来的股票价格,这就是一个回归模型的任务。另外一个例子就是在个性化推荐中,对于某个用户对某个项目,给出具体的评分值(因此推荐器可以相应的对排序进行优化)。
平方根误差(RMSE)
最常用的回归评估指标就是平方根误差(RMSE,Root Mean Square Error,也叫RMSD,Root Mean Square Deviation)。它计算所有的预测值和真实值偏差的平方之和的均值,再求平方根。
平均绝对百分比误差(MAPE)
对每个预测值如下计算 MAPE:
预测值与历史实际值进行比较。
该差计算为实际值的百分比。即误差。
取该误差的绝对值,使负值取正。
区间范围的 MAPE(平均绝对百分比误差)是观测到的所有值的 MAPE 的均值,是模型的质量指标。MAPE 为零表示完美模型,MAPE 大于 1 则表示劣质模型。例如,MAPE 为 0.12 表示预测误差为 12%。即平均来算,88% 的预测值可以由模型解释。
“几乎正确”的预测
可能最容易理解的指标就是预测值与真实值的误差小于X%的比例,这里X的大小可以根据实际问题来决定。比如计算和真实值之差小于10% 的数据比例,就可以先找出|(yi- i)/yi)|<0.1的样本的数量,然后求它们在总体中的百分比即可。这个指标给出了回归模型预测精度的一个定义。
注意:训练指标和评估指标的区别
有时,模型训练的过程所使用的评估指标(也叫做损失函数)和真正评估时使用的指标不一样。这可能会发生在我们把一个设计用来做A事情的模型去解决B问题时。例如,对于个性化推荐器,我们可能是通过最小化预测值与真实值的比率来训练的,但却被用来生成推荐的排序列表。这就不是一个最优的结果,让模型去做它不擅长的事情。尽量避免这种情况!最好是用评估的指标来训练和优化模型。不过有些特定的评估指标则不容易这样做(如直接优化AUC就非常困难)。建议总是去找恰当的评估指标,并直接用于模型的训练和优化。
注意:偏态的数据集—类别不均衡、异常值和罕见值
写下评估指标的公式很容易,但是如何去解释指标在实际数据里的意义就不容易了。纸上得来终觉浅,绝知此事要躬行!
需要时刻谨记的是数据的分布是什么样的,以及这会对评估指标产生什么样的影响,尤其是要检查数据的偏态的情况。这里所说的偏态是指的一种类别的数据远少于其他的类别,或者存在过多的异常值,而这些异常值会大幅度地改变评估指标的值。
前文里,我们已经看到了类别不均衡所造成的一个坑,它会影响每类准确率。这是数据偏态的一个例子,即某个分类的样本相对于其他分类而言太少了。这不仅仅对每类准确率有影响,对于所有的把数据样本同等对待的评估而言,这种数据偏态都会有影响。例如正类样本的数量仅占总样本的很少一点,比如1%,这在实际数据中也很常见,比如网页广告的点击率、推荐器所用的用户—项目交互训练数据、恶意软件检测等。这时,一个相当“傻”的基准分类器通过把所有的数据都标为“负”就能获得高达99%的准确率。而一个好的分类器的准确率应当远远高于99%。类似的,对于ROC曲线而言,真正重要的区域其实是曲线上的左上角。因此为了打败这个基准分类器,AUC值就必须非常的高才行。图2-4表明了这个坑。
任何给予每个类别里的样本同样权重的评估指标在处理类别不均衡的时候都会有问题。因为根据他们的定义,这些指标都会偏向于那些占据大多数的类别。同时,不仅在评估阶段会有问题,甚至模型本身的训练也会有问题。如果没有很好的处理类别不均衡,那么训练出来的分类器可能根本就不知道如何来预测那些罕见的类别。
数据的偏态对个性化推荐器也有影响。真实的用户—项目交互数据一般都是有很多用户,他们很少会对项目来打分。同时很多项目也基本没有被评分过。稀缺的(打过分的)用户和(有评分的)项目给推荐器带来了问题,包括模型训练和评估。当训练数据没有足够的有效样本,推荐器就无法学习用户的偏好,或者与罕见项目类似的项目。评估数据中缺乏有效的用户和项目样本则会对推荐器的性能评分很低,这样又进一步导致无法获得高质量的推荐器。
异常值是另外一类数据偏态。异常的大值会对回归模型造成很大的影响。例如,在百万首歌数据集(Million Song Dataset)中,用户对一首歌曲的评分为该用户听这首歌曲的次数。而最高的评分竟达到了
16000。如果回归模型对这一数据点的预测值出了问题,那么由这一个点所产生的误差就会几乎超过所有其他点产生的误差的总和。我们可以使用误差的中位数来减少这个异常点所带来的影响,从而增加鲁棒性。但是还是不能根本解决模型训练阶段的这个问题。有效的解决方案是对数据进行清洗,或者重新定义问题,从而使模型对于异常值不再敏感。
离线评估的方法:
保留部分数据做验证、交叉验证和自助法
上文讨论了各种评估指标,在开始本章之前,让我们再回顾一下图1-1 里所展示的机器学习的工作流程。我们依然是在原型产生阶段。这一阶段我们调整很多的东西,包括特征、模型的类别、训练方法等。首先我们先看一下模型的选择。
原型产生阶段:模型训练、验证和模型选择
我们每调整一些东西,就产生了一个新的模型。模型选择是指从多个备选模型中找到一个合适的模型去拟合数据。而这个过程基于验证的结果
(不是训练的结果)来完成的。图3-1展示了这个过程的一个简化版。
在图3-1里,超参数调优被解释成了一个控制训练过程的“元”过程。我们会在第四章里详细解释它的工作机制。这里需要记住的是,手头的历史数据集被分成了两个部分:训练数据和验证数据。模型验证的结果被反馈给了超参数调优器,来帮助后者进一步调整参数来训练模型。
这里的问题是:为什么需要分两个不同的数据集来评估模型?
在统计模型的领域里,所有的事情都被假定为平稳的,即它们是服从随机分布的。从随机的数据集学习出来的模型也被认为是随机的。并且这个学习的模型需要被一个随机的已观察到的数据集进行测试评估,因此测试结果也是随机的。为了确保公平性,需要使用一个与训练数据不同的数据集对模型进行验证,从而可以得到模型的泛化误差(即模型对新数据的泛化能力如何)。
在离线阶段,我们只有一套历史数据集合。那么如何去获得另一个独立的数据集呢?因此就需要一种机制去产生另一套数据集。我们可以保留一部分数据来作为验证集,或者使用重采样技术,如交叉验证和自助法。
保留部分数据做验证
保留部分数据做验证相对简单。假定所有数据样本都是互相独立和均匀分布的,我们只要简单地随机抽取一小部分数据做为验证数据即可。用其余大部分数据来训练模型,再用这个保留的小数据集来评估验证指标。
从计算角度来看,保留部分数据做验证编程实现起来简单,运行速度也快。它的缺点是缺乏统计特性。验证的结果是基于一个小的验证集,所以验证模型的泛化能力的可靠性较低。同时对于单个验证集,就没法计算出方差信息和置信区间。
如果已有数据集大到可以保留足够多的数据来确保可靠性的时候,就使用保留部分数据做验证的方法。
交叉验证
交叉验证是另外一种验证技术。它并不是唯一的验证技术,也不是超参数调优。所以小心别把这三个概念(模型验证、交叉验证和超参数调优)弄混淆了。交叉验证其实是产生训练数据集和验证数据集的方法。产生的数据可以为超参数调优所使用。同样,保留部分数据做验证和其他的验证技术也可以产生数据为超参数调优所用,同时计算角度来说更加便宜。
交叉验证方法有很多的变形。最常见的是k折交叉验证。它的过程是, 先将数据集划分成k个数据集(如图3-2所示)。对于每一种超参数, 依次使用其中的k-1个数据集来训练数据,并用保留的验证集来验证模型。模型的总体表现取所有k次验证的平均值。对于所有的超参数,重复这一过程。然后选者均值表现最好的那个超参数集来配置模型。
另外一种交叉验证的变形是留一个样本交叉验证(leave-one-out cross validation)。本质上这和k折交叉验证是一样的,即k就是数据集里的样本总数。
当数据集太小,以至于不能保留足够的数据做验证时,交叉验证就很有用了。
自助法(Bootstrap)和Jackknife方法
自助法是一种重采样技术,它通过对原有数据集进行重新采样来获得多个“新的”数据集。每个这样的新集可以用来估计参数。因为有多个数
据集,所以就可以得到多个估计,由此就可以得到估计的方差和置信区间。
自助法和交叉验证紧密相关。它的灵感是来自于另外一种重采样技术—Jackknife。Jackknife本质上和留一个样本交叉验证一样,即他们把数据分成k个数据集的动作是一个无放回重采样的过程。一旦某个数据样本被放到某个数据集,它就不能再被其他数据集所选择。
与之相反,自助法是有放回的重采样。给定数据集包含N个样本点,自助法随机地选取一个样本放入新的集合(bootstrapped dataset),然后把样本在放回去,再重复同样的采样过程。
为什么要把样本放回去?每一个样本都可以用一个真实的分布进行描述,但是这个真实的分布我们并不知道。我们只有一个数据集去代表该分布,即经验分布。自助法假设新的样本都是从该经验分布中得到的,即新的数据集应该服从这个经验分布。如果每次采样后不进行放回,那么这个经验分布会一直改变。因此需要样本放回去以保证经验分布不变。
很明显,用自助法产生的新数据集中,可能存在重复的数据点,并且可能会重复多次(如图3-2所示)。如果对包含N个样本的数据集随机重采样次,新产生的数据集里,唯一的样本点的比例是1-1/e≈63.2%。换一种说法就是,大约有2/3的样本会在新的数据集里,同时还有一些重复的样本。
使用自助法数据集来做验证的一种方法是使用其中的唯一的样本数据集来训练模型,用其余的样本来验证模型。这样效果和交叉验证的效果很类似。
注意:模型验证和测试的区别
到目前为止,我一直小心地不去使用“测试”这个词。这是因为模型验 证和模型测试是两个不同的步骤。让我花点时间解释一下这里的微妙区别。
原型产生阶段主要解决的是模型选择。这就要求对一个或多个备选模型用验证数据进行性能评估。当我们找到了一个满意的模型类型和超参数组合,原型产生阶段的最后一步是用整个已有的数据集(包括前面对模
型进行验证的验证集),按照满意的模型类型和最优的超参数组合,重新训练一个模型。这个最终的模型将会被部署到生产系统上去。
测试则是发生在原型产生阶段之后,或者是在生产系统上在行测试,或者是在检测分布漂移的离线环境里测试。
永远不要混淆了训练数据和评估数据。训练、验证和测试应该使用不同的数据集。如果验证或测试数据与训练数据有重叠,就会导致模型的泛化能力变差,会让你追悔莫及。
在不久之前的Image Net竞赛中曾传出了欺诈丑闻。一个参赛队伍通过大量的向测试过程发送模型来获得提升结果。本质上说,他们是在用不断地调优超参数来拟合测试数据。拟合特定的测试数据而获得的模型也许能帮你赢得一次竞赛,却无法产生真正的好的机器学习的模型或者带来科技进步。
总结
回顾总结一下离线评估和模型验证的重点:
模型产生阶段里,我们需要选择模型。这既包括超参数调优也包括训练模型。每个新的模型都必须通过它在独立的数据集上的表现来评估,这叫做模型验证。
交叉验证不同于超参数调优。交叉验证是一种生成训练数据集与验证数据集的机制。而超参数调优则是选择适合一个模型的最好的超参数的机制。它可以使用交叉验证来评估模型。
保留部分数据做验证是交叉验证的一个备选项。它使用简单,计算量也小。因此我建议只要数据足够,就是用保留部分数据做验证。
交叉验证对小数据集特别有用。
自助法是一种重采样技术。它和k折交叉验证的重采样技术很类似。两种方法都不仅可以评估模型的质量,还能够给出评估的方差和置信区间。
超参数调优
在机器学习领域,超参数调优是机器学习的“元”(meta)任务。这是我很喜欢的一个题目,因为超参数调优显得像是黑魔法而无法看透。本章将会详细的介绍超参数调优的内容:为什么超参数调优很难,以及有什么样的自动化的调优方法可以使用。
模型的参数与超参数的对比
首先让我们来定义什么是超参数,以及它与模型正常的参数有什么不同。
机器学习的模型本质上是一个数学公式。它代表了数据的不同方面的联系。例如:在线性回归模型中,使用一条线表示特征与目标之间的关系,数学公式为:
wTx = y
其中x是代表不同特征的向量。y是一个数值型变量, 代表了目标值
(即那些我们希望能预测的数量)。
这个模型假设特征与目标之间是线性关联的。w表示每个特征的权重向量,决定着这条线的斜率。它就是通常所说的模型的参数,是需要在训练阶段从数据中学习的。“训练模型”其实就是使用一种优化的过程来找到拟合数据的最优的模型参数。
另外的一套参数则是模型超参数,有时也叫做“微差别参数”。他们的值不是在模型训练阶段获得的。普通的线性回归是没有超参数的, 但是有些线性回归的变形是有的。比如岭回归(Ridge regression)和LASSO回归都会在线性模型上增加一个正则项,而这些正则项的权重就是“正则参数”。决策树模型也有超参数,如树的深度、叶子节点数等。支持向量(SVM)要有一个对应于分类错误的惩罚因子,而使用核函数的SVM需要为核函数设置超参数,比如RBF径向基函数的宽度等。
超参数有什么作用?
如正则化因子是来控制模型的能力,模型拟合数据的自由度(degrees of freedom)决定了模型的灵活度。合理的控制模型的能力能够有效地防止过拟合。过拟合一般会发生在当模型太过灵活以及训练模型的过程过于去匹配训练数据。过拟合会导致模型对新测试数据的预测精度低。因此合理的设置模型的超参数则非常重要。
另一种类型的超参数来自于模型训练的过程本身。模型训练是一个使损失函数(训练阶段的评估指标)最小化的过程,有很多的优化方法可以使用。这些优化方法本身又有参数需要设置。比如随机梯度降低(SGD,stochastic gradient descent)方法里面需要设定一个学习速率参数。另外, 有些优化方法需要一个收敛的阈值。比如随机森林(Random Forests)和自助提升决策树(Boosted decision trees)需要设置树的个数的参数(尽管这个可以归为正规化超参数)等。这些超参数需要被合理地设置以找到一个好的模型。
超参数调优的算法
概念上讲,与模型训练一样,超参数调优也是一个优化的任务。但是这两个任务的过程差别很大。模型训练时,备选的模型参数的好坏是可以用数学公式来表示的(一般叫损失函数)。但是调优超参数时,备选的超参数的好坏很难用一个数学公式来衡量,因为它们依赖于模型训练这个黑盒子的产出来判断。
这就是为什么超参数调优较为困难。直到几年之前,可用的调优方法还仅限于格搜索和随机搜索。在近几年中,自动调优的方法得到了广泛的关注,研究人员对这个问题进行了深入的探索,发表论文并提供了相关的工具。
格搜索
顾名思义,格搜索就是把超参数的可能取值划分成一个一个的格子区
间,然后按顺序去用每个网格内的值来进行调优,并找到最好的值。例如,假定决策树的叶子数目是一个超参数,则可以把数目划分成10、
20、30到100的格子。对于正规化因子,常用的格子区间是指数区间, 比如1e-5,1e-4,1e-3直到1。有时还需要去估计超参数的可能最大和最小值来确定格子的大小。因此有些时候,需要人工指定一个小区间(去划分格子),然后检查优化的方向是哪一端,再向那一端来扩大区间范围。这种方法叫人工格搜索。
格搜索的方法很简单,而且容易被并行化。从计算时间上来看,它是最昂贵的方法。但是如果能很好的并行化,整体的运行时间会很短。
随机搜索
我喜欢那种 丝最终逆袭的电影,更喜欢用简单的方法能取得意外效果的机器学习论文。那么伯格斯塔(Bergstra)和本吉奥(Bengio)的论文《Random Search for Hyper Parameter Optimization》就是这样的一篇。随机搜索是格搜索方法的一个变形。相比于遍历整个格空间的所有选择,随机搜索只对随机抽取的那些格进行评估。这使得随机搜索比格搜索的代价要低很多。因为随机搜索有可能会不去检查最优的超参数组合那个格子,这样就会找不到最优,所以很长时间内随机搜索都不受重视。但是这篇论文证明,在绝大多数情况下,随机搜索的表现和格搜索差不多。只要随机采样60个超参数格,就能够取得足够好的超参数组合。这背后其实是有一个简单的概率解释的。对任何有限的样本空间,随机采样60次中有至少一次能采样到前5%的最优格的最大可能概率是95%。这看起来可能很绕,不过很容易解释。对于前5%的最优格,我们做随机采样,然后观察采样点是否是来自于这5%内。每次采样都有5%的可能性会落在里面。如果我们独立采样n次。那么这n 次都没有落到最大5%中的概率是(1-0.05)n。所以至少有一次能够进入这5%的区间的概率就是1减去这个值。假定我们希望有至少95%的成功概率,那么找到最少采样次数的值就只需要求解下面的不等式中的n即可。
1-(1-0.05)n>0.95
求解可得n>=60。哈哈!
这个故事的寓意是,如果至少有5%的格点可以取得近似于最优解的超
参数组合,那么随机搜索60次就能够有很高的概率采样到这5%。这里的如果这个句话是很重要的。它需要或者格空间里近似于最优的那个区域够大,抑或格空间里有一个高密度的近似于最优的区域。前者比较常见,因为好的机器学习模型不应该对于超参数过于敏感,换句话说就是它的近似于最优的区域应该够大。
由于其极度的简单和意外的有效,随机搜索是我最喜欢的超参数调优的方法。和格搜索一样,并行化随机搜索是很简单的。但它需要的运行次数更少,而且绝大多数时候表现都不错。
智能超参数调优
更智能的调优方法是有的。不像这些比较“傻”的格搜索和随机搜索,智能超参数调优不容易并行化。它并不是去先产生所有可能的备选超参数组合,再挨个(并行地)进行评估。相反的,智能调优技术先挑选一小部分候选组合,评估他们,然后决定下一个要评估的候选组合。这就是一个序列化的处理过程,所以很少能并行化。智能化的目标是尽可能的少做评估,从而能从总体上节省调优的计算时间。鉴于此,如果你关注的是总体调优的时间,并且能够负担起并行化的开销,我建议你还是采用随机搜索的方法。
需要买家注意的是,智能化调优算法需要较多的计算时间来判断下一次采样的目标,有些算法会需要非常的多时间。因此这个方法对于那些内部的模型训练过程需要很长时间(相比于超参数调优而言)的建模才有意义。同时智能调优也会有自己的参数需要设置(超—超参数?)。有时,只有恰当地设置这些超—超参数才能保证智能调优的速度比随机搜索要快。
前面说过, 超参数调优之所以很难是因为没法用一个数学公式来定义出需要优化的函数( 这个需要优化的函数的技术词汇是“响应曲面”),从而无法获得其导数。相应的,目前可用的许多优化函数的工具,例如牛顿优化法、随机梯度降低法,都没有办法使用。
这里我重点介绍近年来出现的三种智能调优方法: 无导数优化(derivative-free optimization),贝叶斯优化( Bayesian optimization)和随机森林调优(random forest smart tuning)。
嵌套交叉校验
在结束本章之前,让我们从一个更高的层级来聊聊嵌套交叉验证,或是嵌套超参数调优(我暂且称之为元-元-训练任务)。
模型选择和超参数调优之间有一些细微的差别。模型选择不仅包括为某个特定的模型族(例如,决策树的高度)调优参数,还包括选择不同的模型族(例如,我是应该使用决策树还是线性支持向量机?)。某些先进的超参数调优方法宣称可以适用于不同的模型族。但大部分情况下,都不建议这么做。对应于不同的模型族的超参数相互之间的重叠部分很少,所以最好不要交叉混用。
在不同的模型族中做选择,这又给我们的原型产生的蛋糕加上了一层。还记得之前强调的不要混用训练数据集和评估数据集。这意味着现在我们必须单独再为超参数调优器准备验证数据(或者是做交叉验证)。
一. 模型评估结论
系统会根据模型的AUC值得出以下结论:
AUC值为[0, 0.5):模型基本不可用,预测的准确度比随机抛硬币的结果还差,还不如拿个硬币来做预测,不建议使用这个模型。
AUC值为[0.5, 0.6):模型预测的准确度很低,只比随机抛硬币的结果好一点,建议不要使用这个模型。导致这种结果,可能是样本数据不够有代表性,预处理中漏过了某些脏数据,特征之间存在很强的相关性,或算法参数不在合理的范围内。
AUC值为[0.6, 0.7):模型预测的准确度还行,不太建议在业务中使用,可能是样本数据不够有代表性,预处理中漏过了某些脏数据,特征之间存在很强的相关性,或算法参数不在合理的范围内。
AUC值为[0.7, 0.8):模型预测的准确度还不错,但有改进空间,建议您回顾数据预处理、特征工程、算法参数的配置,调整参数,重新训练,可能有惊喜。
AUC值为[0.8, 0.9):模型预测的准确度很好,基本能满足业务场景的需求,建议您使用这个模型。
AUC值为[0.9, 1]:模型预测的准确度非常高,很好的诠释了数据中的规律,推荐在您的业务中使用这个模型。
二. ROC曲线和AUC值
1.AUC值
Area Under Curve,指ROC曲线下与坐标轴围成的面积,是分类算法预测为正的概率大于预测为负的概率的概率值,AUC值一定是[0,1],数值越接近1说明模型的效果越好。
2.ROC曲线
模型对测试集中数据的特征进行预测会得到一组(TPR,FPR),然后由点(TPR,FPR)组成的曲线就是ROC曲线。具体如下,
预测值为正例,记为P(Positive)
预测值为反例,记为N(Negative)
预测值与真实值相同,记为T(True)
预测值与真实值相反,记为F(False)
TP:预测类别是P,真实类别也是P
FP:预测类别是P,真实类别是N
TN:预测类别是N,真实类别也是N
FN:预测类别是N,真实类别是P
TPR(True Positive Rate):3,真实的正例中被预测正确的比例
FPR(False Positive Rate):4,真实的反例中被预测正确的比例
三. 混淆矩阵
混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。混淆矩阵的每一列代表了预测类别,每一列的总数表示预测为该类别的数据的数目;每一行代表了数据的真实归属类别,每一行的数据总数表示该类别的数据实例的数目。每一列中的数值表示真实数据被预测为该类的数目:如下图,
第一行第一列中的19723表示有19723个实际被点击的case同时被模型也预测为被点击;
第一行第二列的14706表示有14706个实际被点击的case但是被模型错误预测为未点击;
第二行第一列中的7978表示有7978个实际未点击的case但是被模型错误预测为被点击;
第二行第二列中的44393表示有44393个实际未点击的case同时被模型也预测为未点击。
四. 特征权重
特征权重用来衡量特征的重要性,是根据模型评估出的结果,权重值越高,代表该特征越重要,该功能亦可帮助算法工程师判断某个新增特征是否有效。