Sto tentando di concatenare la ricerca di rete e l'eliminazione di feature ricorsive in una pipeline utilizzando scikit-learn.Ricerca griglia con funzionalità ricorsiva L'eliminazione nella pipeline di scikit-learn restituisce un errore
GridSearchCV e RFE con classificatore "nuda" funziona bene:
from sklearn.datasets import make_friedman1
from sklearn import feature_selection
from sklearn.grid_search import GridSearchCV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
est = SVR(kernel="linear")
selector = feature_selection.RFE(est)
param_grid = dict(estimator__C=[0.1, 1, 10])
clf = GridSearchCV(selector, param_grid=param_grid, cv=10)
clf.fit(X, y)
Mettere classificatore in una pipeline restituisce un errore: RuntimeError: Il classificatore non espone "coef_" o "feature_importances_" attributi
from sklearn.datasets import make_friedman1
from sklearn import feature_selection
from sklearn import preprocessing
from sklearn import pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
est = SVR(kernel="linear")
std_scaler = preprocessing.StandardScaler()
pipe_params = [('std_scaler', std_scaler), ('clf', est)]
pipe = pipeline.Pipeline(pipe_params)
selector = feature_selection.RFE(pipe)
param_grid = dict(estimator__clf__C=[0.1, 1, 10])
clf = GridSearchCV(selector, param_grid=param_grid, cv=10)
clf.fit(X, y)
EDIT:
ho capito che non mi era chiaro che descrive il problema. Questo è il frammento di più chiaro:
from sklearn.datasets import make_friedman1
from sklearn import feature_selection
from sklearn import pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.svm import SVR
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
# This will work
est = SVR(kernel="linear")
selector = feature_selection.RFE(est)
clf = GridSearchCV(selector, param_grid={'estimator__C': [1, 10]})
clf.fit(X, y)
# This will not work
est = pipeline.make_pipeline(SVR(kernel="linear"))
selector = feature_selection.RFE(est)
clf = GridSearchCV(selector, param_grid={'estimator__svr__C': [1, 10]})
clf.fit(X, y)
Come si può vedere, l'unica differenza sta mettendo lo stimatore in una pipeline. La pipeline, tuttavia, nasconde gli attributi "coef_" o "feature_importances_". Le domande sono:
- C'è un bel modo di affrontare questo in scikit-imparare?
- In caso contrario, questo comportamento è desiderato per qualsiasi motivo?
EDIT2:
aggiornamento, frammento di lavorare sulla base della risposta fornita da @ Chris
from sklearn.datasets import make_friedman1
from sklearn import feature_selection
from sklearn import pipeline
from sklearn.grid_search import GridSearchCV
from sklearn.svm import SVR
class MyPipe(pipeline.Pipeline):
def fit(self, X, y=None, **fit_params):
"""Calls last elements .coef_ method.
Based on the sourcecode for decision_function(X).
Link: https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/pipeline.py
----------
"""
super(MyPipe, self).fit(X, y, **fit_params)
self.coef_ = self.steps[-1][-1].coef_
return self
X, y = make_friedman1(n_samples=50, n_features=10, random_state=0)
# Without Pipeline
est = SVR(kernel="linear")
selector = feature_selection.RFE(est)
clf = GridSearchCV(selector, param_grid={'estimator__C': [1, 10, 100]})
clf.fit(X, y)
print(clf.grid_scores_)
# With Pipeline
est = MyPipe([('svr', SVR(kernel="linear"))])
selector = feature_selection.RFE(est)
clf = GridSearchCV(selector, param_grid={'estimator__svr__C': [1, 10, 100]})
clf.fit(X, y)
print(clf.grid_scores_)
Vorrei approfondire il codice sorgente per verificare quale catena di eventi porta a RuntimeError. È abbastanza probabile che tu possa essere in grado di sovrascrivere le proprietà dell'oggetto di ritorno pertinente e semplicemente aggiungere nuovamente le variabili, ad esempio, se sono uguali quando vengono restituite da SVR(). In ogni caso, make_pipeline() potrebbe non restituire lo stesso tipo di oggetto di SVR(). – noumenal