7.4 特征选择

  机器学习被广泛定义为“利用经验来改善计算机系统的自身性能”。事实上,“经验”在计算机中主要以数据的形式存在的,因此数据是机器学习的前提和基础。数据来源多种多样,它可以是结构数据,如数值型、分类型,也可以是非结构数据,如文本、语音、图片、视频。对于所有机器学习模型,这些原始数据必须以特征的形式加入到机器学习模型当中,并进行一定的提取和筛选工作。所谓特征提取,就是逐条将原始数据转化为特征向量的形式,此过程涉及数据特征的量化表示;而特征筛选是在已提取特征的基础上,进一步对高维度和已量化的特征向量进行选择,获取对指定任务更有效果的特征组合以模型性能。
  在机器学习和模式识别中,特征是在观测现象中的一种独立、可测量的属性。选择信息量大的、有差别性的、独立的特征是模式识别、分类和回归问题的关键一步,其终极目的在于最大限度地从原始数据中提出特征以供算法和模型使用。特征工程的好坏将会影响整个模型的预测性能,另一方面,相比一些复杂的算法,灵活地处理好数据经常会取到意想不到的收益。
  数据和特征决定了机器学习的上限,而模型和算法是在逼近这个上限。简言之,好的数据和特征是所有模型和算法发挥到极致的前提。

7.4.1 特征选择的原因

  不同的特征对模型的准确度的影响不同,有些特征与要解决的问题不相关,有些特征是冗余信息,这些特征都应该被移除掉。对于当前学习任务有用的属性称为相关特征(relevant feature),对于当前学习任务无用的属性称为无关特征(irrelevant feature)。
  特征选择是自动地选择出对于问题最重要的那些特征子集的过程。进行特征选择有两个重要原因:
  首先维数灾难问题就是由于属性过多造成的。若挑选出重要特征,使得后续学习过程仅仅需要在这一小部分特征上构建模型,则维数灾难问题会大大减轻。其次去除不相关特征通常会降低学习任务的难度。
  特征选择必须确保不丢失重要信息,若重要信息缺失则学习效果会大打折扣。通常来说,从两个方面考虑来选择特征:

  • 1.特征是否发散:如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
  • 2.特征与目标的相关性:这点比较显见,与目标相关性高的特征,应当优选选择。除方差法外,本文介绍的其他方法均从相关性考虑。
      常见的特征选择方法大致分为三类:过滤式(filter)、包裹式(wrapper)、嵌入式(embedding)。我们使用sklearn中的feature_selection库来进行特征选择。

    7.4.2 过滤式选择

      过滤式特征选择按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。

    1. 方差选择法

      方差很小的属性,意味着该属性的识别能力很差。极端情况下,方差为0,意味着该属性在所有样本上都是一个值,可以通过scikit-learn提供的VarianceThreshold来剔除。示例代码:
    from sklearn.feature_selection import VarianceThreshold 
    #方差选择法,返回值为特征选择后的数据
    #参数threshold为方差的阈值
    VarianceThreshold(threshold=3).fit_transform(data)
    threshold:一个浮点数,指定方差的阈值,低于此阈值的将被剔除。
    data:样本数据。
    fit_transform:从样本数据中学习方差,然后执行特征选择。

    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(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)
      SelectKBest:保留在该统计指标上得分最高的K个特征。
      score_func:给出统计指标的函数,其参数为数组X和数组y,返回值为(score,pvalues)。
      f_classif:根据方差分析,ANOVA的原理,依靠F-分布为概率分布的依据,利用平方和与自由度所计算的组间与组内均方估计出F值,适用于分离问题。

    3. 卡方检验

      经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:

卡方检验

  这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

4. 互信息法

  经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:


互信息法

  为了处理定量数据,最大信息系数法被提出,使用feature_selection库的SelectKBest类结合最大信息系数法来选择特征的代码如下:

from sklearn.feature_selection import SelectKBest
from minepy import MINE

#由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5
def mic(x, y):
     m = MINE()
     m.compute_score(x, y)
     return (m.mic(), 0.5)

#选择K个最好的特征,返回特征选择后的数据
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

7.4.3 包裹式选择

  包裹式特征选择根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。这类方法的核心思想在于,给定了某种模型,及预测效果评价的方法,然后针对特征空间中的不同子集,计算每个子集的预测效果,效果最好的,即作为最终被挑选出来的特征子集。注意集合的子集是一个指数的量级,故此类方法计算量较大。故而针对如何高效搜索特征空间子集,就产生了不同的算法。其中有一种简单有效的方法叫贪婪搜索策略,包括前向选择与后向删除。在前向选择方法中,初始化一个空的特征集合,逐步向其中添加新的特征,如果该特征能提高预测效果,即得以保留,否则就扔掉。后向删除即是说从所有特征构成的集合开始,逐步删除特征,只要删除后模型预测效果提升,即说明删除动作有效,否则就还是保留原特征。要注意到,包裹式方法要求针对每一个特征子集重新训练模型,因此计算量还是较大的。
  通常,将过滤式方法的高效与包裹式方法的高准确率进行结合,可得到更优的特征子集。混合特征选择过程一般由两个阶段组成:
  1)使用Filter方法初步剔除大部分无关或噪声特征,只保留少量特征,从而有效地减小后续搜索过程的规模。
  2)将剩余的特征连同样本数据作为输入参数传递给Wrapper选择方法,以进一步优化选择重要的特征。
  优点:准确率高。
  缺点:为选择出性能最好的特征子集,Wrapper算法需要的计算量巨大;该方法所选择的特征子集依赖于具体学习机;容易产生“过适应”问题,推广性能较差。

递归特征消除法

  递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression

#递归特征消除法,返回特征选择后的数据
#参数estimator为基模型
#参数n_features_to_select为选择的特征个数
RFE(estimator=LogisticRegression(), n_features_to_select=2).fit_transform(data, target)

  estimator: 一个学习器,它必须提供一个fit方法和一个coef_属性。
  n_features_to_select:一个整数或None,指定要选出几个特征。如果为None,默认选取一半的特征。

7.4.4 嵌入式选择

  嵌入式特征选择先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于过滤式方法,但是是通过训练来确定特征的优劣。

  • 优点:相对于包裹式方法,不用将训练数据集分成训练集和测试集两部分,避免了为评估每一个特征子集对学习机所进行的从头开始的训练,可以快速地得到最佳特征子集,是一种高效的特征选择方法。
  • 缺点:构造一个合适的函数优化模型是该方法的难点。
      scikit-learn提供了SelectFromModel来实现嵌入式特征选取。SelectFromModel使用外部提供的estimator来工作。当某个特征对应的coef或者feature_importance低于某个阈值时,该特征将被移除。也可以不指定阈值,而使用启发式的方法,如指定均值mean,指定中位数median或者指定这些统计量的倍数。

    1. 基于惩罚项的特征选择法

      使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带L1惩罚项的逻辑回归模型,来选择特征的代码如下:
    from sklearn.feature_selection import SelectFromModel
    from sklearn.linear_model import LogisticRegression
    #带L1惩罚项的逻辑回归作为基模型的特征选择
    SelectFromModel(LogisticRegression(penalty="l1", C=0.1)).fit_transform(iris.data, iris.target)

    2. 基于树模型的特征选择法

      树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:
    from sklearn.feature_selection import SelectFromModel
    from sklearn.ensemble import GradientBoostingClassifier
    #GBDT作为基模型的特征选择
    SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)

    回顾

所属方式说明
VarianceThresholdFilter方差选择法
SelectKBestFilter可选关联系数、卡方校验、最大信息系数作为得分计算的方法
RFEWrapper递归地训练基模型,将权值系数较小的特征从特征集合中消除
SelectFromModelEmbedded训练基模型,选择权值系数较高的特征
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值