Entfernen von Komponenten mit geringer Varianz mit scikit-learn
scikit-learn bietet verschiedene Methoden zum entfernen von Deskriptoren, ein basic Methode für diesen Zweck wurde durch die gegebenen Anleitung unten,
http://scikit-learn.org/stable/modules/feature_selection.html#
aber das tutorial stellt keine Methode oder einen Weg, der Ihnen sagen kann die Art und Weise, die Liste der features, die entweder entfernt oder beibehalten.
Den code unten wurde entnommen aus dem tutorial.
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]])
Beispiel-code oben zeigt nur zwei Deskriptoren " - Form(6, 2)", aber in meinem Fall, ich habe einen riesigen Daten-frames mit einer Form der (Zeilen 51, Spalten 9000). Nach der Suche nach einem geeigneten Modell, das ich behalten möchten Spur von nützlichen und nutzlosen features, weil ich speichern kann Rechenzeit bei der Berechnung der features von test-Daten durch die Berechnung nur nützliche Funktionen.
Beispielsweise, wenn Sie ausführen, maschinelles lernen-Modellierung mit WEKA 6.0, sofern es mit bemerkenswerter Flexibilität über die feature-Auswahl und nach dem entfernen der nutzlosen Funktion können Sie eine Liste der verworfenen features zusammen mit den nützlichen features.
Dank
- Sklearn funktioniert anders als WEKA. In diesem Fall, anstatt Ihnen eine Liste der besten features, sklearn gibt direkt ein neues array mit den besten features. Brauchst du wirklich die Liste? Ich denke, diese Liste könnte berechnet werden, die mit einer umgehen, aber ist das wirklich notwendig?
- laut meines Verständnisses (wie ich bin nicht sehr Erfahrung in der ML, aber ein begeisterter schlanker ) Trainings-und test-set sollte haben dieselbe Anzahl von features mit derselben Indizierung, da sonst im Falle von weka er rase Fehler. Wenn Test-set ist die interne abgeleitet, die mit den Daten split-würde ich immer gleichen Funktionen und die gleiche Indizierung, aber wenn wir die Verwendung von externen Daten-Testsatz oder unbekannte Daten auf welche Vorhersagen machen, ohne die bekannten Namen der Funktion, wie wir könnten die unbekannten Daten.
- ja du hast Recht. Ich dachte nur in der Ausbildung ahah
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dann, was Sie tun können, wenn ich bin nicht falsch ist:
Im Fall der VarianceThreshold, können Sie die Methode aufrufen
fit
stattfit_transform
. Diese passen die Daten und die daraus resultierenden Abweichungen werden gespeichert invt.variances_
(vorausgesetztvt
ist Ihr Gegenstand).Dass ein threhold, können Sie extrahieren Sie die Merkmale der transformation als
fit_transform
tun würde:Oder Holen Sie sich die Indizes wie:
Oder als Maske
PS: Standard-Schwellenwert 0
EDIT:
Einen mehr geradlinig zu tun, ist mithilfe der Methode
get_support
von der KlasseVarianceThreshold
. Aus der Dokumentation:Sollten Sie diese Methode aufrufen, nachdem
fit
oderfit_transform
.df.loc[:, sel.get_support()]
wodf
ist ein Pandabären-Daten-frame undsel
ist ein VarianceThreshold.sklearn.feature_selection.VarianceThreshold
mit den zugrunde liegendennumpy
array statt derpandas.DataFrame
. 🙂