Ich kann nicht herausfinden, wie das sklearn.pipeline.Pipeline
genau funktioniert.
Das Dokument enthält einige Erklärungen . Was meinen sie zum Beispiel mit:
Pipeline von Transformationen mit einem endgültigen Schätzer.
Was sind meine Fragen, um meine Frage klarer zu machen steps
? Wie arbeiten Sie?
Bearbeiten
Dank der Antworten kann ich meine Frage klarer machen:
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 nenne?
pipln.fit()
OR
pipln.fit_transform()
Ich kann nicht herausfinden, wie ein Schätzer ein Transformator sein kann und wie ein Transformator eingebaut werden kann.
python
machine-learning
scikit-learn
neuraxle
farhawa
quelle
quelle
Antworten:
Transformer in Scikit-Learn - eine Klasse mit Fit- und Transformationsmethode oder Fit_transform-Methode.
Predictor - eine Klasse mit Fit- und Predict-Methoden oder fit_predict-Methode.
Pipeline ist nur ein abstrakter Begriff, es ist kein existierender ml-Algorithmus. In ML-Aufgaben müssen Sie häufig eine Folge verschiedener Transformationen (Satz von Merkmalen suchen, neue Merkmale generieren, nur einige gute Merkmale 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. Die Pipeline bietet Ihnen eine einzige Schnittstelle für alle drei Transformationsschritte und den daraus resultierenden Schätzer. Es kapselt Transformatoren und Prädiktoren im Inneren, und jetzt können Sie Folgendes tun:
Nur mit:
Mit Pipelines können Sie auf einfache Weise eine Rastersuche über Parametersätze für jeden Schritt dieses Meta-Schätzers durchführen. Wie im obigen Link beschrieben. Alle Schritte außer dem letzten müssen Transformationen sein, der letzte Schritt kann ein Transformator oder ein Prädiktor sein. Antwort zum Bearbeiten : Wenn Sie anrufen, wird
pipln.fit()
jeder Transformator in der Pipeline an die Ausgänge des vorherigen Transformators angepasst (der erste Transformator wird anhand des Rohdatensatzes gelernt). Der letzte Schätzer kann ein Transformator oder ein Prädiktor sein. Sie können fit_transform () in der Pipeline nur aufrufen, wenn Ihr letzter Schätzer ein Transformator ist (der fit_transform implementiert oder die Transformations- und Anpassungsmethoden separat implementiert). Sie können fit_predict () oder Predict () in der Pipeline nur aufrufen, wenn Ihr letzter Schätzer ist Prädiktor. Sie können also nicht fit_transform aufrufen oder in der Pipeline transformieren, deren letzter Schritt der Prädiktor ist.quelle
predicted = pipeline.fit(Xtrain).predict(Xtrain)
?Ich denke, dass M0rkHaV die richtige Idee hat. Scikit-Learn Pipeline - Klasse ist ein nützliches Werkzeug für die neben einem Schätzer zu einem Objekt mehrere verschiedene Transformatoren einkapseln, so dass Sie nur Ihre wichtigen Methoden einmal aufrufen müssen (
fit()
,predict()
usw.). Lassen Sie uns die beiden Hauptkomponenten aufschlüsseln:Transformatoren sind Klassen, die sowohl
fit()
als auch implementierentransform()
. Möglicherweise kennen Sie einige der sklearn-Vorverarbeitungstools wieTfidfVectorizer
undBinarizer
. 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, zLinearSVC
.Schätzer sind Klassen, die sowohl
fit()
als als auch implementierenpredict()
. Sie werden feststellen, dass viele der Klassifikatoren und Regressionsmodelle beide Methoden implementieren, und als solche können Sie problemlos viele verschiedene Modelle testen. Es ist möglich, einen anderen Transformator als endgültigen Schätzer zu verwenden (dh er muss nicht unbedingt implementiertpredict()
, aber definitiv implementiert werdenfit()
). Das bedeutet nur, dass Sie nicht anrufen könnenpredict()
.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.
Wenn der Binarizer nun auf einige Daten angewendet wird, hat er eine Struktur namens
classes_
, die die eindeutigen Klassen enthält, über die der Transformator "Bescheid weiß". Ohnefit()
den Binarizer aufzurufen, hat er keine Ahnung, wie die Daten aussehen, sodass ein Aufruftransform()
keinen Sinn ergibt. Dies gilt, wenn Sie die Liste der Klassen ausdrucken, bevor Sie versuchen, die Daten anzupassen.Beim Versuch wird folgende Fehlermeldung angezeigt:
Aber wenn Sie den Binarizer auf die montieren
vec
Liste setzen:und versuche es erneut
Ich bekomme folgendes:
Und jetzt, nach dem Aufruf von transform on the
vec
wir Objekt aufgerufen haben, erhalten wir Folgendes:Für Schätzer, die als Transformatoren verwendet werden, verwenden wir den
DecisionTree
Klassifikator als Beispiel für einen Merkmalsextraktor. Entscheidungsbäume sind aus vielen Gründen großartig. Für unsere Zwecke ist es jedoch wichtig, dass sie Funktionen bewerten können, die der Baum für die Vorhersage als nützlich erachtet hat. Wenn Sietransform()
einen Entscheidungsbaum aufrufen , nimmt er Ihre Eingabedaten und findet heraus, was seiner Meinung nach die wichtigsten Funktionen sind. Sie können sich also vorstellen, Ihre Datenmatrix (n Zeilen mal m Spalten) in eine kleinere Matrix (n Zeilen mal k Spalten) umzuwandeln, in der die k Spalten die k wichtigsten Merkmale sind, die der Entscheidungsbaum gefunden hat.quelle
fit()
undtransform()
ist die Transformatoren? Wie können Schätzer als Transformatoren verwendet werden?fit()
ist die Methode, die Sie aufrufen, um Ihren Transformator anzupassen oder zu „trainieren“, wie Sie es bei einem Klassifikator oder einem Regressionsmodell tun würden. Diestransform()
ist die Methode, die Sie aufrufen, um die Eingabedaten tatsächlich in die Ausgabedaten umzuwandeln. Zum Beispiel kann ein AufrufBinarizer.transform([8,2,2])
(nach dem Anpassen!) Dazu führen[[1,0],[0,1],[0,1]]
. In Bezug auf die Verwendung von Schätzern als Transformatoren werde ich ein kurzes Beispiel in meiner Antwort bearbeiten.Was sind ML-Pipelines und wie funktionieren sie?
Eine Pipeline besteht aus einer Reihe von Schritten, in denen Daten transformiert werden. Es stammt aus dem alten Entwurfsmuster "Pipe and Filter" (Sie können sich beispielsweise Unix-Bash-Befehle mit Pipes "|" oder Umleitungsoperatoren ">" vorstellen). Pipelines sind jedoch Objekte im Code. Daher haben Sie möglicherweise eine Klasse für jeden Filter (auch bekannt als jeder Pipeline-Schritt) und dann eine andere Klasse, um diese Schritte in der endgültigen Pipeline zu kombinieren. Einige Pipelines können andere Pipelines in Reihe oder parallel kombinieren, mehrere Ein- oder Ausgänge haben und so weiter. Wir betrachten Pipelines für maschinelles Lernen gerne als:
Methoden einer Scikit-Learn-Pipeline
Pipelines (oder Schritte in der Pipeline) müssen diese beiden Methoden haben :
Es ist auch möglich, diese Methode aufzurufen, um beide zu verketten:
Probleme der Klasse sklearn.pipeline.Pipeline
Scikit-Learn hatte seine erste Veröffentlichung im Jahr 2007, eine Zeit vor dem tiefen Lernen . Es ist jedoch eine der bekanntesten und am weitesten verbreiteten Bibliotheken für maschinelles Lernen und wächst weiter. Darüber hinaus wird das Pipe and Filter-Entwurfsmuster als Software-Architekturstil verwendet. Dies macht Scikit-Learn so fabelhaft und bietet zusätzlich gebrauchsfertige Algorithmen. Es gibt jedoch massive Probleme, wenn es darum geht, Folgendes zu tun, was wir bereits 2020 tun sollten:
Lösungen, die wir für die Probleme von Scikit-Learn gefunden haben
Natürlich ist Scikit-Learn sehr praktisch und gut gebaut. Es muss jedoch aktualisiert werden. Hier sind unsere Lösungen mit Neuraxle , um Scikit-Learn in modernen Computerprojekten frisch und nutzbar zu machen!
Zusätzliche Pipeline-Methoden und -Funktionen, die von Neuraxle angeboten werden
Hinweis: Wenn für einen Schritt einer Pipeline keine der Anpassungs- oder Transformationsmethoden erforderlich ist , kann er von NonFittableMixin oder NonTransformableMixin erben , um eine Standardimplementierung einer dieser Methoden bereitzustellen , um nichts zu tun.
Als Starter können Pipelines oder deren Schritte optional auch folgende Methoden definieren :
Die folgenden Methoden werden standardmäßig bereitgestellt , um die Verwaltung von Hyperparametern zu ermöglichen:
RandInt(1, 3)
was 1 bis 3 Schichten bedeutet. Sie können.rvs()
dieses Diktat aufrufen , um einen Wert zufällig auszuwählen und an „set_hyperparams“ zu senden, um zu versuchen, darauf zu trainieren.Weitere Informationen zu unseren Lösungsvorschlägen finden Sie in den Einträgen in der großen Liste mit den obigen Links.
quelle