注意
前往結尾下載完整範例程式碼。或透過 JupyterLite 或 Binder 在您的瀏覽器中執行此範例
管道 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)
一旦完成訓練,我們就可以對新的看不見的樣本進行預測。在這種情況下,特徵選擇器只會根據訓練期間儲存的資訊,選擇最具有區別性的特徵。然後,資料將傳遞給分類器,該分類器將進行預測。
在這裡,我們透過分類報告顯示最終指標。
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 秒)
相關範例