Je ne peux pas comprendre comment cela sklearn.pipeline.Pipeline
fonctionne exactement.
Il y a quelques explications dans le doc . Par exemple, que signifient-ils par:
Pipeline de transformations avec un estimateur final.
Pour clarifier ma question, qu'est-ce que c'est steps
? Comment travaillent-ils?
Éditer
Grâce aux réponses, je peux clarifier ma question:
Quand j'appelle pipeline et que je passe, en étapes, deux transformateurs et un estimateur, par exemple:
pipln = Pipeline([("trsfm1",transformer_1),
("trsfm2",transformer_2),
("estmtr",estimator)])
Que se passe-t-il quand j'appelle ça?
pipln.fit()
OR
pipln.fit_transform()
Je ne peux pas comprendre comment un estimateur peut être un transformateur et comment un transformateur peut être installé.
Réponses:
Transformer dans scikit-learn - une classe qui a une méthode fit et transform, ou une méthode fit_transform.
Predictor - une classe qui a des méthodes d'ajustement et de prédiction, ou une méthode fit_predict.
Le pipeline n'est qu'une notion abstraite, ce n'est pas un algorithme ml existant. Souvent, dans les tâches de ML, vous devez effectuer une séquence de différentes transformations (trouver un ensemble d'entités, générer de nouvelles entités, ne sélectionner que quelques bonnes caractéristiques) de l'ensemble de données brutes avant d'appliquer l'estimateur final.
Voici un bon exemple d'utilisation de Pipeline. Pipeline vous offre une interface unique pour les 3 étapes de transformation et l'estimateur résultant. Il encapsule les transformateurs et les prédicteurs à l'intérieur, et vous pouvez maintenant faire quelque chose comme:
Avec juste:
Avec les pipelines, vous pouvez facilement effectuer une recherche de grille sur un ensemble de paramètres pour chaque étape de ce méta-estimateur. Comme décrit dans le lien ci-dessus. Toutes les étapes sauf la dernière doivent être des transformations, la dernière étape peut être un transformateur ou un prédicteur. Réponse à modifier : Lorsque vous appelez
pipln.fit()
- chaque transformateur à l'intérieur du pipeline sera installé sur les sorties du transformateur précédent (le premier transformateur est appris sur le jeu de données brutes). Le dernier estimateur peut être un transformateur ou un prédicteur, vous pouvez appeler fit_transform () sur le pipeline uniquement si votre dernier estimateur est un transformateur (qui implémente fit_transform, ou les méthodes de transformation et d'ajustement séparément), vous pouvez appeler fit_predict () ou prédire () sur le pipeline uniquement si votre dernier estimateur est le prédicteur. Vous ne pouvez donc tout simplement pas appeler fit_transform ou transformer sur un pipeline, dont la dernière étape est le prédicteur.la source
predicted = pipeline.fit(Xtrain).predict(Xtrain)
?Je pense que M0rkHaV a la bonne idée. La classe de pipeline scikit-learn est un outil utile pour encapsuler plusieurs transformateurs différents à côté d' un estimateur en un seul objet, de sorte que vous suffit d'appeler vos méthodes importantes une fois (
fit()
,predict()
, etc.). Décomposons les deux principaux composants:Les transformateurs sont des classes qui implémentent à la fois
fit()
ettransform()
. Vous connaissez peut-être certains des outils de prétraitement sklearn, commeTfidfVectorizer
etBinarizer
. Si vous regardez la documentation de ces outils de prétraitement, vous verrez qu'ils implémentent ces deux méthodes. Ce que je trouve plutôt cool, c'est que certains estimateurs peuvent également être utilisés comme étapes de transformation, par exempleLinearSVC
!Les estimateurs sont des classes qui implémentent à la fois
fit()
etpredict()
. Vous constaterez que de nombreux classificateurs et modèles de régression implémentent ces deux méthodes et, en tant que tels, vous pouvez facilement tester de nombreux modèles différents. Il est possible d'utiliser un autre transformateur comme estimateur final (c'est-à-dire qu'il n'implémente pas nécessairementpredict()
, mais qu'il implémente définitivementfit()
). Tout cela signifie que vous ne pourrez pas appelerpredict()
.Quant à votre modification: passons par un exemple textuel. En utilisant LabelBinarizer, nous voulons transformer une liste d'étiquettes en une liste de valeurs binaires.
Maintenant, lorsque le binarizer est installé sur certaines données, il aura une structure appelée
classes_
qui contient les classes uniques que le transformateur «connaît». Sans appelerfit()
le binarizer n'a aucune idée de ce à quoi ressemblent les données, donc appelertransform()
n'aurait aucun sens. Cela est vrai si vous imprimez la liste des classes avant d'essayer d'ajuster les données.J'obtiens l'erreur suivante en essayant ceci:
Mais lorsque vous installez le binarizer sur le
vec
liste:et essayez à nouveau
J'obtiens ce qui suit:
Et maintenant, après avoir appelé transform sur le
vec
objet, nous obtenons ce qui suit:Quant aux estimateurs utilisés comme transformateurs, utilisons le
DecisionTree
classifieur comme exemple d'extraction de caractéristiques. Les arbres de décision sont excellents pour de nombreuses raisons, mais pour nos besoins, ce qui est important, c'est qu'ils ont la capacité de classer les fonctionnalités que l' arbre a trouvées utiles pour prédire. Lorsque vous appeleztransform()
un arbre de décision, il prend vos données d'entrée et trouve ce qu'il pense être les fonctionnalités les plus importantes. Vous pouvez donc y penser en transformant votre matrice de données (n lignes par m colonnes) en une matrice plus petite (n lignes par k colonnes), où les k colonnes sont les k caractéristiques les plus importantes trouvées par l'arbre de décision.la source
fit()
ettransform()
est les Transformers? , comment les estimateurs peuvent-ils être utilisés comme transformateurs?fit()
est la méthode que vous appelez pour ajuster ou «entraîner» votre transformateur, comme vous le feriez pour un classificateur ou un modèle de régression. En ce qui concernetransform()
, c'est la méthode que vous appelez pour transformer réellement les données d'entrée en données de sortie. Par exemple, un appelBinarizer.transform([8,2,2])
(après ajustement!) Peut entraîner[[1,0],[0,1],[0,1]]
. Quant à l'utilisation d'estimateurs comme transformateurs, je modifierai un court exemple dans ma réponse.Que sont les pipelines ML et comment fonctionnent-ils?
Un pipeline est une série d'étapes dans lesquelles les données sont transformées. Il vient de l'ancien modèle de conception "pipe and filter" (par exemple, vous pourriez penser à des commandes bash unix avec des tubes "|" ou des opérateurs de redirection ">"). Cependant, les pipelines sont des objets dans le code. Ainsi, vous pouvez avoir une classe pour chaque filtre (aka chaque étape du pipeline), puis une autre classe pour combiner ces étapes dans le pipeline final. Certains pipelines peuvent combiner d'autres pipelines en série ou en parallèle, avoir plusieurs entrées ou sorties, etc. Nous aimons voir les pipelines de Machine Learning comme:
Méthodes d'un pipeline Scikit-Learn
Les pipelines (ou les étapes du pipeline) doivent avoir ces deux méthodes :
Il est également possible d'appeler cette méthode pour enchaîner les deux:
Problèmes de la classe sklearn.pipeline.Pipeline
Scikit-Learn a eu sa première version en 2007, qui était une ère pré-deep learning . Cependant, c'est l'une des bibliothèques d'apprentissage automatique les plus connues et les plus adoptées, et elle continue de croître. En plus de tout, il utilise le modèle de conception Pipe and Filter comme un style architectural logiciel - c'est ce qui rend Scikit-Learn si fabuleux, ajouté au fait qu'il fournit des algorithmes prêts à l'emploi. Cependant, il a d'énormes problèmes lorsqu'il s'agit de faire ce qui suit, ce que nous devrions pouvoir faire en 2020 déjà:
Les solutions que nous avons trouvées aux problèmes de Scikit-Learn
Bien sûr, Scikit-Learn est très pratique et bien construit. Cependant, il a besoin d'un rafraîchissement. Voici nos solutions avec Neuraxle pour rendre Scikit-Learn frais et utilisable dans les projets informatiques modernes!
Méthodes et fonctionnalités de pipeline supplémentaires offertes par Neuraxle
Remarque: si une étape d'un pipeline n'a pas besoin d'avoir l'une des méthodes fit ou transform, elle pourrait hériter de NonFittableMixin ou NonTransformableMixin pour recevoir une implémentation par défaut de l'une de ces méthodes pour ne rien faire.
Pour commencer, il est possible pour les pipelines ou leurs étapes de définir éventuellement ces méthodes :
Les méthodes suivantes sont fournies par défaut pour permettre la gestion des hyperparamètres:
RandInt(1, 3)
ce qui signifie 1 à 3 couches. Vous pouvez faire appel.rvs()
à ce dict pour choisir une valeur au hasard et l'envoyer à «set_hyperparams» pour essayer de vous entraîner dessus.Pour plus d'informations sur nos solutions suggérées, lisez les entrées dans la grande liste avec les liens ci-dessus.
la source