假设可选的模型集合是
M={M1,M2,...,Md}
,它可能包含了 SVM、logistic回归、神经网络等模型。
在上一篇中我们已经知道,我们要选择使得泛化误差
ϵ(h^)
最小的模型,这时为了选择模型,我们可能会想到如下方法:
1、用训练样本去训练
M
中的每一个模型,之后便可以的到每个模型的
ϵ(h^)
。
2、选取使得
ϵ(h^)
最小的模型。
很容易理解,但是却很不靠谱,我们把所有的样本都拿来训练,没有留下任何样本用来测试必然会导致训练结果有很低的偏差,但却有很高的方差。因为这样做,模型中多项式的指数越大必然训练误差越小,因此我们要留下一部分样本用来测试,既要保证偏差合理也要保证方差合理。
交叉验证(Cross validation)
简单交叉验证(hold-out cross validation):
1、从全部的训练数据
S
中随机选择
2、用
Strain
去训练
M
中的每个模型
Mi
,得到对应的
hi
3、用
SCV
在每个模型
hi
上做测试,选择具有最小经验错误
ϵ^SCV(hi)
的
hi
作为最佳模型。
简单交叉验证虽然可行,但是训练模型时只是用了
70%
的样本,虽然我们也可以用
80%
等等,但是,显然训练一个模型时,样本的数量越多越好;另外,当样本总数很少时,我们就更不希望在分出一部分用来做验证。下面来看看另一种方法:
k-折叠交叉验证(k-fold cross validation):
1、将全部训练集
S
分成
2、按照如下方式训练每个模型:
For j = 1, . . . , k
Train the model Mi on S1 ∪ · · · ∪ Sj−1 ∪ Sj+1 ∪ · · · Sk (i.e., train on all the data except Sj) to get some hypothesis hij
Test the hypothesis hij on Sj, to get ε ˆSj(hij)
模型
Mi
的泛化误差用该在模型训练得到的所有
hij
的误差均值来表示即:
1m∑kj=1ϵ^Sj(hij)
.
3、选出平均经验错误率最小的
Mi
,然后使用全部的
S
再次在模型
说白了,这个方法就是将简单
交叉验证的测试集改为
1/k
,每个模型训练
k
次,测试
极端情况下,
k
可以取值为
如果我们发明了一种新的学习模型或者算法,那么可以使用交叉验证来对模型进行评价。
特征选择
特征选择是模型选择中很重要的一部分,我们要根据样本的特性来确定什么模型更加适合。
但是有时候,样本的属性n会特别多远远大于样本的数量m
(n≫m)
,这种情况下经常会有很多兀余属性,我们训练模型时并不需要他们。因为如果考虑的属性过多,必然导致模型更加复杂,但是在上述情况下其实我们可以只用更简单的模型,同样可以很好的对样本分类(即在上述简单模型和复杂模型下的VC维是相同的)。此时如果不进行适当的特质选择必然导致数据过拟合,产生高方差。
假如样本中有n个属性,即样本是n维的,如果我们利用枚举法,那么就会有 2n 种组合,当n稍微大点时这条路就走不通了。下面给出一些启发式方法:
前向搜索(forward search):
1、初始化特征集
F
为空
2、
Repeat {
(a) For i = 1, . . . , n if i 6∈ F, let Fi = F ∪ {i}, and use some version of cross validation to evaluate features Fi. (I.e., train your learning algorithm using only the features in Fi, and estimate its generalization error.)
(b) Set F to be the best feature subset found on step (a).
}
3、 从上步中得到的
n
个
前向搜索属于 wrapper model feature selection。 Wrapper 这里指不断地使用不同的特征集来测试学习算法。前向搜索说白了就是每次增量地从剩余未选中的特征中选出一个加入特征集中,待达到阈值或者 n 时, 从所有的 F 中选出错误率最小的。
前向搜索每次将 F 中的属性个数加1,其实我们完全可以按照相反的思路:开始时将 F 初始化为包含样本所有属性的集合,然后逐次减去一个属性进行比较,选取最合适的属性集,即后向搜索(backward search)。
这两种算法都可以很好的工作,但是计算复杂度比较大。时间复杂度为 O(n+(n−1)+(n−2)+⋯+1)=O(n2) .
过滤特征选择(Filter feature selection):
过滤特征选择是依据启发式规则的,它的计算代价相对前一种方法而言小了很多。
过滤特征选择方法的想法是针对每一个特征
xi
,计算
xi
相对于类别标签
y
的信息量
某个属性
xi
的重要程度就是指它与类别之前的关联度,我们使用相互信息(mutual information)来衡量
S(i)
,
xi与y
的相互信息
MI(xi,y)
表示如下:
上式是假设
xi和y
都是二值的{0,1},对于多值情况可以直接推广。
公式里的
p(xi,y),p(xi)和p(y)
都可以直接由训练样本统计得到。
上式来源于信息论中的用以衡量不同概率分布之前的差异的标准——(Kullback-Leibler)KL距离 :
它反映了
p(xi,y)即xi与y
的联合(joint)概率与后面相乘的
p(xi)p(y)
之间的关联度.
如果
p(xi)、p(y)
是相互独立的,那么
p(xi,y)与p(xi)p(y)
相等,它们是相同的分布,此时KL距离为0,即MI值为0;相反,如果两者密切相关,那么MI 值会很大。
现在每个属性的相互信息MI已经知道了,我们下面要做的就是选取k个属性构成特征集,此时我们可以使用交叉验证法来确定最终的集合。