1、特征选择介绍
(1)特征选择的定义
对当前学习任务有价值的属性称为是“相关特征”,没有价值的属性称为是“无关特征”,从给定的特征集中选择出相关特征子集的过程,就称为是“特征选择”。
其中还有一种特征称为是“冗余特征”,这些特征指的是可以从其他特征中推演出来的特征。
(2)特征选择的重要性
特征选择是一个“数据预处理”过程,它的重要性体现在两个方面:
1)减轻维度灾难问题。
2)去除无关特征可以降低学习的难度。
(3)特征工程是什么?
有这么一句话在业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已。那特征工程到底是什么呢?顾名思义,其本质是一项工程活动,目的是最大限度地从原始数据中提取特征以供算法和模型使用。通过总结和归纳,人们认为特征工程包括以下方面:
(4)特征选择的类型:
在现实生活中,一个对象往往具有很多属性(以下称为特征),这些特征大致可以被分成三种主要的类型:
相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果;
无关特征:对于我们的算法没有任何帮助,不会给算法的效果带来任何提升;
冗余特征:不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出;
(5)特征选择算法:
根据上面的三种不同的搜索策略和五种不同的评价函数,会有很多具体的特征选择算法。以下是主要的分类:
2.特征选择方法
(1)特征选择:
当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。通常来说,从两个方面考虑来选择特征:
特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。
(2)特征选择方法
-
Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
-
Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
-
Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
详解:
过滤式选择
过滤式方法先对数据集进行特征选择,然后再训练学习器,特征选择过程与后续学习器无关。
Relief(Relevant FeaturesRelevant Features)是著名的过滤式特征选择方法,Relief 为一系列算法,它包括最早提出的 Relief 以及后来拓展的 Relief-F 和 RRelief-F ,其中最早提出的 Relief 针对的是二分类问题,RRelief-F 算法可以解决多分类问题,RRelief-F算法
包裹式选择
与过滤式选择不考虑后续学习器不同,包裹式选择直接把最终将要使用的学习器的性能作为特征子集的评价依据,也就是说,包裹式特征选择是为给定的学习器选择最有利的特征子集。
与过滤式选择相比,包裹式选择的效果一般会更好,但由于在特征选择过程中需要多长训练学习器,因此包裹式选择的计算开销要大很多。
LVW(Las Vegas Wrapper)是一种典型的包裹式特征选择方法,它在拉斯维加斯方法框架下使用随机策略来进行子集搜索,并以最终分类器的误差为特征子集评价准则。
嵌入式选择
在过滤式选择与包裹式选择方法中,特征选择过程与学习器训练过程有明显区别,与它们不同的是,嵌入式选择是将特征选择过程与学习器训练过程融合为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动地进行了特征选择。
基于 L1L1 正则化的学习方法就是一种嵌入式的特征选择方法,通过在目标函数中加入 L1L1 范数正则化,从而得到“稀疏”(sparsesparse)解,稀疏解可以使一些特征的权重为 00 ,那些非 00 的特征就可以视为是选择的特征,因此其特征选择过程与学习器训练过程融为一体,同时完成,可以视为是一种嵌入式的方法。值得一提的是,L1L1 范数相比于L2L2 范数更易获得稀疏解。
举例:
1. Filter
1.1 方差选择法
使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征的代码如下:
from sklearn.feature_selection import VarianceThreshold
#方差选择法,返回值为特征选择后的数据
#参数threshold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(iris.data)
1.2 相关系数法
使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用
feature_selection库的SelectKBest类结合相关系数来选择特征的代码如下:
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,
#输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(