web-dev-qa-db-de.com

Python - Was ist genau sklearn.pipeline.Pipeline?

Ich kann nicht herausfinden, wie die sklearn.pipeline.Pipeline funktioniert genau.

Es gibt einige Erklärungen in doc . Was meinen sie zum Beispiel mit:

Pipeline von Transformationen mit einem endgültigen Schätzer.

Um meine Frage klarer zu machen, was sind steps? Wie arbeiten Sie?

Bearbeiten

Dank der Antworten kann ich meine Frage klarer stellen:

Wenn ich Pipeline aufrufe und als Schritte zwei Transformatoren und einen Schätzer übergebe, z.

pipln = Pipeline([("trsfm1",transformer_1),
                  ("trsfm2",transformer_2),
                  ("estmtr",estimator)])

Was passiert, wenn ich das anrufe?

pipln.fit()
OR
pipln.fit_transform()

Ich kann nicht herausfinden, wie ein Schätzer ein Transformator sein kann und wie ein Transformator angebracht werden kann.

84
farhawa

Transformer in scikit-learn - eine Klasse mit der Methode fit and transform oder der Methode fit_transform.

Predictor - eine Klasse mit Fit- und Predict-Methoden oder mit der Fit_predict-Methode.

Pipeline ist nur ein abstrakter Begriff, es ist kein existierender ml-Algorithmus. In ML-Aufgaben müssen Sie häufig eine Abfolge verschiedener Transformationen (Satz von Features suchen, neue Features generieren, nur einige gute Features auswählen) des Rohdatensatzes ausführen, bevor Sie den endgültigen Schätzer anwenden.

Hier ist ein gutes Beispiel für die Verwendung von Pipelines. Pipeline bietet Ihnen eine einzige Schnittstelle für alle 3 Transformationsschritte und den daraus resultierenden Schätzer. Es kapselt Transformatoren und Prädiktoren in sich und jetzt können Sie etwas tun wie:

    vect = CountVectorizer()
    tfidf = TfidfTransformer()
    clf = SGDClassifier()

    vX = vect.fit_transform(Xtrain)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

    # Now evaluate all steps on test set
    vX = vect.fit_transform(Xtest)
    tfidfX = tfidf.fit_transform(vX)
    predicted = clf.fit_predict(tfidfX)

Nur mit:

pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', SGDClassifier()),
])
predicted = pipeline.fit(Xtrain).predict(Xtrain)
# Now evaluate all steps on test set
predicted = pipeline.predict(Xtest)

Mit Pipelines können Sie einfach eine Rastersuche über einen Parametersatz für jeden Schritt dieses Metaschätzers durchführen. Wie im obigen Link beschrieben. Alle Schritte mit Ausnahme des letzten müssen Transformationen sein, der letzte Schritt kann Transformator oder Prädiktor sein. Antwort zum Bearbeiten : Wenn Sie pipln.fit() aufrufen, wird jeder Transformator in der Pipeline an den Ausgängen des vorherigen Transformators angebracht (der erste Transformator wird gelernt) auf Rohdatensatz). Der letzte Schätzer kann ein Transformator oder ein Prädiktor sein. Sie können fit_transform () in der Pipeline nur dann aufrufen, wenn Ihr letzter Schätzer ein Transformator ist (der fit_transform implementiert, oder Transformations- und Anpassungsmethoden separat). Sie können fit_predict () oder predict () in der Pipeline nur dann aufrufen, wenn Ihr letzter Schätzer ist ein Prädiktor. Sie können fit_transform also nicht aufrufen oder in einer Pipeline transformieren, deren letzter Schritt der Prädiktor ist.

129
Ibraim Ganiev

Ich denke, dass M0rkHaV die richtige Idee hat. Die Pipeline-Klasse von Scikit-learn ist ein nützliches Werkzeug, um mehrere verschiedene Transformatoren neben einem Schätzer in einem Objekt zu kapseln, sodass Sie Ihre wichtigen Methoden nur einmal aufrufen müssen (fit(), predict(), etc ). Lassen Sie uns die beiden Hauptkomponenten aufschlüsseln:

  1. Transformers sind Klassen, die sowohl fit() als auch transform() implementieren. Möglicherweise kennen Sie einige der sklearn-Vorverarbeitungswerkzeuge wie TfidfVectorizer und Binarizer. Wenn Sie sich die Dokumente für diese Vorverarbeitungstools ansehen, werden Sie feststellen, dass beide Methoden implementiert sind. Was ich ziemlich cool finde, ist, dass einige Schätzer auch als Transformationsschritte verwendet werden können, z. LinearSVC!

  2. Estimators sind Klassen, die sowohl fit() als auch predict() implementieren. Sie werden feststellen, dass viele der Klassifikatoren und Regressionsmodelle diese beiden Methoden implementieren und als solche viele verschiedene Modelle problemlos testen können. Es ist möglich, einen anderen Transformator als endgültigen Schätzer zu verwenden (d. H., Er implementiert nicht unbedingt predict(), sondern implementiert definitiv fit()). Das bedeutet nur, dass Sie predict() nicht aufrufen können.

Was Ihre Bearbeitung betrifft: Lassen Sie uns ein textbasiertes Beispiel durchgehen. Mit LabelBinarizer möchten wir eine Liste von Beschriftungen in eine Liste von Binärwerten umwandeln.

bin = LabelBinarizer()  #first we initialize

vec = ['cat', 'dog', 'dog', 'dog'] #we have our label list we want binarized

Wenn der Binärisierer nun auf einige Daten angepasst ist, hat er eine Struktur namens classes_, Die die eindeutigen Klassen enthält, über die der Transformator "Bescheid weiß". Ohne den Aufruf von fit() hat der Binärzähler keine Ahnung, wie die Daten aussehen. Daher macht der Aufruf von transform() keinen Sinn. Dies ist der Fall, wenn Sie die Klassenliste ausdrucken, bevor Sie versuchen, die Daten anzupassen.

print bin.classes_  

Ich erhalte die folgende Fehlermeldung, wenn ich das versuche:

AttributeError: 'LabelBinarizer' object has no attribute 'classes_'

Aber wenn Sie den Binärzähler in die Liste vec einfügen:

bin.fit(vec)

und versuche es noch mal

print bin.classes_

Ich bekomme folgendes:

['cat' 'dog']


print bin.transform(vec)

Und jetzt, nachdem wir transform für das Objekt vec aufgerufen haben, erhalten wir Folgendes:

[[0]
 [1]
 [1]
 [1]]

Verwenden wir für Schätzer, die als Transformatoren verwendet werden, den Klassifikator DecisionTree als Beispiel für einen Feature-Extraktor. Entscheidungsbäume sind aus vielen Gründen großartig, aber für unsere Zwecke ist es wichtig, dass sie die Fähigkeit haben, Features zu klassifizieren, die der Baum als nützlich für die Vorhersage erachtet. Wenn Sie transform() in einem Entscheidungsbaum aufrufen, nimmt dieser Ihre Eingabedaten und findet, was it für die wichtigsten Funktionen hält. Sie können sich also vorstellen, Ihre Datenmatrix (n Zeilen mal m Spalten) in eine kleinere Matrix (n Zeilen mal k Spalten) umzuwandeln, wobei die k Spalten die k wichtigsten Merkmale sind, die der Entscheidungsbaum gefunden hat.

12
NBartley