2016-10-17 1 views
1

J'ai un simple Pipeline d'analyse et de classification de texte constitué d'un CountVectorizer, d'un TfidfTransformer et enfin d'un classificateur Multinomial Naive Bayes.Mise à jour des paramètres du transformateur après la recherche de réseau sur le Pipeline

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.pipeline import Pipeline 

text_clf = Pipeline([('vect', CountVectorizer()), 
       ('tfidf', TfidfTransformer()), 
       ('clf', MultinomialNB())]) 

Je détermine maintenant les meilleurs paramètres à l'aide GridSearchCV (stop_words contient une liste de mots d'arrêt chargés précédemment):

from sklearn.model_selection import GridSearchCV 

parameters = {'vect__ngram_range': [(1,1), (1,2), (1,3)], 
      'vect__stop_words': [None, stop_words], 
      'tfidf__use_idf': [True, False], 
      'clf__alpha': np.arange(0.0, 1.05, 0.05) 
} 

grid_clf = GridSearchCV(text_clf, parameters, n_jobs = 1) 
_ = grid_clf.fit(X_train, y_train) 

Je peux maintenant voir les meilleurs paramètres du modèle en utilisant grid_clf.best_params_:

{'clf__alpha': 0.050000000000000003, 
'tfidf__use_idf': True, 
'vect__ngram_range': (1, 3), 
'vect__stop_words': None} 

Ma question est: comment puis-je récupérer un pipeline mis à jour avec les meilleurs paramètres renvoyés par la recherche de grille? Je voudrais pouvoir appeler les deux premières étapes du pipeline (CountVectorizer et TfidfTransformer) avec les paramètres appropriés.

Une solution que j'ai trouvé crée explicitement un nouveau pipeline avec les meilleurs paramètres renvoyés par la recherche de la grille:

multinomial_clf = Pipeline([('vect', CountVectorizer(stop_words=None, ngram_range=(1,3))), 
       ('tfidf', TfidfTransformer(use_idf = True)), 
       ('clf', MultinomialNB(alpha=0.05))]) 
_ = multinomial_clf.fit(X_train, y_train) 

Je peux maintenant accéder au CountVectorizer et TfidfTransformer en utilisant multinomial_clf.steps mais je suis sûr qu'il doit y avoir un moyen plus facile façon.

Merci beaucoup pour votre aide!

Répondre

0

Le Pipeline avec les meilleurs paramètres peuvent être trouvés avec grid_clf.best_estimator_

grid_clf.best_estimator_ 

Pipeline(steps=[('vect', CountVectorizer(analyzer='word', binary=False, decode_error='strict', 
    dtype=<class 'numpy.int64'>, encoding='utf-8', input='content', 
    lowercase=True, max_df=1.0, max_features=None, min_df=1, 
    ngram_range=(1, 3), preprocessor=None, stop_words=None, 
    strip...near_tf=False, use_idf=True)), ('clf', MultinomialNB(alpha=0.02, class_prior=None, fit_prior=True))]) 

Cependant, je suis toujours confus quant à la façon de transformer l'utilisation des transformateurs du pipeline. Les deux premières étapes implémentent des méthodes de transformation, alors que la dernière étape ne le fait pas. Mais si je tente d'appeler:

grid_clf.best_estimator_.transform(['ok computer']) 

Je reçois l'erreur suivante:

AttributeError: 'MultinomialNB' object has no attribute 'transform' 

Merci pour votre aide