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

对于某个学习问题,我们如何在几种不同的模型中进 行选择。例如,如果我们使用一个多项式回归模型hθ(x)=g(θ0+θ1x+θ2x2++θkxk)h_\theta(x) = g(\theta_0 + \theta_1x + \theta_2x^2 + \ldots + \theta_kx^k),我们该如何决定多项式的最高阶数kk以最优地平衡偏差和波动?与此类似,对于局部权重回归如何选择带宽参数τ\tau,对于1\ell_1正规化后的SVM算法怎么选择参数CC的值?

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


1 交叉验证

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

  1. 每个模型MiM_i都在训练集SS上进行一次训练,得到假设hih_i
  2. 选择训练误差最小的假设

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

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

  1. 随机将训练集分为两部分StrainS_{train}ScvS_{cv}StrainS_{train}占有70%的数据,ScvS_{cv}占有30%的数据。ScvS_{cv}称为保留交叉验证集。
  2. 每个模型MiM_i都在训练集StrainS_{train}上进行一次训练,得到假设hih_i
  3. 选择运行在交叉验证集上,误差ε^Scv(hi)\hat{\varepsilon}_{S_{cv}}(h_i)最小的假设hih_i

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

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


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

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

  1. 随机将SS分为k个不相交的子集,这些子集设为S1,,SkS_1,\ldots,S_k
  2. 对于每个模型MiM_i,我们这样对他们进行评估:
    循环k次,将MiM_iS1Sj1Sj+1SkS_1 \cup \ldots \cup S_{j-1} \cup S_{j+1} \cup \ldots S_k上进行训练得到假设hijh_{ij}
    在假设hijh_{ij}上测试SjS_j,得到误差ε^Sj(hi)\hat{\varepsilon}_{S_{j}}(h_i)
    令每个模型MiM_i的估计泛化误差为ε^Sj(hi)\hat{\varepsilon}_{S_{j}}(h_i)的均值。
  3. 选择估计泛化误差最小的模型MiM_i,并在整个训练集上SS再训练一次,得到的假设就是最后的答案。

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

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


2 特征选择

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

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

  1. 初始化令特征集F=\mathcal{F} = \emptyset
  2. 重复 {
    (a) 循环i次,如果iFi \notin \mathcal{F},则让Fi=F{i}\mathcal{F}_i = \mathcal{F} \cup \{i\},并使用交叉验证来评估特征$\mathcal{F}_i (b); (b) 令\mathcal{F}$等于(a)中所有特征子集中最好那一个。
  3. 选择并输出整个搜索过程中表现最好的特征子集。

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


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

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

Mi(xi,y)=xi{0,1}y{0,1}p(xi,y)logp(xi,y)p(xi)p(y). M_i(x_i,y) = \sum_{x_i \in \{ 0,1 \}} \sum_{y \in \{ 0,1 \}} p(x_i,y)log \frac{p(x_i,y)}{p(x_i)p(y)}.

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

Mi(xi,y)=KL(p(xi,y)p(xi)p(y)) M_i(x_i,y) = \mathrm{KL}(p(x_i,y)||p(x_i)p(y))

你可能不清楚什么是KL散度,简要来说它描述p(xi,y)p(x_i,y)p(xi)p(y)p(x_i)p(y)之间的差别有多大。当xix_iyy之间相关性很小时(即p(xi,y)=p(xi)p(y)p(x_i,y) = p(x_i)p(y)),KL的值很小;反之,KL的值就会很大。最后一个需要注意的细节是我们如何选择最后的特征数kk的值,标准方法是使用交叉验证的方法开寻找合适的kk值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章