2

Ich bin auf der Suche nach Feature-Auswahl mit einem Multi-Label-Datensatz mit Sklearn. Ich möchte den letzten Satz von Funktionen über Etiketten bekommen, die ich dann in einem anderen Machine Learning-Paket verwenden werde. Ich plante, die Methode zu verwenden, die ich sah here, die relevante Merkmale für jedes Etikett separat auswählt.Multi-Label-Feature-Auswahl mit Sklearn

from sklearn.svm import LinearSVC 
from sklearn.feature_selection import chi2, SelectKBest 
from sklearn.multiclass import OneVsRestClassifier 
clf = Pipeline([('chi2', SelectKBest(chi2, k=1000)), 
       ('svm', LinearSVC())]) 
multi_clf = OneVsRestClassifier(clf) 

Ich plane, dann die Indizes der enthaltenen Merkmale zu extrahieren, pro Etikett, mit diesem:

selected_features = [] 
for i in multi_clf.estimators_: 
    selected_features += list(i.named_steps["chi2"].get_support(indices=True)) 

Nun, meine Frage ist, wie kann ich wählen, welche Funktionen in meinem letzten aufzunehmen ausgewählt Modell? Ich könnte jede einzigartige Funktion verwenden (die Funktionen enthalten würde, die nur für ein Label relevant sind), oder ich könnte etwas tun, um Features auszuwählen, die für weitere Labels relevant sind.

Meine anfängliche Idee besteht darin, ein Histogramm der Anzahl der Etiketten zu erstellen, für die ein bestimmtes Merkmal ausgewählt wurde, und einen Schwellenwert basierend auf visueller Inspektion zu identifizieren. Meine Sorge ist, dass diese Methode subjektiv ist. Gibt es eine prinzipielle Möglichkeit, die Merkmalsauswahl für Multilabel-Datensätze mit sklearn durchzuführen?

Antwort

1

Gemäß den Schlussfolgerungen in diesem paper:

[...] Rang verfügt nach dem Durchschnitt oder dem maximalen Chi-Quadrat-Score über alle Labels, führte zu den meisten der besten Klassifizierer während Verwenden weniger Funktionen.

Dann wird, um eine gute Untergruppe von Funktionen auswählen müssen Sie genau das tun (so etwas wie) diese:

from sklearn.feature_selection import chi2, SelectKBest 

selected_features = [] 
for label in labels: 
    selector = SelectKBest(chi2, k='all') 
    selector.fit(X, Y[label]) 
    selected_features.append(list(selector.scores_)) 

// MeanCS 
selected_features = np.mean(selected_features, axis=0) > threshold 
// MaxCS 
selected_features = np.max(selected_features, axis=0) > threshold 

Hinweis: in dem obigen Code ich, dass X gehe davon ist der Ausgang von einigen Text Vectorizer (die vektorisierte Version der Texte) und Y ist ein Pandas Datenrahmen mit einer Spalte pro Etikett (so kann ich die Spalte Y[label] auswählen). Außerdem gibt es eine Schwellenwertvariable, die zuvor festgelegt werden sollte.

0

http://scikit-learn.org/stable/modules/feature_selection.html

Es gibt eine Vielzahl von Möglichkeiten, aber SelectKBest und rekursive Funktion Beseitigung sind zwei ziemlich beliebtesten.

RFE funktioniert, indem die uniformativen Merkmale aus dem Modell herausgelassen, neu trainiert und die Ergebnisse verglichen werden, so dass die am Ende übrig gebliebenen Merkmale die beste Vorhersagegenauigkeit ermöglichen.

Was am besten ist, hängt stark von Ihren Daten und Anwendungsfall ab.

Abgesehen von dem, was locker als Cross Validation Ansätze zur Feature-Auswahl beschrieben werden kann, können Sie Bayessche Modellauswahl betrachten, die einen eher theoretischen Ansatz ist und eher einfache als komplexe Modelle bevorzugt.

+0

Soweit ich weiß, sind die Merkmalsauswahlmethoden in sklearn für binäre Klassifikatoren. Sie können die ausgewählten Features für jedes Label einzeln abrufen, aber meine Frage ist, wie Sie einen endgültigen Satz von Features ermitteln können, die prinzipienübergreifend über alle Labels hinweg funktionieren. – user2589328

+0

Ich bin mir nicht sicher, ob ich verstehe, was du meinst. Beispielsweise ist SelectKBest modellunabhängig, und Sie können ein Beispiel für RFE sehen, das Ihnen zeigt, wie Sie das endgültige Feature-Set in den Dokumenten erhalten. http: // scikit-lernen.org/stable/auto_examples/feature_selection/plot_rfe_with_cross_validation.html # Beispiel-Feature-Auswahl-Plot-rfe-mit-Kreuz-Validierung-py Zusätzlich viele/am meisten implementieren eine Transformationsfunktion, die die trainierten besten Funktionen aus den Eingaben auswählen wird. – Chris

+0

Aber das letzte Feature-Set ist für einen Klassifizierer, oder? Da binäre Relevanzmethoden das Multilabel-Klassifikationsproblem in eine Reihe von binären Klassifikationen zerlegen, entspricht dieser letzte Merkmalssatz nur einem meiner vielen Labels. Ich habe ein Feature-Set, das von den Feature-Auswahlmethoden für jedes einzelne Label zurückgegeben wird, aber ich möchte die ausgewählten Features kombinieren, um ein Feature-Set zu erstellen, das für alle Labels gut funktioniert. – user2589328