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?
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.
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?
Je pense que cela devrait fonctionner:
sgd_randomized_pipe.named_steps['clf'].coef_