Wrapper 方法是一种特征选择方法,它将特征选择问题转化为子集选择问题,使用模型的性能作为评估指标,选择最优的特征子集。Wrapper 方法相对于 Filter 方法来说更加精确,但是计算量更大,需要在模型上反复训练,因此在数据量较大时可能会面临计算效率的问题。
Wrapper 方法的核心思想是通过特征子集来训练模型,评估特征子集的好坏,从而选择最优的特征子集。常用的 Wrapper 方法包括递归特征消除(Recursive Feature Elimination,简称 RFE)、前向搜索(Forward Selection)和后向搜索(Backward Elimination)等。
递归特征消除(Recursive Feature Elimination,简称 RFE)
递归特征消除(Recursive Feature Elimination,简称 RFE)是一种 Wrapper 方法,它通过不断迭代,反复训练模型,删除不重要的特征,直到达到指定的特征数或者性能最优的特征子集为止。RFE 方法的核心思想是通过模型的性能评估来选择最优的特征子集。
RFE 方法的具体实现过程如下:
- 训练模型,得到模型的权重系数或者特征重要性;
- 去除权重系数或者特征重要性最小的特征;
- 重新训练模型,直到达到指定的特征数或者性能最优的特征子集为止。
RFE 方法的优点是它可以考虑特征之间的相互作用和组合,缺点是它需要反复训练模型,计算量较大,对于大规模数据集和特征数较多的情况,可能会面临效率问题。
下面是一个使用递归特征消除(RFE)方法进行特征选择的 Python 示例代码:
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
# 加载数据集
cancer = load_breast_cancer()
X, y = cancer.data, cancer.target
# 使用递归特征消除方法进行特征选择
estimator = LogisticRegression()
selector = RFE(estimator, n_features_to_select=10, step=1)
selector.fit(X, y)
# 输出结果
print("原始数据特征数:", X.shape[1])
print("特征选择后数据特征数:", selector.n_features_)
在这个示例中,我们使用递归特征消除方法对乳腺癌数据集进行特征选择,并选择了 10 个最优特征。需要注意的是,递归特征消除方法需要指定一个估计器(estimator),在本例中我们使用了逻辑回归模型作为估计器,同时还需要指定每次迭代中删除的特征数(step),这个数值越小,需要迭代的次数就越多。
总之,递归特征消除方法可以选择最优的特征子集,提高模型的准确性和泛化能力,但计算量较大,需要对特征子集进行多次训练,因此需要根据数据集的大小和特征数量来选择合适的方法。
前向搜索(Forward Selection)
前向搜索是一种 Wrapper 方法,用于特征选择。它的核心思想是从空特征集开始,每次向其中添加一个特征,直到达到指定数量的特征或者无法继续提升模型的性能为止。在每一次添加特征后,需要重新训练模型,并使用交叉验证等技术评估模型性能。
前向搜索算法的伪代码如下:
- 初始化当前特征集为空
- 初始化最优特征集为空
- 初始化最优性能指标为负无穷
- 迭代以下步骤,直到满足停止条件:
- 对于每个未被选择的特征:
- 将当前特征集和该特征组合成一个新的特征集
- 使用新的特征集训练模型
- 使用交叉验证等技术评估模型性能
- 如果模型性能优于当前最优性能指标,则更新最优特征集和最优性能指标
- 如果无法找到新的特征,则终止算法
- 对于每个未被选择的特征:
下面是一个使用前向搜索方法进行特征选择的 Python 示例代码:
from sklearn.datasets import load_breast_cancer
from sklearn.feature_selection import RFECV
from sklearn.model_selection import StratifiedKFold
from sklearn.linear_model import LogisticRegression
# 加载数据集
cancer = load_breast_cancer()
X, y = cancer.data, cancer.target
# 使用前向搜索方法进行特征选择
estimator = LogisticRegression()
selector = RFECV(estimator, step=1, cv=StratifiedKFold(5), scoring='accuracy')
selector.fit(X, y)
# 输出结果
print("原始数据特征数:", X.shape[1])
print("特征选择后数据特征数:", selector.n_features_)
在这个示例中,我们使用前向搜索方法对乳腺癌数据集进行特征选择。需要注意的是,我们使用了 RFECV 类,它是一个包装器类,可以自动选择最优特征数,同时还可以进行交叉验证和性能评估等操作。在初始化 RFECV 类时,我们需要指定估计器(estimator)、每次迭代中删除的特征数(step)、交叉验证分割器(cv)和性能评估指标(scoring)等参数。
总之,前向搜索方法可以选择最优的特征子集,提高模型的准确性和泛化能力,但计算量较大,需要对特征子集进行多次训练,因此需要根据数据集的大小和特征数量来选择合适的方法。
后向搜索(Backward Elimination)
后向搜索(Backward Elimination)是一种 Wrapper 方法,其思想是从初始的特征集合中逐步删除特征,直到达到一个最优的特征子集。在每一次迭代中,后向搜索方法删除一个特征,并使用剩余的特征来重新训练模型,最终选择性能最优的特征子集。
下面是一个使用后向搜索方法进行特征选择的 Python 示例代码:
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from mlxtend.feature_selection import SequentialFeatureSelector as SFS
# 加载数据集
cancer = load_breast_cancer()
X, y = cancer.data, cancer.target
# 使用后向搜索方法进行特征选择
estimator = LogisticRegression()
selector = SFS(estimator, k_features=10, forward=False, floating=False, scoring='accuracy', cv=5)
selector.fit(X, y)
# 输出结果
print("原始数据特征数:", X.shape[1])
print("特征选择后数据特征数:", selector.k_features_)
在这个示例中,我们使用后向搜索方法对乳腺癌数据集进行特征选择,并选择了 10 个最优特征。需要注意的是,mlxtend 库提供了一个方便的工具 SequentialFeatureSelector,它可以帮助我们在训练模型的过程中自动进行特征选择,并返回最终的特征子集。
总之,后向搜索方法可以选择最优的特征子集,提高模型的准确性和泛化能力,但计算量较大,需要对特征子集进行多次训练,因此需要根据数据集的大小和特征数量来选择合适的方法。