特征选择 Embedded
2021-9-5
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
notion image
 
嵌入法也是用机器学习的方法来选择特征,但是它和RFE的区别是它不是通过不停的筛掉特征来进行训练,而是使用的都是特征全集。在sklearn中,使用SelectFromModel函数来选择特征。
最常用的是使用L1正则化和L2正则化来选择特征。正则化惩罚项越大,那么模型的系数就会越小。当正则化惩罚项大到一定的程度的时候,部分特征系数会变成0,当正则化惩罚项继续增大到一定程度时,所有的特征系数都会趋于0。 一部分特征系数会更容易先变成0,这部分系数就是可以筛掉的,也就是说选择特征系数较大的特征。常用的L1正则化和L2正则化来选择特征的基学习器是逻辑回归。
此外也可以使用决策树或者GBDT。是不是所有的机器学习方法都可以作为嵌入法的基学习器呢?也不是,一般来说,可以得到特征系数coef或者可以得到特征重要度(feature importances)的算法才可以做为嵌入法的基学习器。

基于惩罚项的特征选择法

查看线性回归的特征重要性

可以在回归数据集上拟合一个线性回归模型,并检索包含为每个输入变量找到的系数的coeff_属性,这些系数可以为粗略的特征重要性评分提供基础。
notion image
 
 
基于征罚项的特征选择法其实是基于正则的特征选择法。正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。损失函数由原来的 变为 是模型系数组成的向量 (有些地方也叫参数parameter, coefficients), 一般是 或者 范数, 是一个可调的参数,控制着正则化的强度。当用在线性模型上时, 正则化和 正则化也称为Lasso和Ridge。
 

正则化Lasso

正则化将系数的1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成 0 。因此 正则化往往会使学到的模型很稀疏(系数经常为 0 ),这个特性使得 正则化成为一种很好的特征选择方法。 Scikit-learn为线性回归提供了Lasso, 为分类提供了L1逻辑回归。
可以看到,很多特征的系数都是0。如果继续增加alpha的值,得到的模型就会越来越稀疏,即越来越多的特征系数会变成0。
 
使用带惩罚项的基模型,除了筛选出特征外,同时也进行了降维。使用feature_selection库的SelectFromModel类结合带惩罚项的模型,来选择特征:
然而, 正则化像非正则化线性模型一样也是不稳定的,如果特征集合中具有相关联的特征,当数据发生细微变化时也有可能导致很大的模型差异。
 

正则化Ridge

正则化将系数向量的范数添加到了损失函数中。由于 惩罚项中系数是二次方的,这使得有着诸多差异,最明显的一点就是,正则化会让系数的取值变得平均。对于关联特征,这意味着能够获得更相近的对应系数。
为例,假设具有很强的关联,如果用正则化,不论学到的模型是还是 ,惩罚都是一样的,都是 。但是对于 来说,第一个模型的惩罚项是 ,但第二个模型的是 。可以看出,系数之和为常数时,各系数相等时惩罚是最小的,所以才有了会让各个系数趋于相同的特点。
可以看出, 正则化对于特征选择来说一种稳定的模型,不像 正则化那样,系数会因为细微的数据变化而波动。所以 正则化和 正则化提供的价值是不同的, 正则化对于特征理解来说更加有用:表示能力强的特征对应的系数是非零。
 
分别以10个不同的种子随机初始化运行10次,来观察 正则化的稳定性:
可以看出,不同的数据上线性回归得到的模型(系数)相差甚远,但对于正则化模型来说,结果中的系数非常的稳定,差别较小,都比较接近于1,能够反映出数据的内在结构。
 

结合

实际上, 惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个,所以没选到的特征不代表不重要,故可结合 惩罚项来优化。
具体操作:若一个特征在 中的权值为 1 ,选择在 中权值差别不大且在 中权值为 0 的特征构成同类集合,将这一 集合中的特征平分中的权值:
 
 
 

基于树的特征选取

分类和回归树(CART)等决策树算法根据用于选择分割点的标准(如 Gini 或熵)的减少来提供重要性分数。
同样的方法可以用于决策树的集合,例如随机森林和随机梯度提升算法。

决策树

 
 

随机森林

随机森林具有准确率高、鲁棒性好、易于使用等优点,这使得它成为了目前最流行的机器学习算法之一。随机森林提供了两种特征选择的方法:mean decrease impuritymean decrease accuracy

平均不纯度减少 mean decrease impurity

随机森林由多个决策树构成。决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用 基尼不纯度 或者 信息增益 ,对于回归问题,通常采用的是 方差 或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。
下边的例子是sklearn中基于随机森林的特征重要度度量方法:
这里特征得分实际上采用的是 Gini Importance ,使用基于不纯度的方法的时候要记住:
  • 这种方法存在偏向 ,对具有更多类别的变量会更有利;
  • 对于存在关联的多个特征,其中任意一个都可以作为指示器(优秀的特征),并且一旦某个特征被选择之后,其他特征的重要度就会急剧下降,因为不纯度已经被选中的那个特征降下来了,其他的特征就很难再降低那么多不纯度了,这样一来,只有先被选中的那个特征重要度很高,其他的关联特征重要度往往较低。在理解数据时,这就会造成误解,导致错误的认为先被选中的特征是很重要的,而其余的特征是不重要的,但实际上这些特征对响应变量的作用确实非常接近的(这跟Lasso是很像的)
 
特征随机选择方法稍微缓解了这个问题,但总的来说并没有完全解决。下面的例子中,X0、X1、X2是三个互相关联的变量,在没有噪音的情况下,输出变量是三者之和。
当计算特征重要性时,可以看到X1的重要度比X2的重要度要高出10倍,但实际上他们真正的重要度是一样的。尽管数据量已经很大且没有噪音,且用了20棵树来做随机选择,但这个问题还是会存在。
需要注意的一点是,关联特征的打分存在不稳定的现象,这不仅仅是随机森林特有的,大多数基于模型的特征选择方法都存在这个问题
 

平均精确率减少 Mean decrease accuracy

另一种常用的特征选择方法就是直接度量每个特征对模型精确率的影响。主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。很明显,对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大,但是对于重要的变量来说,打乱顺序就会降低模型的精确率。
这个方法sklearn中没有直接提供,但是很容易实现,下面继续在波士顿房价数据集上进行实现
在这个例子当中,LSTAT和RM这两个特征对模型的性能有着很大的影响,打乱这两个特征的特征值使得模型的性能下降了57%和56%。注意,尽管这些是在所有特征上进行了训练得到了模型,然后才得到了每个特征的重要性测试,这并不意味着扔掉某个或者某些重要特征后模型的性能就一定会下降很多,因为即便某个特征删掉之后,其关联特征一样可以发挥作用,让模型性能基本上不变。
 
 
notion image
 

GBDT

 

XGBoost

在XGBoost中提供了三种特征重要性的计算方法:
weight
  • 指在子树模型进行分类时,用到的特征次数,根据特征被用到的次数进行排序。
  • 该指标会将数值特征给予更高的权重,因为数值特征往往是连续的,变数也比分类特征多,分裂的空间就越大,所以这个指标会偏向数值特征,忽略分类特征
gain
  • 这是信息增益的泛化概念。是指在节点分裂是,该特征带来的信息增益
  • gain用到了熵,他可以方便的找出最直接的特征,即如果某个特征下label比较单一,那么这个特征就会比较重要
cover
  • 形象来说,就是树模型在分裂时,特征下的叶子结点涵盖的样本数除以特征用来分裂的次数。分裂越靠近根部,cover 值越大
  • cover对于分类特征更友好
如果有下游业务方,更建议用 cover 的特征重要性计算方法。当然,如果是单纯的模型调优,gain 能指出最重要的特征。这些特征,某些场景下还能总结成硬规则
可以看出,不同的特征重要性度量方法得出的结果也是不尽相同的
 
 

置换特征重要性

置换特征重要性是一种计算相对重要性分数的技术,它独立于所使用的模型。
首先,模型适合数据集,例如不支持原生特征重要性分数的模型。然后该模型用于对数据集进行预测,尽管数据集中的特征(列)的值是打乱的。对数据集中的每个特征重复此操作。然后整个过程重复 3、5、10 次或更多次。结果是每个输入特征的平均重要性分数(以及给定重复的分数分布)。
这种方法可用于回归或分类,并要求选择性能指标作为重要性得分的基础,例如回归的均方误差和分类的准确性。
排列特征选择可以通过permutation_importance() 函数使用,该函数采用拟合模型、数据集(训练或测试数据集都可以)和评分函数。
看一下这种使用不支持本机特征选择的算法进行特征选择的方法,特别是k-nearest neighbors
notion image
注意:结果可能会因算法或评估程序的随机性或数值精度的差异而有所不同。考虑运行几次并比较平均结果。
结果表明,这 10 个特征中可能有两个或三个对预测很重要。
 
分类
  • Scikit-Learn
  • 特征选择 Wrapper特征抽取 奇异值分解SVD
    目录