管道 ANOVA SVM#
此示例展示了如何将特征选择轻松集成到机器学习管道中。
我们还将展示如何轻松检查管道的一部分。
我们将首先生成一个二元分类数据集。随后,我们将数据集分成两个子集。
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
X, y = make_classification(
n_features=20,
n_informative=3,
n_redundant=0,
n_classes=2,
n_clusters_per_class=2,
random_state=42,
)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
特征选择中常见的一个错误是在完整数据集上搜索判别特征的子集,而不是仅使用训练集。使用 scikit-learn Pipeline
可以防止犯此类错误。
在这里,我们将演示如何构建一个管道,其中第一步是特征选择。
在训练数据上调用 fit
时,将选择特征子集并存储这些选定特征的索引。特征选择器随后将减少特征数量,并将此子集传递给将要训练的分类器。
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.pipeline import make_pipeline
from sklearn.svm import LinearSVC
anova_filter = SelectKBest(f_classif, k=3)
clf = LinearSVC()
anova_svm = make_pipeline(anova_filter, clf)
anova_svm.fit(X_train, y_train)
训练完成后,我们可以预测新的未知样本。在这种情况下,特征选择器将仅根据训练期间存储的信息选择最具判别力的特征。然后,数据将传递给分类器,分类器将进行预测。
在这里,我们通过分类报告显示最终指标。
from sklearn.metrics import classification_report
y_pred = anova_svm.predict(X_test)
print(classification_report(y_test, y_pred))
precision recall f1-score support
0 0.92 0.80 0.86 15
1 0.75 0.90 0.82 10
accuracy 0.84 25
macro avg 0.84 0.85 0.84 25
weighted avg 0.85 0.84 0.84 25
请注意,您可以检查管道中的步骤。例如,我们可能对分类器的参数感兴趣。由于我们选择了三个特征,因此我们预计会有三个系数。
anova_svm[-1].coef_
array([[0.75788833, 0.27161955, 0.26113448]])
但是,我们不知道从原始数据集中选择了哪些特征。我们可以通过几种方式进行。在这里,我们将反转这些系数的变换以获取有关原始空间的信息。
anova_svm[:-1].inverse_transform(anova_svm[-1].coef_)
array([[0. , 0. , 0.75788833, 0. , 0. ,
0. , 0. , 0. , 0. , 0.27161955,
0. , 0. , 0. , 0. , 0. ,
0. , 0. , 0. , 0. , 0.26113448]])
我们可以看到,非零系数的特征是第一步选择的特征。
脚本总运行时间:(0 分 0.015 秒)
相关示例
基于模型和顺序的特征选择
使用交叉验证的网格搜索的自定义重新拟合策略
使用交叉验证的递归特征消除
单变量特征选择