机器学习中,特征选择是特征工程中的重要问题(另一个重要的问题是特征提取),坊间常说:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。由此可见,特征工程尤其是特征选择在机器学习中占有相当重要的地位。
强烈推荐一篇博文,说如何进行特征选择的:
下面进入正题(一下内容属于半成品,还在修改中.....)
对于一个训练集,每个记录包含两部分,1是特征空间的取值,2是该记录的分类标签
一般情况下,机器学习中所使用特征的选择有两种方式,一是在原有特征基础上创造新特征,比如决策树中信息增益、基尼系数,或者LDA(latent dirichlet allocation)模型中的各个主题,二是从原有特征中筛选出无关或者冗余特征,将其去除后保留一个特征子集。
本文详细说下第二种方法。
一般来说,进行特征集选择有三条途径,filter,wrapper, 所谓filter就是衡量每个特征的重要性,然后对其进行排序,筛选的时候或者选择前N个,或者前%X。
常用于衡量特征重要程度的方法,PCA/FA/LDA(linear discriminal analysis)以及卡方检测/信息增益/相关系数
而wrapper是将子集的选择看作是一个搜索寻优问题,生成不同的组合,对组合进行评价,再与其他的组合进行比较。这样就将子集的选择看作是一个是一个优化问题,这里有很多的优化算法可以解决,比如GA/PSO/DE/ABC[1].
下面举一个例子来说一下特征选择
数据集中的每个特征对于数据集的分类贡献并不一致,以经典iris数据集为例,这个数据集包括四个特征:
sepal length,sepal width,petal length,petal width,
有三个分类,setoka iris,versicolor iris和virginica iris
这四个特征对分类的贡献如下图所示:
可见,petal width and petal width比sepal length和width在分类上的用处要大得多(因为后者在训练集上的重叠部分太多了,导致不好用于分类)。
下面我们做几个测试,使用四个特征集
第一个:所有特征
Accuracy: 94.44% (+/- 3.51%), all attributes
第二个:两个特征,petal width and petal width,虽然准确率和第一个没区别,但方差变大,也就是说分类性能不稳定
Accuracy: 94.44% (+/- 6.09%), Petal dimensions (column 3 & 4) 使用PCA方法,从新特征中找出权重TOP2的,
Accuracy: 85.56% (+/- 9.69%), PCA dim. red. (n=2) 使用LDA(不是主题模型的LDA)方法,从新特征中找出权重TOP2的,
Accuracy: 96.67% (+/- 4.44%), LDA dim. red. (n=2)
那么我们忍不住问一个问题,是不是选择全部特征集,模型准确率最高,如果不是这样,蛮究竟选择什么样的特征集时准确率最高?
这里有一个图,横轴是所选择的特征数目,纵轴是交叉验证所获得的准确率,从中可以看到,并非选择了全部特征,准确率最高,当少数几个特征就可以得到最高准确率时候,选择的特征越多,反倒画蛇添足了。
PS两块小内容:(1) 如何进行交叉验证
将数据集分为训练集和验证集,各包含60%和40%的数据。
注意:在训练集上对模型参数进行训练后,用验证集来估计准确率时只能使用一次,如果每次训练模型参数后都使用这个验证集来估计准确率,很容易导致过拟合。
如果我们使用4-fold交叉验证的话,其过程如下,最终错误率取4次的平均值,以表现我们模型的泛化能力。
(2) 决策树的特征选择汇总:
在决策树部分,三类经典决策树模型的主要区别在于其用于分类的属性不同,也即特征选择不同
ID3:信息增益
C4.5:信息增益率,
附加一句,C4.5之所以用信息增益率,也即gr(D,A)=g(D,A)/H(A),是因为ID3中,所以如果是取值更多的属性, 更容易使得数据更“ 纯 ”,其信息增益更大,决策树会首先挑选这个属性作为树的顶点。结果训练出来的形状是一棵庞大且深度很浅的树,这样的划分是极为不合理的。而H(A),也即数据D在属性A上的熵值,随着A可取值类型的增加而变大,所以可以用H(A),作为惩罚因子,从而减少取值更多属性的目标函数值,进而避免生成树的深度很浅。
CART
主要参考文献:
[1]http://blog.csdn.net/google19890102/article/details/40019271
[2]http://nbviewer.ipython.org/github/gmonce/scikit-learn-book/blob/master/Chapter 4 - Advanced Features - Feature Engineering and Selection.ipynb
[3]http://nbviewer.ipython.org/github/rasbt/pattern_classification/blob/master/machine_learning/scikit-learn/scikit-pipeline.ipynb#Linear-Discriminant-Analysis-(LDA)