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

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

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


1 交叉验证

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

  1. 每个模型 M i M_i Mi都在训练集 S S S上进行一次训练,得到假设 h i h_i hi
  2. 选择训练误差最小的假设

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

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

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

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

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


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

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

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

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

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


2 特征选择

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

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

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

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


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

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

M i ( x i , y ) = ∑ x i ∈ { 0 , 1 } ∑ y ∈ { 0 , 1 } p ( x i , y ) l o g p ( x i , y ) p ( x i ) 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)}. Mi(xi,y)=xi{0,1}y{0,1}p(xi,y)logp(xi)p(y)p(xi,y).

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

M i ( x i , y ) = K L ( p ( x i , y ) ∣ ∣ p ( x i ) p ( y ) ) M_i(x_i,y) = \mathrm{KL}(p(x_i,y)||p(x_i)p(y)) Mi(xi,y)=KL(p(xi,y)p(xi)p(y))

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值