Einführung
In diesem Lab werden zwei Ansätze zur Featureauswahl demonstriert: modellbasiert und sequenzielle Featureauswahl. Ziel ist es, die wichtigsten Features aus einem gegebenen Datensatz auszuwählen. Wir verwenden den Diabetes-Datensatz, der aus 10 Features besteht, die von 442 Diabetes-Patienten gesammelt wurden.
Tipps für die VM
Nachdem der VM-Start abgeschlossen ist, klicken Sie in der oberen linken Ecke, um zur Registerkarte Notebook zu wechseln und Jupyter Notebook für die Übung zu nutzen.
Manchmal müssen Sie einige Sekunden warten, bis Jupyter Notebook vollständig geladen ist. Die Validierung von Vorgängen kann aufgrund von Einschränkungen in Jupyter Notebook nicht automatisiert werden.
Wenn Sie bei der Lernphase Probleme haben, können Sie Labby gerne fragen. Geben Sie nach der Sitzung Feedback, und wir werden das Problem für Sie prompt beheben.
Laden der Daten
Wir laden den Diabetes-Datensatz aus scikit-learn und drucken seine Beschreibung.
from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
X, y = diabetes.data, diabetes.target
print(diabetes.DESCR)
Feature-Wichtigkeit aus Koeffizienten
Um eine Vorstellung von der Wichtigkeit der Features zu erhalten, verwenden wir den RidgeCV-Schätzer. Die Features mit dem höchsten absoluten coef_-Wert werden als die wichtigsten betrachtet.
from sklearn.linear_model import RidgeCV
ridge = RidgeCV(alphas=np.logspace(-6, 6, num=5)).fit(X, y)
importance = np.abs(ridge.coef_)
feature_names = np.array(diabetes.feature_names)
plt.bar(height=importance, x=feature_names)
plt.title("Feature importances via coefficients")
plt.show()
Auswählen von Features basierend auf der Wichtigkeit
Wir wählen die zwei am wichtigsten nach den Koeffizienten erscheinenden Features mit SelectFromModel. SelectFromModel akzeptiert einen threshold-Parameter und wird die Features auswählen, deren Wichtigkeit (definiert durch die Koeffizienten) über diesem Schwellenwert liegt.
from sklearn.feature_selection import SelectFromModel
threshold = np.sort(importance)[-3] + 0.01
sfm = SelectFromModel(ridge, threshold=threshold).fit(X, y)
print(f"Features selected by SelectFromModel: {feature_names[sfm.get_support()]}")
Auswählen von Features mit sequentieller Featureauswahl
Wir verwenden den Sequential Feature Selector (SFS), um Features auszuwählen. SFS ist ein greedy-Verfahren, bei dem wir in jeder Iteration das beste neue Feature auswählen, das wir zu unseren ausgewählten Features hinzufügen möchten, basierend auf einem Kreuzvalidierungsscore. Wir können auch in die entgegengesetzte Richtung gehen (rückwärts SFS), d.h. beginnen wir mit allen Features und wählen schrittweise Features aus, die wir nacheinander entfernen möchten.
from sklearn.feature_selection import SequentialFeatureSelector
sfs_forward = SequentialFeatureSelector(ridge, n_features_to_select=2, direction="forward").fit(X, y)
sfs_backward = SequentialFeatureSelector(ridge, n_features_to_select=2, direction="backward").fit(X, y)
print(f"Features selected by forward sequential selection: {feature_names[sfs_forward.get_support()]}")
print(f"Features selected by backward sequential selection: {feature_names[sfs_backward.get_support()]}")
Zusammenfassung
In diesem Lab wurden zwei Ansätze zur Featureauswahl demonstriert: modellbasiert und sequentielle Featureauswahl. Wir haben den RidgeCV-Schätzer verwendet, um die Wichtigkeit der Features zu bestimmen, und SelectFromModel, um Features basierend auf ihrer Wichtigkeit auszuwählen. Der Sequential Feature Selector ist ein greedy-Verfahren, bei dem wir in jeder Iteration das beste neue Feature auswählen, das wir zu unseren ausgewählten Features hinzufügen möchten, basierend auf einem Kreuzvalidierungsscore.