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
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
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
Entschuldigung, es gab eine Menge seltsamer Tippfehler in meiner Antwort, ich habe es behoben, funktioniert es jetzt? – maxymoo