Hinweis
Gehe zum Ende, um den vollständigen Beispielcode herunterzuladen oder dieses Beispiel über JupyterLite oder Binder in deinem Browser auszuführen.
Pipeline ANOVA SVM#
Dieses Beispiel zeigt, wie eine Merkmalsauswahl einfach in eine Machine-Learning-Pipeline integriert werden kann.
Wir zeigen auch, dass Sie einfach Teile der Pipeline inspizieren können.
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
Wir beginnen mit der Generierung eines binären Klassifizierungsdatensatzes. Anschließend teilen wir den Datensatz in zwei Untergruppen auf.
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)
Ein häufiger Fehler bei der Merkmalsauswahl ist die Suche nach einer Teilmenge diskriminierender Merkmale im gesamten Datensatz, anstatt nur den Trainingsdatensatz zu verwenden. Die Verwendung der Pipeline von scikit-learn verhindert solche Fehler.
Hier demonstrieren wir, wie eine Pipeline aufgebaut wird, bei der der erste Schritt die Merkmalsauswahl ist.
Beim Aufruf von fit auf den Trainingsdaten wird eine Teilmenge von Merkmalen ausgewählt und der Index dieser ausgewählten Merkmale gespeichert. Der Merkmalsselektor reduziert anschließend die Anzahl der Merkmale und übergibt diese Teilmenge an den Klassifikator, der trainiert wird.
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)
Nachdem das Training abgeschlossen ist, können wir Vorhersagen für neue, unsichtbare Stichproben treffen. In diesem Fall wählt der Merkmalsselektor nur die diskriminierendsten Merkmale basierend auf den während des Trainings gespeicherten Informationen aus. Dann werden die Daten an den Klassifikator übergeben, der die Vorhersage trifft.
Hier zeigen wir die endgültigen Metriken über einen Klassifizierungsbericht.
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
Beachten Sie, dass Sie einen Schritt in der Pipeline inspizieren können. Zum Beispiel könnten wir uns für die Parameter des Klassifikators interessieren. Da wir drei Merkmale ausgewählt haben, erwarten wir drei Koeffizienten.
anova_svm[-1].coef_
array([[0.75788833, 0.27161955, 0.26113448]])
Wir wissen jedoch nicht, welche Merkmale aus dem ursprünglichen Datensatz ausgewählt wurden. Wir könnten auf verschiedene Weisen vorgehen. Hier werden wir die Transformation dieser Koeffizienten invertieren, um Informationen über den ursprünglichen Raum zu erhalten.
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]])
Wir sehen, dass die Merkmale mit nicht-null Koeffizienten die vom ersten Schritt ausgewählten Merkmale sind.
Gesamtlaufzeit des Skripts: (0 Minuten 0,014 Sekunden)
Verwandte Beispiele
Rekursive Merkmalseliminierung mit Kreuzvalidierung
Benutzerdefinierte Refit-Strategie einer Gitter-Suche mit Kreuzvalidierung