您的位置:首页 > 其它

正规化和模型选择(Regularization and model selection)

2017-04-08 20:39 253 查看
对于某个学习问题,我们如何在几种不同的模型中进 行选择。例如,如果我们使用一个多项式回归模型hθ(x)=g(θ0+θ1x+θ2x2+…+θkxk),我们该如何决定多项式的最高阶数k以最优地平衡偏差和波动?与此类似,对于局部权重回归如何选择带宽参数τ,对于ℓ1正规化后的SVM算法怎么选择参数C的值?

为了具体化,这一节中我们假设有一个有限模型集M={M1,…,Md},我们在模型集中进行选择,Mi即代表第i个模型。

1 交叉验证

给定某个训练集后,根据经验风险最小化,我们可能会这样进行模型选择:

每个模型Mi都在训练集S上进行一次训练,得到假设hi;

选择训练误差最小的假设

这种算法并不能得到我们想要的结果。假设多项式回归,阶数越高训练误差就会越小。因此这种方法选出的往往是一个高波动高维度的多项式模型,会导致严重的过拟合。

下面这个算法表现会好很多,称为保留交叉验证或简单交叉验证,步骤如下:

随机将训练集分为两部分Strain和Scv,Strain占有70%的数据,Scv占有30%的数据。Scv称为保留交叉验证集。

每个模型Mi都在训练集Strain上进行一次训练,得到假设hi;

选择运行在交叉验证集上,误差ε^Scv(hi)最小的假设hi。

通过测试未训练的交叉验证集数据,我们可以更好地估计各个模型预测的真实泛化误差,选择泛化误差最小的模型。普遍而言,交叉验证集占总训练集的30%。

在保留交叉验证第三步之后,我们可以考虑将产生hi的模型在整个训练集S上再训练一次。一般而言这会更好,但对于一些对初始条件或数据很敏感的算法,以Strain作为训练集表现得好并不意味着用S作为训练集也会表现很好,对于这种情况我们只能放弃再训练这一步。

保留交叉验证最大的不足是它浪费了30%的数据。即使我们在最后再训练一次,这个算法依然只使用了70%的数据。在数据很丰富的时候这没什么,当数据很稀少的时候我们可能需要更好的办法。

我们引入另一种称为k次折叠交叉验证的方法,他每次的保留数据更少:

随机将S分为k个不相交的子集,这些子集设为S1,…,Sk。

对于每个模型Mi,我们这样对他们进行评估:

循环k次,将Mi在S1∪…∪Sj−1∪Sj+1∪…Sk上进行训练得到假设hij。

在假设hij上测试Sj,得到误差ε^Sj(hi)。

令每个模型Mi的估计泛化误差为ε^Sj(hi)的均值。

选择估计泛化误差最小的模型Mi,并在整个训练集上S再训练一次,得到的假设就是最后的答案。

一般设折叠次数k=10,这样每次数据的保留部分相比保留交叉验证大幅缩小了,当然由于要训练k次计算成本增加了。尽管k=10是普遍情形,在训练数据极端稀少的时候,我们也可以让k=m,即每次仅保留一个数据用以验证,这种方法称为留一交叉验证。

最后,尽管我们介绍了几种交叉验证的方法用以选择模型。实际用交叉验证来评估单个模型或算法的预测效果也很不错。

2 特征选择

在模型选择中有一种特殊且重要的部分叫特征选择。想象一下如果我们的监督式学习问题中特征数n的值非常大,但我们怀疑其中只有部分特征是和我们的学习目标相关的。即使使用简单线性分类器,假设类的VC维依然会有O(n),因此过拟合是一个大问题除非训练集非常大才能避免。

要解决这个问题,你可以使用特征选择算法减少特征数量。有n个特征就意味着有2n个特征子集,所以特征选择也可看成有2n个模型的模型选择问题。当n的值很大时,是无法通过枚举的方法准确地比较2n个模型的,所以一般会使用一些启发式搜索算法来寻找好的特征子集。下面这个搜索步骤称为前向搜索:

初始化令特征集F=∅;

重复 {

(a) 循环i次,如果i∉F,则让Fi=F∪{i},并使用交叉验证来评估特征Fi;

(b) 令F等于(a)中所有特征子集中最好那一个。



选择并输出整个搜索过程中表现最好的特征子集。

这个算法的外层循环,在F包含所有特征或达到你设定的阈值时停止。该算法是封装模型特征选择的实例化,它的每个步骤都在包装你的学习算法并评估不同的特征子集。除了前向搜索,还有其他的特征搜索算法,比如后向搜索算法,它从F={1,…,n}开始每次去掉一个特征,直到特征集为空。

过滤器特征选择是一个启发式的方法,只需很少的计算成本就能找到特征子集。它的核心是计算一些评分S(i),S(i)是每个特征xi对类标签y的影响的评分,最后挑选得分最高的k个特征组成特征子集。

一种选择使用xi和y之间的相关性来描述S(i)。实际中,我们一般(尤其在特征xi是离散值时)使用相互信息Mi(xi,y)作为S(i)评分:

Mi(xi,y)=∑xi∈{0,1}∑y∈{0,1}p(xi,y)logp(xi,y)p(xi)p(y).

这些概率p(xi,y),p(xi),p(y)都可以通过训练集上的经验分布来估计。为了让概率更直观,我们可以使用KL发散来刻画相互信息:

Mi(xi,y)=KL(p(xi,y)||p(xi)p(y))

你可能不清楚什么是KL发散,简要来说它描述p(xi,y)同p(xi)p(y)之间的差别有多大。当xi和y之间相关性很小时(即p(xi,y)=p(xi)p(y)),KL的值很小;反之,KL的值就会很大。最后一个需要注意的细节是我们如何选择最后的特征数k的值,标准方法是使用交叉验证的方法开寻找合适的k值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息