目录
1. 需要特征选择的原因
2. 特征选择的方法
2.1 Wrappers 包装法
2.1.1 可实现的Wrapper方法:sequential forward selection(贪心法)
2.1.2 可实现的Wrapper方法:sequential backward selection(消融法)
2.2 Filtering 过滤法
2.2.1 Pointwise Mutual Information(PMI)逐点互信息法
2.2.2 Mutual information(MI)互信息法
2.2.3 卡方检验
3. 特征选择的常见问题
4. 其他特征选择方法
4.1 TFIDF 词频-逆向文件频率 选择法
4.2 Embedded 嵌入法
4.3 sklearn 中的特征选择
5. 模型选择的影响
GIGO: Garbage In, Garbage out
数据集中往往包含一些噪声和无用的特征,这些特征就是垃圾,如果我们放任它们参与训练不加以选择的话,会导致模型输出垃圾的结果。
对数据做一些预处理和清洗的方法有:
在对数据进行预处理和清洗之后,我们就可以进行特征选择了。
特征选择的主要目标是:
根据一些评价指标,让模型拥有更好的表现。
特征选择的其他目标是:
通过筛选出的重要特征来获得一些启发和对某些问题另外角度的理解
更少的功能更小的模型更快的回答;更准确的答案 >> 更快的答案。
我们拿到一组数据以及确定了任务之后,我们如何筛选特征呢?一种方法是靠直觉和生活经验,即的方法。但绝大多数情况下你不能这么干,因为数据集可能很大,而且很多个特征之间的关系你也并不知道,所以最好的办法是根据某些统计学的知识来进行特征的筛选。
包装法采用递归的方式进行
具体方法:
从个特征开始,不断地增加特征的数量然后比较最终的预测结果是否有提升
或者从使用所有特征开始,不断地减少特征的数量直到减少到一个特征,进行观察
例子:对于天气数据选择最好的特征集
包装法的优点:
可以找到符合验证集的最佳特征集合
包装法的缺点:
对于一些特征数量很大的数据集,这几乎是不可实践的,因为假设一共有个特征,那么复杂度是:
完整的包装方法需要多长时间?
假设我们有一个快速的方法(例如),在一个中等规模的数据集上(个实例)。如果每个训练——评估周期需要10秒来完成。对于m个属性 :
组合分钟,,。
所以包装法只对非常小的数据集有用。
这是一种使用贪心策略来完成特征筛选的方法,算法流程如下:
在每个单一属性上训练和评估模型。
选出能够导致最好结果的属性。
进行下列操作直到模型收敛:
- 训练和评估这个单一的最佳属性并且以为基础分别加上剩下的所有单一属性来构成包含两个属性的特征集合。
- 再选出最佳的特征子集,然后以当前筛选出的特征子集为基础,以剩下的单个特征为原料不断地将这个集合不断扩大。
停止条件:表现不再提高(accuracy)
从上面的过程我们可以看到,经过不断迭代,最终到收敛的时候会选择出最佳的前个特征构成特征集合(假设特征空间一共有个特征)。
假设全部个特征都能够参与构成最后使用的特征空间,那么的这过程的时间复杂度可以用如下公式计算:
在实际的应用中收敛其实会更早到来,不会用尽所有的个特征,模型可能会很快的选择出一个最优的特征子集并完成收敛。但是也有可能收敛到一个次优甚至糟糕解决方案。
这个过程假设所有的特征之间是相互独立的
这种方法是和的筛选方式相对的一种筛选方法,的方法是刚开始使用的特征集合为空然后逐个地将最好的特征加入到这个集合中直到模型收敛形成最佳的特征子集
而 的方法的过程刚好相反,它是通过将全部的特征作为开始的集合,然后从这些特征中不断选出最不影响精度结果的特征然后从集合中剔除,最终剩下能满足模型收敛的最佳的特征子集。
算法的流程如下:
将所有的特征都用于模型的训练
删掉某一个特征,然后对模型重新训练和评估
进行如下的操作直至收敛:
- 从剩下的所有特征中分别单独删除单个的特征,对模型进行重新训练和评估
- 删除掉那个删掉之后让模型退化程度最小的特征(删除那个最可有可无的特征)
结束条件:性能的下降到某一个阈值之下
顺序逆向选择的优点:
顺序逆向选择的缺点:
过滤法的出发点就是要对每个特征进行评估,衡量每个评估有多好,有多不好,然后过滤那些不够好的特征。过滤法和模型的训练是独立的,不需要通过模型的训练来迭代地选择特征,只是采用统计的方法来完成特征的筛选。过滤法分开单独考虑每个特征,因此时间复杂度是线性的。过滤法也是最常用的特征筛选方法。
我们如何评价一个特征是好是坏呢?
一个好的特征应该是和分类结果有相关关系的;也就是说这个特征能够对最终分类的结果起一定程度的作用。
哪个属性是好的,还是?
可能比较好:
可能不够好:
很显然在这个例子中如果你只看的值你就能够得出的值,这种情况下,我们就说和的相关性很大。而它也就是一个对于分类任务而言很好的特征。
为了用数学的形式来衡量这种相关性,我们下面介绍三种常用的方法:
我们都知道满足独立性的两个事件其概率应该满足如下公式:
当的时候,属性和属性是有正向的相关关系的
当的时候,属性和属性是相互独立的
当的时候,属性和属性是有负相关关系的
互信息的定义式:
最好的属性(特征)的衡量标准:与类别属性具有最大的属性。
例子:
这个实例中,属性有两种不同的值,类别属性也有两种不同的值。所以我们求算和之间的应该计算4个,即 ,,,。
:
:
结论:对于,来说,的和的的相关性更大
特征好坏的判断标准:
具体表达式:
考虑,,,之间的的综合结果,即:
也可以表示为:
例子:
用一张表来帮助我们计算互信息:
其中代表当前格子中的数量,是总数。所以我们表示某个格子的概率,可以写成:
现在将那张图转换成表格,可以写成
对于和的互信息计算过程可以如下表示:
从上面的计算结果我们可以得出结论:和的相关性更大,因此特征比特征要好。
卡方检验的运作原理是:
通过统计学的方式来衡量两个属性之间的相关程度。
卡方检验在对两个属性进行计算的时候进行的假设是:
假设两个属性是独立的。
使用卡方检验我们同样需要使用一张表:
如果,相互独立的话,则有:
依然使用表示某个格子中的数值,进而我们可以得到如下推导:
是我们按照假设的期望值,即在两个属性独立的情况下应该得到的数值。而实际上我们会根据计算得到一个,它代表了实际的观察值。
如果
代表和伴随出现的程度比随机状态更加紧密——是一种可预测的状态 (predictive)
如果
代表和伴随出现的程度不如随机情况——是一种可预测的状态 (predictive)
如果
代表和之间的关系几乎是随机的——是一种不可预测的状态 (not predictive)
根据 我们可以计算卡方的值,根据下列公式:
得到的值越大,代表两个属性之间的依赖性越大;也就越不支持原假设(两个属性相互独立)。
通过分别和进行计算的结果:
的
注:
的
相依表:
用红色框里面的来计算用蓝框中的部分来计算。
特征类型:
类别、标签(Nominal)形式的特征
对于一些类别形式(Nominal)的特征,例如天气的属性有三个不同的值:晴天、阴天、雨天:,这种用名词的形式表示的特征。
处理方式1:
处理方式2:
连续(Continuous)形式的特征:
多分类问题
要做到相关,一个词应该是:
:术语t在文件d中的频率。
:系统中一共存在的文件数量。
:含有t的文件数量。
因此越大代表在这个文件系统中越少的文件包含了这个词,而越大代表了当前文件中这个词的出现频次越高。
综上所述,如果越大,就代表这个词可以帮助文件在整个文件系统中被区分出来。
通过决策树或者带有正则化的回归模型来筛选有用的特征。
例如:通过 sklearn 里面决策树有关的属性 feature_importance_ 可以得到每个特征的重要程度,根据这些特征重要程度的排名,可以筛选出最重要的特征子集。
使用嵌入法和使用 filter 方法不同,我们就很难去界定一个有效的临界值(filter 中使用卡方检验可以用 0.05 或者 0.01这种值来衡量相关性)。这种情况下,如何指定一个阈值来帮助我们筛选特征也是需要考虑的问题。
另外,嵌入法引入了算法来挑选特征,并且每次挑选都会使用全部特征;而且由于使用算法来挑选特征,所以挑选的算法的运算速度会直接影响到嵌入法挑选特征的速度,比如选择 KNN 和 决策树 的嵌入法性能上会差别很大。