这篇博客主要的内容有:
1. 模型选择
2. 贝叶斯统计和规则化(Bayesian statistics and regularization)
最为核心的就是模型的选择,虽然没有那么多复杂的公式,但是,他提供了更加宏观的指导,而且很多时候是必不可少的。now let’s begin
假设我们训练不同的模型去解决一个学习问题,比如我们有一个多项式回归模型 hθ(x)=g(θ0+θ1x+θ2x2+...+θkxk) ,我么就像确定这个 k 的取值是不是 1,2,...,10 ,或者我们程序可以自动的计算 k 的取值,即选择不同的模型去解决问题并且可以在欠拟合和过拟合之间的到很好的平衡。
我们先假设一个模型的有限几何 M={M1,M2,...,Md} ,然后在这集合中选择我们想要的模型。比如上面的那个例子中, Mi 指的就是第 i 个模型 k 的取值。那么我们怎么在在这个集合之中进行选择呢?下面我们介绍交叉验证方法。
解决上面模型选择问题的一个简单想法就是我用70%的数据对每一模型进行训练,用30%的数据进行训练误差的计算,然后我们在比较各个模型的训练误差,就可以选择出训练误差比较小的模型了。如果对这些误差不用请参看(学习理论之经验风险最小化——Andrew Ng机器学习笔记(七))这篇博客。
如果我们的训练数据非常容易的就可以得到,那么上面这个方法将是一个不错的方法,因为它只需要遍历训练模型一次就可以得到一个比较好的模型。但是训练数据往往不是非常容易就可以得到,之前我就采集过一次实验数据,那的的确是一次非常痛苦的过程。所以我们就想高效的利用我们来之不易的训练数据,有人就提出来K重交叉验证(k-fold cross validation)算法,算法过程如下:
- 将训练集 S 分成 k 份,分别记为 S1,S2,...,Sk
- 对于每一个 Mi ,都执行如下过程:
for j=1,2,...,k
在 S1,S2,...Sj−1,Sj+1,...Sk 上训练模型 Mi ,得到假设函数 hij 。
利用 Sj 计算 hij 的训练误差,然后求平均值。- 选择出训练误差最小的模型 Mi ,然后在整个训练集上训练整个模型,最后我们就得到了对于这个训练集最好的模型
这个算法主要的思想就是:对于每一个模型,我们一次用 S1,S2,...Sk 去验证,用出去验证的剩余部分进行训练,然后平均训练误差,就只这个模型的训练误差,最后选择训练误差最下的模型。再重新训练这个模型,就得到最终我们想要的模型。如果k等于训练集S的大小( k=|S| ),这时有一个专门的名字叫留一交叉验证(leave-one-out cross validation)。
特征选择 ( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ) ,或属性选择( Attribute Selection ) ,是指从全部特征中选取一个特征子集,使构造出来的模型更好。
先举个例子,之前我们举过邮件分类的例子,整个邮件中的单词是否出现构成的0,1向量作为其特征向量。但是,当其中出现“deep leaning”等单词对判断判断是否为垃圾邮件作用不大,反而出现“buy”等单词对判断作用大,所以我们就行将其中作用不大的这些单词剔除掉。剔除的过程就是特征选择的过程。下面我们再来看看更加严格的说明
在机器学习的实际应用中,特征数量往往较多,其中可能存在不相关的特征,特征之间也可能存在相互依赖,容易导致如下的后果:
1. 特征个数越多,分析特征、训练模型所需的时间就越长
2. 特征个数越多,容易引起“维度灾难”,模型也会越复杂,其推广能力会下降
特征选择能剔除不相关(irrelevant)或亢余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的。另一方面,选取出真正相关的特征简化了模型,使研究人员易于理解数据产生的过程。
下面我们介绍特征选择的算法
先来看前向搜索,他的核心思想就是尝试特征向量所有组合,从中选择出训练误差最小的特征向量的自向量,原始特征向量的维度为n,具体描述如下:
1. 初始化特征向量 F 为空 (F=ϕ)
2. 循环直到到达阈值或者循环n趟
{
fori=1,...,n;{ifi∉Fi,thenFi=F∪{i} ,然后利用交叉验证算法或者留一交叉验证算法计算 Fi 的训练误差 }
令 F 等于训练误差最小的 Fi
}
3. 输出最终训练误差最小的特征向量的子集
实际上这个算法就是在遍历这样一个排列树(关于算法的书上有排列树的概念):
并且以广度优先的方式进行遍历。不同就是,每一层只保留一个训练误差最小的节点。
与前向搜索思想相反的搜索算法叫后向搜索,他的核心思想是:先将 F 设置为 {1,2,..,n} ,然后每次尝试删除一个特征,并计算训练误差或者评价,直到达到阈值或者为空,然后选择最佳的F。
前向搜索和后向搜索属于封装特征选择(wrapper model feature selection),Andrew Ng老师还解释为什么称为“Wraper”原因,说这算个就像“wrapper”一样套在你的学习算法外面,在执行的时候需要不断重复的调用你的学习算法。前向搜索和后向搜索都有两层循环,并且最坏情况下循环计数都到达 n ,所以时间复杂度都为 O(n2)
有时候前向和后向搜索的复杂度是无法接收的,比如在邮件分类中,特征向量的维数有时候会到达5000,甚至更高。这时的复杂度我们接收不了。所以就有了滤特征选择算法,它是一种启发式搜索算法,其中我们会定义个评价函数 S(i) ,用来评价第 i 个特征与标签 y 之间的影响关系。最后选择出 S(i) 得分高的特征。这个算法中两个重要的点就是这个 S(i) 怎么定义, k 到底取多大。
这个 S(i) 要反映出 xi 和 y 之间的联系,并且这个评价也是要基于训练集的。当 xi 和 y 之间的联系强烈时评价要高,当 xi 和 y 之间的联系弱时评价要低。很多情况下我们选择 S(i) 为mutual information,它的形式如下:
其中 xi 的取值表明第i个特征要还是不要; p(xi,y),p(xi),p(y) 都是根据训练集的经验分布进行估计的。
在信息论中有用来评价不同概率分布之间的差异的方法,有时候 MI(xi,y) 也可以选择下面这个称为KL距离(Kullback-Leibler (KL))的表达式:
当 xi 和 y 相互独立时,KL的结果为零,反之结果会很大。这个结果的大小与 xi,y 之间的相关程度成正比。
将所有的特征依据 S(i) 的值由大到小的排列,选取一个特征,两个特征,三个特征,…,利用交叉验证确定k的取值。最后你也可以根据经验直接定义k值的大小。
整个过程中我们一直在欠拟合和过拟合之间平衡,下面我们再来看看另外一个完成这种使命的另外一种方法。
在这一部分我们主要讨论的是假设函数 hθ(x) 中 θ 的求法,在前面监督式学习中我们始终采用的是最大似然估计来求 θ :
这样求的原理是我们认为 θ 是参数,只是我们现在不知道,所以可以利用估计的方法进行估计。但是贝叶斯派的观点认为 θ 是随机变量,只是我们不知道他的分布。贝叶斯派一般都会为 θ 指定一个先验分布( θ∼N(0,2τ2I) ),在给定训练集 S={(x(i),y(i))}mi=1 的情况下可以计算 θ 的后验概率:
是根据我们的学习算法而定的,比如在逻辑回归之中:
而且:
在知道 θ 的后验概率的情况下,就可以计算 y 的后验概率:
需要特别说是: P(y|x,θ) 没有写错,这样表示的意思就是说 θ 是变量而是参数。之前 P(y|x;θ) 表示 θ 是参数我们可以用估计的方法得到他的值。
上面的这种方法有一个最大的问题就是 θ 的后验概率(式子1)需要计算积分,这是难计算的。所以就有人就提出了一种逼近的方法,称为MAP (maximum a posteriori)
可以看出这个式子和最大似然估计特别像,只是在他的最后多了 θ 的先验概率。最终在我们解决问题的时候 hθ(x)=θMAPx
在最后我们再来看看 θ 的先验分布,如果我们令 θ∼N(0,2τI2) ,可以看出此时 θ 的均值为零,也就是说会有一部分 θ 部分为零,那么在最终的计算中相应的那一部分特征也会别屏蔽。这就和特征选择达到了类似的目的,选出了最终要的特征,屏蔽次要特征。从而降低过拟合的风险。在用一个图说明一下:
图中的红线表示我们用最大似然估计得到 θ 后拟合的曲线,它是一个高次多项式。蓝线和黄线表示我们用贝叶斯的方法拟合的曲线,在我们逐渐减小 τ 的时候,会有更多的 θ 变为零,多项式的次数就会降低,得到的拟合曲线也就更加的平滑。过拟合的风向也就更低。
但是,最大似然估计也可以经过修正后得到类似的效果,假如是线性回归:
通过这样的修正得到的 θ 也不会很大。
end