机器学习之特征选择

来源:互联网 发布:log4j配置打印sql语句 编辑:程序博客网 时间:2024/05/20 04:30
  • 特征选择严格来说也是模型选择中的一种。这里不去辨析他们的关系,重点说明问题。假设我们想对维度为n 的样本点进行回归,然而,n 可能大多以至于远远大于训练样例数m。但是我们感觉很多特征对于结果是无用的,想剔除n 中的无用特征。n个特征就有2��种去除情况(每个特征去或者保留),如果我们枚举这些情况,然后利用交叉验证逐一考察在该情况下模型的错误率,太不现实。因此需要一些启发式搜索方法。

第一种,前向搜索:

1、 初始化特征集F 为空。2、 扫描i 从1 到n,如果第i 个特征不在F 中,那么将特征i 和F 放在一起作为Fi(即Fi = F ∪ {i})在只使用Fi中特征的情况下,利用交叉验证来得到Fi的错误率。3、 从上步中得到的n 个Fi中选出错误率最小的Fi,更新F 为Fi。如果F 中的特征数达到了n 或者预设定的阈值(如果有的话),那么输出整个搜索过程中最好的F,没达到转到2
  • 前向搜索属于wrapper model feature selection。Wrapper这里指不断地使用不同的特征集来测试学习算法。前向搜索说白了就是每次增量地从剩余未选中的特征选出一个加入特征集中,待达到阈值或者n时,从所有的F 中选出错误率最小的。
  • 既然有增量加,那么也会有增量减,后者称为后向搜索。先将F 设置为{1,2,..,n},然后
    每次删除一个特征,并评价,直到达到阈值或者为空,然后选择最佳的F。
  • 这两种算法都可以工作,但是计算复杂度比较大。时间复杂度为O(n + (n − 1) + (n − 2) + ⋯ + 1) = O(n2)。

第二种,过滤特征选择(Filter feature selection)

  • 过滤特征选择方法的想法是针对每一个特征xi,i 从1 到n,计算xi相对于类别标签y的 信息量S(i),得到n个结果,然后将n个S(i)按照从大到小排名,输出前k 个特征。显然, 这样复杂度大大降低,为O(n)。
  • 那么关键问题就是使用什么样的方法来度量S(i),我们的目标是选取与y 关联最密切的一些xi。而y和xi都是有概率分布的。因此我们想到使用互信息来度量S(i),对于xi是离散值的情况更适用,不是离散值,将其转变为离散值。

互信息(Mutual information)公式:
这里写图片描述

  • 当xi是0/1 离散值的时候,这个公式如上。很容易推广到xi是多个离散值的情况。 这里的p(xi , y),p(xi)和p(y)都是从训练集上得到的。

若问这个MI 公式如何得来,请看它的KL 距离(Kullback-Leibler)表述:
这里写图片描述

  • 也就是说,MI 衡量的是xi和y 的独立性。如果它俩独立(p(xi , y) = p(xi )p(y)),那么KL距离值为0,也就是说xi和y不相关了,可以去除xi。相反,如果两者密切相关,那么MI 值会很大。在对MI进行排名后,最后剩余的问题就是如何选择k 值(前k 个xi)。我们继续使用交叉验证的方法,将k 从1扫描到n,取最大的F。不过这次复杂度是线性的了。比如,在使用朴素贝叶斯分类文本的时候,词表长度n 很大。使用filter特征选择方法,能够增加分类器的精度。
0 0