对于某个学习问题,我们如何在几种不同的模型中进 行选择。例如,如果我们使用一个多项式回归模型,我们该如何决定多项式的最高阶数以最优地平衡偏差和波动?与此类似,对于局部权重回归如何选择带宽参数,对于正规化后的SVM算法怎么选择参数的值?
为了具体化,这一节中我们假设有一个有限模型集,我们在模型集中进行选择,即代表第i个模型。
1 交叉验证
给定某个训练集后,根据经验风险最小化,我们可能会这样进行模型选择:
- 每个模型都在训练集上进行一次训练,得到假设;
- 选择训练误差最小的假设
这种算法并不能得到我们想要的结果。假设多项式回归,阶数越高训练误差就会越小。因此这种方法选出的往往是一个高波动高维度的多项式模型,会导致严重的过拟合。
下面这个算法表现会好很多,称为保留交叉验证或简单交叉验证,步骤如下:
- 随机将训练集分为两部分和,占有70%的数据,占有30%的数据。称为保留交叉验证集。
- 每个模型都在训练集上进行一次训练,得到假设;
- 选择运行在交叉验证集上,误差最小的假设。
通过测试未训练的交叉验证集数据,我们可以更好地估计各个模型预测的真实泛化误差,选择泛化误差最小的模型。普遍而言,交叉验证集占总训练集的30%。
在保留交叉验证第三步之后,我们可以考虑将产生的模型在整个训练集上再训练一次。一般而言这会更好,但对于一些对初始条件或数据很敏感的算法,以作为训练集表现得好并不意味着用作为训练集也会表现很好,对于这种情况我们只能放弃再训练这一步。
保留交叉验证最大的不足是它浪费了30%的数据。即使我们在最后再训练一次,这个算法依然只使用了70%的数据。在数据很丰富的时候这没什么,当数据很稀少的时候我们可能需要更好的办法。
我们引入另一种称为k次折叠交叉验证的方法,他每次的保留数据更少:
- 随机将分为k个不相交的子集,这些子集设为。
- 对于每个模型,我们这样对他们进行评估:
循环k次,将在上进行训练得到假设。
在假设上测试,得到误差。
令每个模型的估计泛化误差为的均值。 - 选择估计泛化误差最小的模型,并在整个训练集上再训练一次,得到的假设就是最后的答案。
一般设折叠次数,这样每次数据的保留部分相比保留交叉验证大幅缩小了,当然由于要训练k次计算成本增加了。尽管是普遍情形,在训练数据极端稀少的时候,我们也可以让,即每次仅保留一个数据用以验证,这种方法称为留一交叉验证。
最后,尽管我们介绍了几种交叉验证的方法用以选择模型。实际用交叉验证来评估单个模型或算法的预测效果也很不错。
2 特征选择
在模型选择中有一种特殊且重要的部分叫特征选择。想象一下如果我们的监督式学习问题中特征数的值非常大,但我们怀疑其中只有部分特征是和我们的学习目标相关的。即使使用简单线性分类器,假设类的VC维依然会有,因此过拟合是一个大问题除非训练集非常大才能避免。
要解决这个问题,你可以使用特征选择算法减少特征数量。有个特征就意味着有个特征子集,所以特征选择也可看成有个模型的模型选择问题。当的值很大时,是无法通过枚举的方法准确地比较个模型的,所以一般会使用一些启发式搜索算法来寻找好的特征子集。下面这个搜索步骤称为前向搜索:
- 初始化令特征集;
- 重复 {
(a) 循环i次,如果,则让,并使用交叉验证来评估特征$\mathcal{F}_i \mathcal{F}$等于(a)中所有特征子集中最好那一个。
} - 选择并输出整个搜索过程中表现最好的特征子集。
这个算法的外层循环,在包含所有特征或达到你设定的阈值时停止。该算法是封装模型特征选择的实例化,它的每个步骤都在包装你的学习算法并评估不同的特征子集。除了前向搜索,还有其他的特征搜索算法,比如后向搜索算法,它从开始每次去掉一个特征,直到特征集为空。
过滤器特征选择是一个启发式的方法,只需很少的计算成本就能找到特征子集。它的核心是计算一些评分,是每个特征对类标签的影响的评分,最后挑选得分最高的k个特征组成特征子集。
一种选择使用和之间的相关性来描述。实际中,我们一般(尤其在特征是离散值时)使用互信息作为评分:
这些概率都可以通过训练集上的经验分布来估计。为了让概率更直观,我们可以使用KL散度来刻画相互信息:
你可能不清楚什么是KL散度,简要来说它描述同之间的差别有多大。当和之间相关性很小时(即),KL的值很小;反之,KL的值就会很大。最后一个需要注意的细节是我们如何选择最后的特征数的值,标准方法是使用交叉验证的方法开寻找合适的值。