机器学习中的模型选择和特征选择的基本方法

 

  模型选择的标准是尽可能地贴近样本真实的分布。但是在有限的样本下,如果我们有多个可选模型,比如从简单到复杂,从低阶到高阶,参数由少到多。那么我们怎么选择模型呢,是对训练样本的拟合度越好就可以吗?显然不是,因为这样做的话只会让我们最终选择出最复杂,最高阶的模型。而这个模型的问题是过拟合的,即对样本真实分布的预测误差是很高的。那么该如何选择模型,使得泛化误差尽量小呢,有下面这些常用的方法:

保留交叉验证

把样本分成训练样本和测试样本,一般可以7比3的比例。7成的样本训练出的模型,用3成的样本做检验。取测试准确率最高的模型

K折交叉验证

取K为10为例,把所有样本平均分成10分,然后用9份训练,剩下的1份做测试。这样可以做十次测试,取十次测试的准确率的平均值最高的模型做为选取的模型。

留1交叉验证

当样本数目很少并且很难取得的时候,K折交叉验证的极限就是让K等于样本数目N,这样N-1个样本作为训练样本,1个作为测试样本。经过N次测试,取平局准确率最高的模型作为我们选择的模型。

在交叉验证做完选取理想模型之后,可以把所有样本再放到模型中训练一次,作为最后的输出模型。

 

下面介绍特征选择

 

  对于特征选择来说,我们可能面临的问题是特征太多,有很多特征是属于冗余信息或者无关信息,这些会增加我们训练的时间,尤其是当特征特别多的时候,比如说朴素贝叶斯做垃圾邮件过滤,以单词作为特征,这样的特征集大小可能高达数十万。如何做特征选择呢,常用方法一般分成下面的类别:

包裹式特征选择

包裹式的意思是把模型训练封装,我们对特征子集进行启发式搜索,找到一个较好的子集。比如前向搜索,是从一个空集开始,选择一个特征作为特征子集,找到测试结果最好的那个特征,此时特征子集的大小变为1,完成第一次迭代。下一次迭代,从剩余的特征中选取一个加入当前子集,找到能使得测试结果最好的那个子集最为这次迭代的特征子集。一次迭代直到达到我们预设的子集大小或者测试结果几乎没有改善为止。类似地,后向搜索的初始特征子集是所有特征,然后每次迭代从里面减少一个特征。很显然,这两种方法都是贪心算法,并不保证全局最优。

 

过滤式特征选择

过滤式特征选择不是通过模型训练的方式来选择特征子集。它是通过统计的方法找出对于样本标记最重要的特征。

比如说计算相对熵的KL距离是其中一种方式。我们要计算的是每个特征对于标记来说MI(mutual information),即特征对于标记来说的信息相关度。对于第i个特征,有:

$$MI(x_{i},y) = \sum_{x_{i}\subseteq X_{i}}\sum_{y\subseteq Y_{i}}p(x_{i},y)log\frac{p(x_{i},y)}{p(x_{i})*p(y)}$$

其中$X_{i}$ $Y_{i}$分别为$x_{i}$和y所有可能的取值的集合。

上式就是KL距离,可表示为$KL(p(x_{i},y) || p(x_{i}) p(y))$,直观地理解,当$x_{i}$和y是独立不相关时,理论计算出的KL距离为0。

 

posted @ 2018-07-20 15:00  何振华Jeanva  阅读(4104)  评论(2编辑  收藏  举报