模型选择
在机器学习中,有一种叫做“没有免费的午餐”的定理,即没有任何一种ML算法在处理所有问题的时候都适合。不同ML算法的性能很大程度上取决于数据的大小和结构。模型的预测能力通常也被称作模型的泛化能力,表示模型在新的、独立的测试数据上的预测能力。
可能不少人觉得此处获取较好模型是指模型评价,但是模型评价与模型选择是两个不同的概念,代表两个不同的阶段:
- 模型选择:根据一组不同复杂度的模型表现,即从某个模型空间中挑选最好的模型;
- 模型评价:选择一个(最好)模型后,在新的数据上来评价其预测误差等评价指标。
从定义看,两者的目标不同,模型评价是模型选择的后一步。换句话说,模型选择是在某个模型类中选择最好的模型,而模型评价对这个最好的模型进行评价。
模型评价可以比较多个模型类中的最佳模型,然后从中挑选出最佳模型,亦或者进行模型融合再进行评价。
随着机器学习普及,大家都有了 “训练 - 验证 - 评价” 的思维,这其实就是完整重现模型选择、模型评价的过程。如下图我们将数据集分成三个不相交的集合来做模型选择和模型评价:
- 训练集:获得模型及其训练误差,用来训练不同模型;
- 验证集:与训练集相对独立,获取训练模型在该集上的预测误差,用来做模型选择;
- 测试集:与训练集和验证集独立,获得真实的测试误差和其他模型评价指标,用来评价已选择出的模型。
使用训练集、验证集目的就是做模型选择,测试集自然是做模型评价。这三个集合的划分,并没有严格的准则,根据样本大小不同而做不同的选择,但是一个原则是测试集需要保持未知和与训练集、验证集的独立性。
I. 为什么需要模型选择
- 训练误差和测试误差的波动是由训练样本的变化带来的。在理想的实验条件下,为了能公正地衡量模型的预测能力,通常需要多换几组训练集和测试集来综合评价模型的预测能力,这样的结果才可能让人更信服模型的预测能力,而不是偶然结果。实际情况中,我们手边通常可能只有一个训练集,实际的需求是在此训练集上模型做到最好,即希望在当前训练集下获取最佳的预测能力。换句话说,很多时候人们给你一个训练集就希望你能够给他一个相对最稳定的预测模型,这个目标相对获取平均预测误差来说更难,后续模型选择方法比如 CV 法、bootstrap 法、Cp 法等其实都是估计测试误差的期望。
- 随着模型复杂度增加,训练误差波动降低,平均训练误差降低趋向于 0,而测试误差波动上升,平均测试误差先降低后升高。这个现象说明训练误差不能代替测试误差来作为模型选择和评价的手段。造成预测误差变化趋势的原因是什么?
- 用更通俗的话说,复杂的模型可能在训练集上拟合的很好,但是面对新的测试集,预测误差不降反升,发生了所谓的 “过拟合” 现象。如果一个模型在不同的测试集上测试结果不仅波动性大,而且预测误差也比较大,就要警惕发生了过拟合现象,此时不妨将模型的复杂度降低些(关于模型的复杂度含义下文会做更细致的说明),即使用变量更少的简单模型,比如线性模型。
- 过拟合的原因有很多,其中一个很可能的原因是,随着模型复杂度升高,对于训练数据刻画的很细,但是训练数据中可能某些特征仅出现过一次或者很少,信息不足,而测试集中该特征却出现了很多其他的值,虽然模型在训练集上刻画的足够细致,但是由于测试集的变动,模型反而往测试机上的迁移性能下降,训练误差变化并不正比于测试误差。
最标准的方法自然在训练集上训练模型,然后在验证集上获取预测误差,该误差也被称作“样本外(extra-sample)误差”,可真实反映出模型的样本外的预测能力,最后选择最小预测误差所对应的模型作为最佳模型即可。但通常而言,独立的验证集我们也没有,手头仅有的信息就是训练集,那么要想估计测试误差或者其期望曲线,就只能在训练集上做文章,一般而言可能仅有两种思路:
- 从训练集划分点数据出来形成验证集来近似测试误差;
- 只要对训练集进行合适的划分,我们就有可能近似出预测误差。但是对原始训练集划分为新的训练集和验证集,不同的划分比例可能使得新训练集与原训练集相差较大,进而使得差异很大,因此用这种划分的方式来估计条件期望形式的预测误差比较困难。那么此时我们可以不估计转为估计其期望,即平均预测误差,通过重复抽样的方式来多次估计预测误差,然后取其平均即可,这种方式我们可以称其为“重复抽样法”:通过训练集多次切分、抽样来模拟训练集、验证集,计算多个“样本外误差”,然后求其平均预测误差,这是一种密集计算型方法,比如交叉验证(Cross Validation)、自助法(bootstrap)等。
- 对训练误差进行某种转化来近似测试误差。
- 更加考虑计算效率,因为重复抽样需要计算多次估计,因此做一次模型选择可能需要花费不少时间,如果单单从训练集的训练误差就可以近似出测试误差,那么模型选择效率便会大大提高。这种方式以统计学中的 AIC、BIC 等为代表,深刻剖析训练误差与之前提到的 “样本内(in-sample)误差”、预测误差间的关系,给出了预测误差估计的解析式,因此第二种思路我们可以称之为 “解析法”。
II. 模型选择
对模型选择和模型评价的指导可以凝缩为一句话:根据已知的训练集和验证集在特定模型空间中进行模型选择,获取合适复杂度的模型,然后在多种模型空间做模型选择获取多种模型,最后的最优模型需要通过多个独立未知的测试集来做模型评价决定,否则很容易导致模型过拟合。(这实际上就是一个完整而规范的机器学习过程。)
从 “偏移 - 方差” 分解可以看到,在有限的模型空间中,对某个模型类控制好模型的复杂度非常重要,否则不容易获取较好(包含稳定与预测误差小两方面)的预测模型,这便是模型选择阶段的工作。
- 如果你的数据集是多个混合变量,那么你就不应该选择自动模型选择方法,因为你应该不想在同一时间把所有变量放在同一个模型中。
- 它也将取决于你的目的。可能会出现这样的情况,一个不太强大的模型与具有高度统计学意义的模型相比,更易于实现。
- 回归正则化方法(Lasso,Ridge和ElasticNet)在高维和数据集变量之间多重共线性情况下运行良好。
II.I. 评价指标
在模型选择阶段,比较适合于不同模型的优点,我们可以分析不同的指标参数,如统计意义的参数,R-square,Adjusted R-square,AIC,BIC以及误差项,另一个是Mallows’Cp准则。这个主要是通过将模型与所有可能的子模型进行对比(或谨慎选择他们),检查在你的模型中可能出现的偏差。常见的指标有 AIC 准则、BIC 准则、CV 值、结构风险上界等比较普适的准则。
而在模型评价阶段,我们可以根据分类、回归、排序等不同问题关心的问题选择不同的评价指标,多与模型选择时的损失不同:(1)分类:ROC、AUC、TPR、FPR、F1 score;(2)排序:DCG、NDCG;(3)回归:RMSE、MAE、Deviance。
根据具体业务,实际的评价指标有很多种,最好的方式当然是模型选择时即设计其损失函数即为评价指标,但是通常而言这些指标包含了某些非线性变化,优化起来难度颇大,因此实际模型选择仍是选用经典的那些损失函数,而模型评价则会与其略有不同。
一般而言模型选择准则有如下几种:
- 重复抽样与预测稳定性角度:CV、GCV、Boostrap。交叉验证 是评估预测模型最好方法。在这里,将你的数据集分成两份(一份做训练和一份做验证)。使用观测值和预测值之间的一个简单均方差来衡量你的预测精度。
- 似然与模型复杂度角度:AIC、AICc、BIC、EBIC
- VC 维与风险上界控制角度:SRM