假设我们为了某个学习问题需要从若干模型中选出最优模型,比如在多项式回归模型hθ(x) = g(θ0+θ1x+...+θkxk)中,我们应该如何选择合适的k值使得模型的偏差方差达成平衡?又比如在局部加权线性回归问题中,我们应该如何选择合适的波长参数τ使得模型的拟合效果最好呢?
将上述问题给出形式化定义:假设我们有一个有限的模型集合M = {M1, ..., Md},我们应该选择哪个模型Mi作为最优模型呢?
交叉验证
假设训练集用S表示,考虑到上一讲的经验风险最小化(ERM),我们可能会得出这样的一种算法:
- 使用S训练每一个Mi,获得对应的假设函数hi
- 选择训练误差最小的假设函数
很遗憾,这个算法是不可行的。比如在多项式回归问题中,使用越高阶的多项式,拟合的效果越好,因而训练误差越小。但是在上一讲中我们也说明过这样的选择会有很大的方差,实际上是一种过拟合。
下面我们对这个算法进行改进,这个算法叫做简单交叉验证(hold-out cross validation)。该算法描述如下:
- 将训练集随机分为两部分,比如选择70%的数据作为Strain,剩下的30%数据作为Scv
- 使用Strain训练每一个Mi,获得对应的假设函数hi
- 在Scv上测试每一个hi,计算相应的训练误差εˆScv(hi),并选择训练误差最小的假设函数
由于我们是在Strain上训练的模型,并且在Scv上计算的训练误差,我们计算出的训练误差更接近于实际的泛化误差。通常用于测试的数据集Scv需要占到整个数据集的1/4到1/3之间,30%是典型值。
上述算法的第三步可以做一个改进,在选出最佳模型Mi后,再在全部数据集上做一次训练。通常这样做是很有效的,因为训练数据越多,模型参数越准确。
简单交叉验证算法的缺点是它“浪费”了30%的训练数据,尤其当训练数据本身就很稀少的情况下,去除了30%后剩下的就更少了。
下面的算法优化了数据的利用率,这个算法叫做k重交叉验证(k-fold cross validation)。该算法描述如下:
- 将训练集随机分为k个不相交的子集,记为S1, ..., Sk
- 对每一个Mi,对每一个j=1, ..., k,使用集合S1, ..., Sj-1, Sj+1, ..., Sk(也就是从训练集中去除Sj)进行训练,获得对应的假设函数hij,并在Sj上测试每一个hij,计算相应的训练误差εˆSj(hij),并选择训练误差最小的假设函数
Mi的近似泛化误差取所有εˆSj(hij)的平均值- 选择近似泛化误差最小的模型Mi,然后使用全部训练集S再做一次训练,获得对应的假设函数hi
上述算法通常取k = 10。当训练数据非常稀少时,我们可以选取k = m,这意味着每次只留下一份数据用于测试,用尽可能多的数据用于训练,这种方法也被称为留一交叉验证(leave-one-out cross validation)。上面两种算法有效地利用了数据集,但缺点是增加了更多计算的次数。
上面我们介绍了很多交叉验证的算法用于在多个模型中选择一个最佳模型,实际上也可以用于对单个模型进行评估。比如你发明了一个新的学习算法,可以通过交叉验证计算测试集的训练误差是否合理来评估算法预测的质量。
特征选择
模型选择的一个特殊并且重要的场景是特征选择(feature selection)。假设一个监督学习问题中的特征数n非常大,远远大于训练样本数m,但是我们怀疑其中只有一部分特征和学习问题相关,那么我们如何从中选择出我们希望的特征呢?
给定n个特征,我们可以有2n种可能的模型(每个特征要么出现在模型中,要么不出现在模型中)。这样我们就将特征选择问题转化为规模为2n的模型选择问题。但是这样的计算量太大了,因此我们需要用一些启发式搜索方法进行特征选择。下面的这个算法称为前向搜索(forward search):
- 初始化特征集合F为空
- 不断循环如下步骤,直到F的长度达到预设要求:
(a). 将i从1到n进行遍历,如果i不在F中,令Fi = F ∪ {i},然后用某种交叉验证算法计算Fi的误差
(b). 选择误差最小的Fi,并更新为F- 输出最佳特征集合F
上述算法属于封装模型特征选择(wrapper model feature selection)。前向搜索是指每次循环都是从剩余未被选中的特征中选出一个最好的特征加到特征集合中。与之相对的还有后向搜索(backward search),初始化特征集合F = {1, ..., n},每次循环都是从现有特征集合中选出一个最差的特征,然后将其从特征集合中移除,循环直到F的长度达到预设要求后才结束。
封装模型特征选择可以很好地工作,但是计算量比较大,时间复杂度达到了O(n2)。
过滤特征选择(filter feature selection)算法是另一个启发式搜索方法,拥有较低的计算复杂度。算法的主要思想是,对每一个特征xi,计算其与y的信息量S(i),S(i)越大说明xi与y的相关性越强。计算完所有的S(i)后,选择前k个拥有最大S(i)的特征即可。
在实际应用中,S(i)通常选择为xi和y的互信息(mutual information)MI(xi, y):
上述公式中的几个概率值都可以在训练集上计算得到。为了对这个公式有直观的感受,我们可以将互信息表示成KL散度(Kullback-Leibler (KL) divergence)的形式:
如果xi和y互相独立,那么p(xi, y) = p(xi)p(y),那么这两个概率分布的KL散度为0,因此xi和y是不相关的,对应的S(i)较小。相反地,如果xi和y的相关性越大,那么KL散度越大,对应的S(i)也较大。
还有一个细节需要注意,计算完所有的S(i)后,应该如何选择k值?一个标准做法是使用交叉验证法来选择k值,不过这次的时间复杂度是线性的。
贝叶斯统计与规则化
这一节我们再介绍一种可以减少过拟合发生的方法。
回顾之前我们在逻辑回归中使用了最大似然估计(maximum likelihood (ML))法来拟合参数,其公式为:
在上式中,我们把θ视为一个未知的常数,这一观点被认为是频率学派(frequentist)的观点。在频率学派的观点下,θ不是随机的,只是一个未知的变量,我们的任务就是通过某些方法估计出θ的值。
另一种看待θ的观点来自贝叶斯学派(Bayesian)。贝叶斯学派认为θ是随机的未知的变量,因而首先为θ指定一个先验概率(prior distribution)p(θ)。给定一个训练集S = {x(i), y(i)}i=1, ..., m,我们可以计算出θ的后验概率(posterior distribution):
上式中的p(y(i)|x(i), θ)的计算取决于我们使用的具体模型。比如在贝叶斯逻辑回归模型中,
对于一个新的输入x,我们可以用下面的公式进行预测:
如果我们要求期望值的话,可以用如下公式:
我们可以把上面步骤理解为“全贝叶斯预测”,因为我们在求后验概率时是对θ所有的值都计算了一遍,遗憾的是通常我们很难计算出这样的后验概率,因为对所有θ(通常是高维的)求积分是非常困难的。
因此,在实际应用中,我们需要对后验概率作一个近似估计,通常用单个θ的取值来替代整个后验概率。最大后验概率估计(maximum a posteriori(MAP))方法就采用了这个思想,其估计公式为:
可以发现,θMAP和θML的公式非常相似,除了在最大后验概率估计公式后面多了一项θ的先验概率。
在实际应用中,我们通常让θ服从高斯分布N(0,τ2I)。确定了这样的先验概率后,通常θMAP比θML的拟合效果更好,出现过拟合的概率更低。
总结
- 模型选择的常用方法是交叉验证,交叉验证具体又分为简单交叉验证、k重交叉验证和留一交叉验证等方法
- 特征选择的常用方法有封装模型特征选择和过滤特征选择。封装模型特征选择分为前向搜索和后向搜索,时间复杂度都为O(n2);过滤特征选择的时间复杂度为O(n)
- 在参数拟合问题上有频率学派和贝叶斯学派两种观点。频率学派认为θ是固定的未知的变量,使用最大似然估计法;贝叶斯学派认为θ是随机的未知的变量,使用最大后验概率估计法;最大后验概率估计法拟合出来的参数通常拟合效果更好,出现过拟合的概率更低
网友评论