1.13. Feature selection#

Die Klassen im Modul sklearn.feature_selection können für die Merkmalsauswahl/Dimensionsreduktion auf Stichprobensätzen verwendet werden, um entweder die Genauigkeitsbewertungen von Schätzern zu verbessern oder deren Leistung bei sehr hochdimensionalen Datensätzen zu steigern.

1.13.1. Entfernen von Merkmalen mit geringer Varianz#

VarianceThreshold ist ein einfacher Basisansatz zur Merkmalsauswahl. Es entfernt alle Merkmale, deren Varianz einen bestimmten Schwellenwert nicht erreicht. Standardmäßig entfernt es alle Merkmale mit Nullvarianz, d. h. Merkmale, die in allen Stichproben den gleichen Wert haben.

Als Beispiel nehmen wir an, wir haben einen Datensatz mit booleschen Merkmalen und möchten alle Merkmale entfernen, die in mehr als 80 % der Stichproben entweder eins oder null (an oder aus) sind. Boolesche Merkmale sind Bernoulli-Zufallsvariablen, und die Varianz solcher Variablen ist gegeben durch

\[\mathrm{Var}[X] = p(1 - p)\]

Daher können wir mit dem Schwellenwert .8 * (1 - .8) auswählen.

>>> from sklearn.feature_selection import VarianceThreshold
>>> X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
>>> sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
>>> sel.fit_transform(X)
array([[0, 1],
       [1, 0],
       [0, 0],
       [1, 1],
       [1, 0],
       [1, 1]])

Wie erwartet hat VarianceThreshold die erste Spalte entfernt, die eine Wahrscheinlichkeit von \(p = 5/6 > .8\) hat, eine Null zu enthalten.

1.13.2. Univariate Merkmalsauswahl#

Die univariate Merkmalsauswahl wählt die besten Merkmale basierend auf univariaten statistischen Tests aus. Sie kann als Vorverarbeitungsschritt für einen Schätzer betrachtet werden. Scikit-learn stellt Routinen zur Merkmalsauswahl als Objekte zur Verfügung, die die transform-Methode implementieren.

  • SelectKBest entfernt alle bis auf die \(k\) am höchsten bewerteten Merkmale.

  • SelectPercentile entfernt alle bis auf einen vom Benutzer angegebenen höchsten Prozentsatz der besten Merkmale.

  • unter Verwendung gängiger universitärer statistischer Tests für jedes Merkmal: falsch positive Rate SelectFpr, falsch entdeckte Rate SelectFdr oder Familien-Fehler SelectFwe.

  • GenericUnivariateSelect ermöglicht die univariate Merkmalsauswahl mit einer konfigurierbaren Strategie. Dies ermöglicht die Auswahl der besten univariaten Auswahlstrategie mit einem Hyperparameter-Suchschätzer.

Zum Beispiel können wir einen F-Test verwenden, um die beiden besten Merkmale für einen Datensatz wie folgt abzurufen.

>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectKBest
>>> from sklearn.feature_selection import f_classif
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> X_new = SelectKBest(f_classif, k=2).fit_transform(X, y)
>>> X_new.shape
(150, 2)

Diese Objekte nehmen eine Scoring-Funktion entgegen, die univariate Scores und p-Werte zurückgibt (oder nur Scores für SelectKBest und SelectPercentile).

Die auf dem F-Test basierenden Methoden schätzen den Grad der linearen Abhängigkeit zwischen zwei Zufallsvariablen ab. Auf der anderen Seite können Mutual-Information-Methoden jede Art von statistischer Abhängigkeit erfassen, erfordern jedoch als nichtparametrische Methoden mehr Stichproben für eine genaue Schätzung. Beachten Sie, dass der \(\chi^2\)-Test nur auf nicht-negative Merkmale, wie z. B. Häufigkeiten, angewendet werden sollte.

Warnung

Achten Sie darauf, keine Scoring-Funktion für Regression mit einem Klassifizierungsproblem zu verwenden, da dies zu nutzlosen Ergebnissen führt.

Hinweis

SelectPercentile und SelectKBest unterstützen auch die unüberwachte Merkmalsauswahl. Man muss eine score_func bereitstellen, bei der y=None ist. Die score_func sollte intern X verwenden, um die Scores zu berechnen.

Beispiele

1.13.3. Rekursive Merkmalselimination#

Gegeben einen externen Schätzer, der Gewichte an Merkmale zuweist (z. B. die Koeffizienten eines linearen Modells), ist das Ziel der rekursiven Merkmalselimination (RFE), Merkmale auszuwählen, indem rekursiv immer kleinere Mengen von Merkmalen betrachtet werden. Zuerst wird der Schätzer auf dem anfänglichen Merkmalsatz trainiert und die Wichtigkeit jedes Merkmals entweder über ein bestimmtes Attribut (wie coef_, feature_importances_) oder eine aufrufbare Funktion ermittelt. Dann werden die am wenigsten wichtigen Merkmale aus dem aktuellen Merkmalsatz entfernt. Dieses Verfahren wird rekursiv auf dem beschnittenen Satz wiederholt, bis die gewünschte Anzahl von auszuwählenden Merkmalen erreicht ist.

RFECV führt RFE in einer Kreuzvalidationsschleife durch, um die optimale Anzahl von Merkmalen zu finden. Genauer gesagt wird die Anzahl der ausgewählten Merkmale automatisch durch Anpassen eines RFE-Selectors auf verschiedenen Kreuzvalidierungs-Splits (bereitgestellt durch den cv-Parameter) abgestimmt. Die Leistung des RFE-Selectors wird anhand von scorer für verschiedene Anzahlen ausgewählter Merkmale bewertet und aggregiert. Schließlich werden die Scores über die Folds gemittelt und die Anzahl der ausgewählten Merkmale auf die Anzahl der Merkmale gesetzt, die den Kreuzvalidierungs-Score maximieren.

Beispiele

1.13.4. Merkmalsauswahl mit SelectFromModel#

SelectFromModel ist ein Meta-Transformer, der zusammen mit jedem Schätzer verwendet werden kann, der jedem Merkmal eine Bedeutung zuweist, entweder über ein bestimmtes Attribut (wie coef_, feature_importances_) oder über eine aufrufbare importance_getter nach dem Anpassen. Die Merkmale werden als unwichtig betrachtet und entfernt, wenn die entsprechende Bedeutung der Merkmalswerte unter dem bereitgestellten threshold-Parameter liegt. Neben der numerischen Angabe des Schwellenwerts gibt es integrierte Heuristiken zum Auffinden eines Schwellenwerts unter Verwendung eines String-Arguments. Verfügbare Heuristiken sind "mean", "median" und Fließkomma-Vielfache davon, wie "0.1*mean". In Kombination mit den threshold-Kriterien kann der Parameter max_features verwendet werden, um die Anzahl der auszuwählenden Merkmale zu begrenzen.

Beispiele für die Verwendung finden Sie in den folgenden Abschnitten.

Beispiele

1.13.4.1. L1-basierte Merkmalsauswahl#

Lineare Modelle, die mit der L1-Norm bestraft werden, haben sparse Lösungen: viele ihrer geschätzten Koeffizienten sind Null. Wenn das Ziel darin besteht, die Dimensionalität der Daten für die Verwendung mit einem anderen Klassifikator zu reduzieren, können sie zusammen mit SelectFromModel verwendet werden, um die Nicht-Null-Koeffizienten auszuwählen. Insbesondere sind sparse Schätzer, die für diesen Zweck nützlich sind, der Lasso für Regression und LogisticRegression und LinearSVC für Klassifizierung.

>>> from sklearn.svm import LinearSVC
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
>>> model = SelectFromModel(lsvc, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 3)

Bei SVMs und logistischer Regression steuert der Parameter C die Sparsity: je kleiner C, desto weniger Merkmale werden ausgewählt. Bei Lasso gilt: je höher der Parameter alpha, desto weniger Merkmale werden ausgewählt.

Beispiele

L1-Wiederherstellung und komprimierte Erfassung#

Bei guter Wahl von alpha kann Lasso die exakte Menge der Nicht-Null-Variablen mit nur wenigen Beobachtungen vollständig wiederherstellen, vorausgesetzt, bestimmte spezifische Bedingungen sind erfüllt. Insbesondere sollte die Anzahl der Stichproben "ausreichend groß" sein, andernfalls werden L1-Modelle zufällig funktionieren, wobei "ausreichend groß" von der Anzahl der Nicht-Null-Koeffizienten, dem Logarithmus der Anzahl der Merkmale, dem Rauschpegel, dem kleinsten absoluten Wert der Nicht-Null-Koeffizienten und der Struktur der Designmatrix X abhängt. Darüber hinaus muss die Designmatrix bestimmte spezifische Eigenschaften aufweisen, wie z. B. nicht zu stark korreliert zu sein. Zur Verwendung von Lasso für die sparsen Signalwiederherstellung siehe dieses Beispiel zur komprimierten Erfassung: Komprimierte Erfassung: Tomographie-Rekonstruktion mit L1-Prior (Lasso).

Es gibt keine allgemeine Regel zur Auswahl eines alpha-Parameters für die Wiederherstellung von Nicht-Null-Koeffizienten. Er kann per Kreuzvalidierung ( LassoCV oder LassoLarsCV) gesetzt werden, obwohl dies zu unterbestraften Modellen führen kann: Die Einbeziehung einer kleinen Anzahl irrelevanter Variablen ist für den Vorhersage-Score nicht nachteilig. BIC (LassoLarsIC) neigt im Gegensatz dazu dazu, hohe alpha-Werte festzulegen.

Referenzen

Richard G. Baraniuk "Compressive Sensing", IEEE Signal Processing Magazine [120] Juli 2007 http://users.isr.ist.utl.pt/~aguiar/CS_notes.pdf

1.13.4.2. Baumbasierte Merkmalsauswahl#

Baumbasierte Schätzer (siehe das Modul sklearn.tree und die Baumensembles im Modul sklearn.ensemble) können zur Berechnung von Unreinheits-basierten Merkmalswichtigkeiten verwendet werden, die wiederum zum Verwerfen irrelevanter Merkmale (in Kombination mit dem Meta-Transformer SelectFromModel) verwendet werden können.

>>> from sklearn.ensemble import ExtraTreesClassifier
>>> from sklearn.datasets import load_iris
>>> from sklearn.feature_selection import SelectFromModel
>>> X, y = load_iris(return_X_y=True)
>>> X.shape
(150, 4)
>>> clf = ExtraTreesClassifier(n_estimators=50)
>>> clf = clf.fit(X, y)
>>> clf.feature_importances_
array([ 0.04,  0.05,  0.4,  0.4])
>>> model = SelectFromModel(clf, prefit=True)
>>> X_new = model.transform(X)
>>> X_new.shape
(150, 2)

Beispiele

1.13.5. Sequentielle Merkmalsauswahl#

Sequentielle Merkmalsauswahl [sfs] (SFS) ist im Transformer SequentialFeatureSelector verfügbar. SFS kann entweder vorwärts oder rückwärts erfolgen.

Forward-SFS ist ein gieriges Verfahren, das iterativ das beste neue Merkmal findet, das zur Menge der ausgewählten Merkmale hinzugefügt werden soll. Konkret beginnen wir zunächst mit null Merkmalen und finden dasjenige Merkmal, das einen kreuzvalidierten Score maximiert, wenn ein Schätzer auf diesem einzelnen Merkmal trainiert wird. Sobald dieses erste Merkmal ausgewählt ist, wiederholen wir das Verfahren, indem wir ein neues Merkmal zur Menge der ausgewählten Merkmale hinzufügen. Das Verfahren stoppt, wenn die gewünschte Anzahl von ausgewählten Merkmalen erreicht ist, wie durch den Parameter n_features_to_select bestimmt.

Backward-SFS folgt der gleichen Idee, funktioniert aber in die entgegengesetzte Richtung: Anstatt mit allen Merkmalen zu beginnen und Merkmale gierig hinzuzufügen, beginnen wir mit *allen* Merkmalen und *entfernen* gierig Merkmale aus der Menge. Der Parameter direction steuert, ob Forward- oder Backward-SFS verwendet wird.

Details zur sequentiellen Merkmalsauswahl#

Im Allgemeinen liefern Vorwärts- und Rückwärtsselektion keine äquivalenten Ergebnisse. Außerdem kann eine davon viel schneller sein als die andere, abhängig von der angeforderten Anzahl der ausgewählten Merkmale: Wenn wir 10 Merkmale haben und 7 ausgewählte Merkmale anfordern, würde die Vorwärtsselektion 7 Iterationen benötigen, während die Rückwärtsselektion nur 3 benötigen würde.

SFS unterscheidet sich von RFE und SelectFromModel dadurch, dass es nicht erfordert, dass das zugrunde liegende Modell ein Attribut coef_ oder feature_importances_ exponiert. Es kann jedoch langsamer sein, da mehr Modelle ausgewertet werden müssen, verglichen mit den anderen Ansätzen. Zum Beispiel erfordert die Iteration bei der Rückwärtsselektion von m Merkmalen zu m - 1 Merkmalen unter Verwendung von k-facher Kreuzvalidierung das Anpassen von m * k Modellen, während RFE nur eine einzige Anpassung erfordert und SelectFromModel immer nur eine einzige Anpassung vornimmt und keine Iterationen benötigt.

Referenzen

Beispiele

1.13.6. Merkmalsauswahl als Teil einer Pipeline#

Die Merkmalsauswahl wird normalerweise als Vorverarbeitungsschritt vor dem eigentlichen Lernen verwendet. Die empfohlene Methode hierfür in scikit-learn ist die Verwendung einer Pipeline.

clf = Pipeline([
  ('feature_selection', SelectFromModel(LinearSVC(penalty="l1"))),
  ('classification', RandomForestClassifier())
])
clf.fit(X, y)

In diesem Snippet verwenden wir einen LinearSVC, der mit SelectFromModel gekoppelt ist, um Merkmalswichtigkeiten auszuwerten und die relevantesten Merkmale auszuwählen. Anschließend wird ein RandomForestClassifier auf der transformierten Ausgabe trainiert, d. h. unter Verwendung nur relevanter Merkmale. Sie können ähnliche Operationen mit den anderen Merkmalsauswahlmethoden und auch mit Klassifikatoren durchführen, die eine Möglichkeit zur Auswertung von Merkmalswichtigkeiten bieten. Weitere Details finden Sie in den Beispielen zu Pipeline.