web-dev-qa-db-fra.com

renvoie les coefficients de l'objet Pipeline dans sklearn

J'ai ajusté un objet Pipeline avec RandomizedSearchCV

pipe_sgd = Pipeline([('scl', StandardScaler()),
                    ('clf', SGDClassifier(n_jobs=-1))])

param_dist_sgd = {'clf__loss': ['log'],
                 'clf__penalty': [None, 'l1', 'l2', 'elasticnet'],
                 'clf__alpha': np.linspace(0.15, 0.35),
                 'clf__n_iter': [3, 5, 7]}

sgd_randomized_pipe = RandomizedSearchCV(estimator = pipe_sgd, 
                                         param_distributions=param_dist_sgd, 
                                         cv=3, n_iter=30, n_jobs=-1)

sgd_randomized_pipe.fit(X_train, y_train)

Je souhaite accéder à l'attribut coef_ du best_estimator_ mais je ne peux pas le faire. J'ai essayé d'accéder à coef_ avec le code ci-dessous.

sgd_randomized_pipe.best_estimator_.coef_

Cependant, j'obtiens le AttributeError suivant ... 

AttributeError: l'objet 'Pipeline' n'a pas d'attribut 'coef_'

Les documents scikit-learn disent que coef_ est un attribut de SGDClassifier, qui est la classe de mon base_estimator_

Qu'est-ce que je fais mal?

12
spies006

Vous pouvez toujours utiliser les noms que vous leur avez attribués lors de la création du pipeline à l'aide de named_steps dict. 

scaler = sgd_randomized_pipe.best_estimator_.named_steps['scl']
classifier = sgd_randomized_pipe.best_estimator_.named_steps['clf']

et ensuite accéder à tous les attributs comme coef_, intercept_ etc. qui sont disponibles pour l'estimateur ajusté correspondant.

Il s’agit de l’attribut formel exposé par le pipeline en tant que spécifié dans la documentation :

named_steps: dict 

Attribut en lecture seule permettant d'accéder à n'importe quel paramètre d'étape par nom d'utilisateur. Les clés sont des noms d'étape et les valeurs sont des paramètres d'étape.

18
Vivek Kumar

J'ai trouvé un moyen de le faire en indexant en chaîne avec l'attribut steps.

sgd_randomized_pipe.best_estimator_.steps[1][1].coef_

Est-ce une bonne pratique ou existe-t-il un autre moyen?

1
spies006

Je pense que cela devrait fonctionner:

sgd_randomized_pipe.named_steps['clf'].coef_
0
Roozbeh Bakhshi