2016-05-04 10 views
2

Wie kann ich eine FeatureUnion in scikit learn verwenden, damit das Gridsearch seine Teile optional behandeln kann?scikit-learn FeatureUnion-Gittersuche über Teilmengen von Features

Der folgende Code funktioniert und richtet eine FeatureUnion mit einem TfidfVectorizer für Wörter und einem TfidfVectorizer für Zeichen ein.

Bei einem Gridsearch würde ich zusätzlich zum Testen des definierten Parameterraums auch nur 'vect__wordvect' mit seinem Parameter ngram_range testen (ohne dass es einen TfidfVectorizer für die Zeichen gibt) und auch nur 'vect__lettervect' mit der Kleinbuchstabe-Parameter True und False, der andere TfidfVectorizer wird deaktiviert.

BEARBEITEN: Komplettes Codebeispiel basierend auf dem Vorschlag von maxymoo.

Wie kann das gemacht werden?

from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.pipeline import Pipeline, FeatureUnion 
from sklearn.feature_extraction.text import TfidfVectorizer 
from sklearn.linear_model import LogisticRegression 
from sklearn.grid_search import GridSearchCV 
from sklearn.datasets import fetch_20newsgroups 

# setup the featureunion 
wordvect = TfidfVectorizer(analyzer='word') 
lettervect = CountVectorizer(analyzer='char') 
featureunionvect = FeatureUnion([("lettervect", lettervect), ("wordvect", wordvect)]) 

# setup the pipeline 
classifier = LogisticRegression(class_weight='balanced') 
pipeline = Pipeline([('vect', featureunionvect), ('classifier', classifier)]) 

# gridsearch parameters 
parameters = { 
      'vect__wordvect__ngram_range': [(1, 1), (1, 2)], # commenting out these two lines 
      'vect__lettervect__lowercase': [True, False],  # runs, but there is no parameterization anymore 
      'vect__transformer_list': [[('wordvect', wordvect)], 
             [('lettervect', lettervect)], 
             [('wordvect', wordvect), ('lettervect', lettervect)]]} 
gs_clf = GridSearchCV(pipeline, parameters) 

# data 
newsgroups_train = fetch_20newsgroups(subset='train', categories=['alt.atheism', 'sci.space']) 

# gridsearch CV 
gs_clf = GridSearchCV(pipeline, parameters) 
gs_clf = gs_clf.fit(newsgroups_train.data, newsgroups_train.target) 
for score in gs_clf.grid_scores_: 
    print "gridsearch scores: ", score 

Antwort

3

Der FeatureUnion hat einen Parameter transformer_list genannt, die Sie verwenden können raster suchen über; In Ihrem Fall würden also Ihre Grid-Suchparameter

parameters = {'vect__wordvect__ngram_range': [(1, 1), (1, 2)], 
       'vect__lettervect__lowercase': [True, False], 
       'vect__transformer_weights': [{"lettervect":1,"wordvect":0}, 
              {"lettervect":0,"wordvect":1}, 
              {"lettervect":1,"wordvect":1}]} 
+0

werden Es gibt eine "fehlende nach vect__transformer_list. Auch nachdem ich es behoben habe, bekomme ich: 'vect__transformer_list': [[('wordvec': wordvec)], ^ SyntaxError: ungültige Syntax – tkja

+0

Die Dokumentation auf transformer_list ist ziemlich spärlich, ich verstehe nicht, wie man Ihren Code repariert/anpasst auf scikit learn 0.17.1 – tkja

+0

Entschuldigung, es gab eine Menge seltsamer Tippfehler in meiner Antwort, ich habe es behoben, funktioniert es jetzt? – maxymoo