2016-04-17 5 views
0

Ich versuche, Feature-Auswahl für Textfunktionen für ein Regressionsproblem zu machen. Derzeit hat das Trainingssatz ~ 200K Features - viel zu viele. Ich möchte einige der Feature-Auswahl-Tools in scikit-learn verwenden, aber ich habe Probleme mit scipy dünn besetzten Matrizen, insbesondere beim Versuch, die f_regression Scoring-Funktion an die SelectKBest Transformator übergeben.F-Regression Feature-Auswahl mit Scipy Sparse Arrays

Es scheint, dass die f_regression Scoring-Funktion als Argument nimmt eine X Merkmalsmatrix, einen y Antwortvektor, und ein optionales center Argument, das standardmäßig auf TRUE gesetzt ist. Ich glaube, was würde das Problem lösen ist, wenn ich f_regression mit center=False zum SelectKBest Transformator passieren könnte, aber wenn ich versuche, so etwas wie:

f_regressor = f_regression(X, y, center=False) 
feature_selector = SelectKBest(f_regressor, k=k) 
selected_features = feature_selector.fit_transform(X, y) 

ich einen Fehler erhalten, dass die Scoring-Funktion nicht aufrufbar ist. Ich nehme an, dass das ist, weil, wenn ich es als f_regress initialisiere, es sofort p-Werte und f-Kerben für die Eigenschaften zurückgibt.

Ferner wurde in dem Quellcode für den SelectKBest Transformator, ist es nicht wie die Fit-Funktion aussehen tut jede Prüfung für dieses center Argument, so dass ich sehe keine einfache Möglichkeit, diese Bewertungsfunktion mit center=False an das weitergeben Transformator:

Wenn jemand eine Abhilfe für diese in der nahen Zukunft hat, würde das sehr geschätzt werden. Vielen Dank im Voraus für das Lesen.

+1

Also funktioniert es, wenn Sie 'f_regression' anstelle von' f_regressor' übergeben? Wie wäre es mit einer Cover-Funktion oder Lambda, die 'X, y' nimmt, aber' center' so einstellt, wie Sie es wollen? Anstatt es zu bewerten, machen Sie eine neue Funktion. – hpaulj

+0

@hpaulj: Danke, dass du mich dazu gebracht hast, langsamer zu werden und nachzudenken. Es gibt (natürlich) eine vollkommen elegante Lösung - die Bibliothek 'functools'. Danke für den Vorschlag von Cover/Lambda-Funktionen. – kylerthecreator

Antwort

0

Siehe Kommentar von @hpaul oben. Die Verwendung der Bibliothek functools und die Verwendung der Methode .partial() zum Überschreiben der Standardargumente funktioniert großartig. Etwas wie:

f_regress = functools.partial(f_regression, center=False) 
feature_selector = SelectKBest(f_regress, k=k) 

und dann wie gewohnt verwenden.