【数据准备和特征工程】特征选择
作者:互联网
【数据准备和特征工程】特征选择
sklearn.feature_selection模块中的类可用于样本集的特征选择/降维,以提高估计器的准确度得分或提高其在非常高维数据集上的性能。
1.删除低方差的特征
VarianceThreshold是一种简单的特征选择基线方法。它会删除所有方差不满足某个阈值的特征。默认情况下,它会删除所有零方差特征,即在所有样本中具有相同值的特征。
例如,假设我们有一个具有布尔特征的数据集,并且我们想要删除超过 80% 的样本中为 1 或 0(打开或关闭)的所有特征。布尔特征是伯努利随机变量,这些变量的方差由下式给出
V
a
r
[
x
]
=
p
(
1
−
p
)
Var[x]=p(1-p)
Var[x]=p(1−p)
所以我们可以使用阈值进行选择:
0.8
×
(
1
−
0.8
)
0.8 \times (1 - 0.8)
0.8×(1−0.8)
>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
>>> sel.fit_transform(X)
array([[0, 1],
[1, 0],
[0, 0],
[1, 1],
[1, 0],
[1, 1]])
2.单变量特征选择
单变量特征选择通过基于单变量统计测试选择最佳特征来工作。它可以看作是估计器的预处理步骤。常用的方法有:
-
SelectKBest
删除除 k 得分最高的功能 -
SelectPercentile
删除除用户指定的最高得分百分比的特征之外的所有特征 -
对每个特征使用常见的单变量统计测试:假阳性率
SelectFpr
、错误发现率SelectFdr
或家庭错误SelectFwe
。 -
GenericUnivariateSelect
允许使用可配置的策略执行单变量特征选择。这允许使用超参数搜索估计器选择最佳单变量选择策略。
这些对象将一个评分函数作为输入,该函数返回单变量分数和 p 值(或仅SelectKBest
和 的分数SelectPercentile
):
基于 F 检验的方法估计两个随机变量之间的线性相关程度。另一方面,互信息方法可以捕获任何类型的统计依赖性,但由于是非参数的,它们需要更多样本才能进行准确估计。
稀疏数据的特征选择
如果您使用稀疏数据(即表示为稀疏矩阵的数据), chi2
, mutual_info_regression
,mutual_info_classif
将处理数据而不使其变得密集。
警告
注意不要对分类问题使用回归评分函数,你会得到无用的结果。
例子:
3.递归特征消除
给定一个为特征分配权重的外部估计器(例如,线性模型的系数),递归特征消除的目标RFE
是通过递归地考虑越来越小的特征集来选择特征。首先,估计器在初始特征集上进行训练,每个特征的重要性通过任何特定属性(例如coef_
, feature_importances_
)或可调用来获得。然后,从当前的特征集中剪除最不重要的特征。该过程在修剪后的集合上递归重复,直到最终达到要选择的所需特征数量。
RFECV
在交叉验证循环中执行 RFE 以找到最佳特征数量。
例子:
4.使用 SelectFromModel 选择特征
SelectFromModel
是一个元转换器,可以与任何通过特定属性(例如 coef_
, feature_importances_
)或通过importance_getter
拟合后的可调用对象为每个特征分配重要性的估计器一起使用。如果特征值的相应重要性低于提供的 threshold
参数,则认为这些特征不重要并被删除。除了以数字方式指定阈值外,还有用于使用字符串参数查找阈值的内置启发式方法。可用的启发式方法是“均值”、“中值”和浮点数,例如“0.1*均值”。结合threshold
标准,可以使用该 max_features
参数来设置要选择的特征数量的限制。
例子
4.1 基于 L1 的特征选择
使用 L1 范数惩罚的线性模型具有稀疏解:它们的许多估计系数为零。当目标是减少数据的维度以与另一个分类器一起使用时,它们可以与SelectFromModel
选择非零系数一起使用。特别是,用于此目的的稀疏估计器是Lasso
用于回归,LogisticRegression
以及LinearSVC
用于分类:
>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)
使用 SVM 和逻辑回归,参数 C 控制稀疏性:C 越小,选择的特征越少。使用 Lasso,alpha 参数越高,选择的特征就越少。
例子:
- 使用稀疏特征对文本文档进行分类:比较不同的文档分类算法,包括基于 L1 的特征选择。
L1-恢复和压缩传感
对于 alpha 的良好选择,只要满足某些特定条件,Lasso只需使用很少的观察值就可以完全恢复一组精确的非零变量。特别是,样本数量应该“足够大”,否则 L1 模型将随机执行,其中“足够大”取决于非零系数的数量、特征数量的对数、噪声量、非零系数的最小绝对值,以及设计矩阵 X 的结构。此外,设计矩阵必须显示某些特定属性,例如不太相关。
没有一般规则来选择用于恢复非零系数的 alpha 参数。它可以通过交叉验证 (LassoCV
或LassoLarsCV
) 来设置,尽管这可能会导致惩罚不足的模型:包括少量不相关的变量不会对预测分数有害。相反, BIC ( LassoLarsIC
) 倾向于设置较高的 alpha 值。
参考Richard G. Baraniuk “压缩传感”,IEEE 信号处理杂志 [120] 2007 年 7 月 http://users.isr.ist.utl.pt/~aguiar/CS_notes.pdf
4.2 基于树的特征选择
基于树的估计器(参见sklearn.tree
模块中的模块和树的森林sklearn.ensemble
)可用于计算基于杂质的特征重要性,进而可用于丢弃不相关的特征(与SelectFromModel
元变换器结合使用时):
>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier(n_estimators=50)
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_
array([ 0.04..., 0.05..., 0.4..., 0.4...])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 2)
例子:
-
森林中的特征重要性:合成数据示例,显示实际有意义的特征的恢复。
-
具有平行树木森林的像素重要性:人脸识别数据示例。
5.顺序特征选择
顺序特征选择sfs (SFS) 在 SequentialFeatureSelector
变压器中可用。SFS 可以向前或向后:
Forward-SFS 是一个贪婪的过程,它迭代地找到最好的新特征来添加到选定的特征集中。具体来说,我们最初从零特征开始,当估计器在这个单一特征上训练时,找到最大化交叉验证分数的一个特征。一旦选择了第一个特征,我们通过向所选特征集添加一个新特征来重复该过程。当达到所需的选定特征数量时,该过程停止,由n_features_to_select
参数确定。
Backward-SFS 遵循相同的想法,但工作方向相反:我们不是从没有特征开始,然后贪婪地添加特征,而是从_所有_特征开始,然后从集合中贪婪地_删除特征。_该 direction
参数控制是使用前向还是后向 SFS。
一般来说,前向和后向选择不会产生相同的结果。此外,根据请求的所选特征数量,一个可能比另一个快得多:如果我们有 10 个特征并要求选择 7 个特征,则前向选择需要执行 7 次迭代,而后向选择只需要执行 3 次。
SFS 的不同之处RFE
在于 SelectFromModel
它不需要底层模型公开一个coef_
或feature_importances_
属性。然而,SFS
与其他方法相比,考虑到需要评估更多模型,它可能会更慢。例如,在后向选择中,使用 k 折交叉验证从m
特征到特征的迭代需要拟合模型,而 SelectFromModel
只需要一次拟合,并且 总是只进行一次拟合并且不需要迭代.
例子
6.作为管道一部分的特征选择
特征选择通常用作进行实际学习之前的预处理步骤。在 scikit-learn 中推荐的方法是使用Pipeline
:
clf = Pipeline([
('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
('classification', RandomForestClassifier())
])
clf.fit(X, y)
在此代码段中,我们使用LinearSVC
耦合SelectFromModel
来评估特征重要性并选择最相关的特征。然后,RandomForestClassifier
在转换后的输出上训练 a,即仅使用相关特征。您可以使用其他特征选择方法以及提供评估特征重要性的方法的分类器执行类似的操作。有关更多详细信息,请参阅Pipeline
示例
7.参考资料
https://scikit-learn.org/stable/modules/feature_selection.html#recursive-feature-elimination
标签:工程,特征选择,feature,特征,使用,SelectFromModel,sklearn 来源: https://blog.csdn.net/weixin_46366341/article/details/122763619