管道 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)
Pipeline(steps=[('selectkbest', SelectKBest(k=3)), ('linearsvc', LinearSVC())])
在 Jupyter 环境中,请重新运行此单元格以显示 HTML 表示形式或信任笔记本。
在 GitHub 上,HTML 表示形式无法呈现,请尝试使用 nbviewer.org 加载此页面。


训练完成后,我们可以预测新的未知样本。在这种情况下,特征选择器将仅根据训练期间存储的信息选择最具判别力的特征。然后,数据将传递给分类器,分类器将进行预测。

在这里,我们通过分类报告显示最终指标。

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 秒)

相关示例

基于模型和顺序的特征选择

基于模型和顺序的特征选择

使用交叉验证的网格搜索的自定义重新拟合策略

使用交叉验证的网格搜索的自定义重新拟合策略

使用交叉验证的递归特征消除

使用交叉验证的递归特征消除

单变量特征选择

单变量特征选择

由 Sphinx-Gallery 生成的图库