1. 简介
特征选择是一个很重要的数据预处理过程:
- 选择出重要的特征可以缓解维数灾难问题
- 去除不相关特征可以降低学习任务的难度
特征选择可分为子集搜索和子集评价:
- 子集搜索:前向搜索(逐渐增加特征),后向搜索(逐渐减少特征)
- 子集评价:可采用信息增益对子集进行评价
特征选择的方式有:
- 包裹式选择
- 过滤式选择
- 嵌入式选择
2. 包裹式(封装器法)
包裹式(封装器法)从初始特征集合中不断的选择特征子集,训练学习器,根据学习器的性能来对子集进行评价,直到选择出最佳的子集。包裹式特征选择直接针对给定学习器进行优化
2.1 循环特征选择
常用实现方法:循序特征选择。
- 循序向前特征选择:Sequential Forward Selection,SFS
- 循序向后特征选择:Sequential Backword Selection,SBS
SFS过程如下:
#加载数据集
from mlxtend.feature_selection import SequentialFeatureSelector as SFS #SFS
from mlxtend.data import wine_data #dataset
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
X, y = wine_data()
X.shape #(178, 13)
#数据预处理
X_train, X_test, y_train, y_test= train_test_split(X, y, stratify=y, test_size=0.3, random_state=1)
std = StandardScaler()
X_train_std = std.fit_transform(X_train)
#循序向前特征选择
knn = KNeighborsClassifier(n_neighbors=3)
sfs = SFS(estimator=knn, k_features=4, forward=True, floating=False, verbose=2, scoring='accuracy', cv=0)
sfs.fit(X_train_std, y_train) #xy不能是df
#查看特征索引
sfs.subsets_
可视化1
%matplotlib inline
from mlxtend.plotting import plot_sequential_feature_selection as plot_sfs
fig = plot_sfs(sfs.get_metric_dict(), kind='std_err')
查看 sfs.get_metric_dict()
结果
可视化2
knn = KNeighborsClassifier(n_neighbors=3)
sfs2