Grid-Search mit Recursive Feature Elimination in scikit-learn-pipeline gibt einen Fehler zurück

Ich versuche, Kette Grid Search and Recursive Feature Elimination in einer Pipeline mit scikit-learn.

GridSearchCV und RFE mit der "nackten" Klassifikator gut funktioniert:

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)

Setzen Klassifizierer in einer pipeline einen Fehler zurück: Absturz mit Laufzeitfehler: Der Klassifikator nicht aussetzen "coef_" oder "feature_importances_" Attribute

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:

Habe ich gemerkt, dass mir nicht klar war, die das problem beschreiben. Dies ist die klarere snippet:

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)

Wie Sie sehen können, der einzige Unterschied ist, dass wir die Schätzer in einer pipeline. Pipeline, verbirgt jedoch "coef_" oder "feature_importances_" Attribute. Die Fragen sind:

  1. Ist es eine schöne Art des Umgangs mit dieser in scikit-learn?
  2. Wenn nicht, ist dieses Verhalten gewünscht, aus irgendeinem Grund?

EDIT2:

Aktualisiert, Arbeits-snippet auf der Grundlage der Antwort von @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_)
  • Ich würde untersuchen den Quellcode, um zu prüfen, welche Kette von Ereignissen führt zum Absturz mit Laufzeitfehler. Es ist durchaus möglich, dass Sie möglicherweise in der Lage, überschreiben Sie die Eigenschaften des entsprechenden Rendite-Objekt, und fügen Sie einfach zurück in den Variablen - zum Beispiel, wenn Sie identisch sind, wenn zurückgegeben, die von der SVR(). In jedem Fall, make_pipeline() kann nicht wieder die gleiche Art von Objekt als SVR() tut.
InformationsquelleAutor hubi86 | 2016-04-17
Schreibe einen Kommentar