特征选择方法
一、特征选择方法概述
首先,我们来了解一下常见的特征选择方法,主要分为三类:
- 过滤法(Filter):特征选择独立于数据挖掘任务,按照特征的发散程度或者特征与目标变量之间的相关性对各个特征进行评分,然后设定阈值选出评分较高的特征子集。
- 包装法(Wrapper):特征选择和数据挖掘算法相关,直接使用数据挖掘模型在特征子集上的评价结果衡量该子集的优劣,然后采用一定的启发式方法在特征空间中搜索,直至选择出最优的特征子集。
- 嵌入法(Embedded):特征选择和数据挖掘任务融为一体,两者在同一个优化过程中完成,即在训练数据挖掘模型的同时完成特征选择,选择出能够使得该模型性能达到最佳的特征子集。
这三种方法各有特点,适用场景也不同,后面我们会逐一详细介绍。
二、过滤法
过滤式特征选择方法从数据集内在的性质出发,选择特征的发散程度高或者它与目标变量之间的相关度大的特征或特征子集,选择过程与数据挖掘算法无关,因此具有较好的通用性。过滤方法一般分为单变量过滤和多变量过滤两类。
(一)单变量过滤方法
- 方差阈值法
方差低于某个阈值的特征无法解释目标变量的变化规律,因此直接将它们删除。这种方法要求特征必须为离散型变量,连续变量需要进行离散化处理后才能使用。
在 Python 的feature_selection模块中,VarianceThreshold类实现了该方法。它的主要参数有threshold,即设定的阈值,默认是 0;主要属性是variances,用于存储计算的每个特征的方差;主要函数有fit(X),用于在数据集 X 上执行特征选择方法;transform(X),返回用选择后的特征对原始数据 X 进行压缩的结果;fit_transform(X),运行特征选择,并返回利用所选特征进行压缩后的数据集;get_support(indices),得到所选特征的掩码(indices=False)或者索引(indices=True)。
举个例子,有一个具有 4 个特征的模拟数据,输出的 4 个特征的方差分别为 [0.139, 5.472, 1.806, 8.472]。当阈值为 1.0 时,第一个特征会被去除;当阈值为 2.0 时,只选择第 2 个和第 4 个特征。
- 卡方统计量法
这种方法主要用于分类任务。在feature_selection模块中,提供了SelectKBest和SelectPercentile两个类以及chi2函数来支持基于卡方统计量的特征选择。
创建一个基于卡方统计量的单变量过滤特征选择模型的过程如下:selector = SelectKBest(chi2, k=2),其中参数 k=2 意味着只选择出两个特征变量。
我们来看一个实例,模拟数据集 X 和 Y,通过SelectKBest和chi2进行特征选择,输出各特征的卡方统计量值为 [0.1, 5.565, 0.276, 10.580],显然第 2 个特征和第 4 个特征的卡方值较大,得以保留。
- 互信息法
互信息法可用于分类和回归任务。在 Scikit-learn 库的feature_selection模块中,mutual_info_classif和mutual_info_regression两个函数分别实现了分类任务和回归任务中的互信息计算。
结合SelectKBest类,创建基于互信息的单变量过滤特征选择模型的方式为:selector = SelectKBest(mutual_info_classif, k=2)。
例如,在一个模拟数据集中,各特征和目标变量的互信息值为 [0, 0.2, 0, 0.617],第 2 个特征和第 4 个特征的互信息值较大,会被保留。
(二)多变量过滤方法
常见的多变量过滤方法有最大相关最小冗余法(mRMR)、基于相关性的特征选择(CFS)、基于相关性的快速特征选择(FCBF)等。
(三)过滤法的优缺点
- 优点:算法通用性强,省去了模型训练步骤,算法复杂度低,适用于大规模数据集;能快速去除大量不相关特征,适合作为特征的预筛选器。
- 缺点:特征选择过程独立于数据挖掘算法,所选特征子集对于数据挖掘任务而言通常不是最优的,性能常低于其他两类方法。
三、包装法
包装法(Wrapper)直接采用数据挖掘算法在特征子集上的效果对该子集进行评价,将特征选择视为搜索问题,目标是找到最佳特征子集,使数据挖掘算法在该子集上取得最优性能。常见的包装法有递归特征消除(RFE)方法、序列前向选择(SFS)方法、序列后向选择(SBS)方法。
(一)递归特征消除(RFE)
RFE 是一种局部搜索最优特征子集的贪心搜索方法,从全部特征开始,建立数据挖掘模型,剔除模型识别的不重要特征,再用剩余特征迭代重新训练模型,直到剩余指定数量的特征。它要求所依赖的数据挖掘算法在训练时能给出特征的重要性系数,如决策树和随机森林的feature_importances_属性、线性回归模型和线性支持向量机的coef_属性。
在 scikit-learn 库的feature_selection模块中,RFE 的基本语法为:sklearn.feature_selection.RFE(estimator, n_features_to_select=None),其中estimator是监督式数据挖掘算法模型,能提供特征的重要性系数;n_features_to_select是选择的特征数量,默认为选择一半的特征。其返回值有n_features_,即选择的特征数量;ranking_,即对特征的重要性排序。
举个实例,使用葡萄酒数据集,通过 RFE 选择 5 个特征,选取的特征为 [6, 9, 10, 11, 12],在该特征子集上决策树的测试精度为 97.78%。
(二)包装法的优缺点
- 优点:与过滤法相比,特征选择过程与数据挖掘任务相关,选择结果是数据挖掘算法表现最佳时的特征子集;对数据挖掘模型要求不高,适用性较广。
- 缺点:是迭代式方法,对每个特征子集都需建立数据挖掘模型,特征数量较多时计算量大,效率远低于过滤法;采用启发式搜索,可能找到局部最优子集。
四、嵌入法
嵌入法(Embeding)将特征选择过程完全融入数据挖掘模型的构建过程,在创建模型时完成特征子集选择。它比过滤法性能更好,比包装法计算效率更高,是目前应用最广泛的特征选择方法之一。常见的嵌入法有基于正则化线性模型的方法和基于树的方法。
(一)基于正则化线性模型的方法
在feature_selection模块中,SelectFromModel类能在训练数据挖掘模型(如线性回归模型、决策树模型等)时,利用模型重要性系数(coef_或feature_importances_)实现嵌入式特征选择。
其基本语法为:sklearn.feature_selection.SelectFromModel(estimator, threshold=None),其中estimator是数据挖掘模型;threshold是阈值,可取‘mean’(默认)、‘median’或数值,系数低于阈值的特征将被丢弃。
(二)基于树模型的方法
基于树的数据挖掘模型,如决策树、随机森林、GBDT、XGboost,在构建树的过程中,会贪婪选择当前最优特征构造属性测试条件,特征被用于构造属性测试条件的次数越多,重要性越高。同样可借助SelectFromModel类实现基于树的嵌入式特征选择。
(三)嵌入法的优缺点
- 优点:特征选择与模型构建完全融合,结果是数据挖掘取得最优性能时的子集;与包装法相比,无需耗时的迭代搜索过程,效率更高。
- 缺点:性能依赖特定数据挖掘模型,尤其与模型参数设置密切相关;目前仅正则线性模型和树模型适用,对聚类模型、神经网络模型、贝叶斯模型等不适用。