管道 ANOVA SVM#

此範例說明如何輕鬆地將特徵選擇整合到機器學習管道中。

我們也說明您可以輕鬆地檢查管道的一部分。

# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

我們將從產生二元分類資料集開始。隨後,我們將資料集分成兩個子集。

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 產生