web-dev-qa-db-fra.com

Python - En quoi consiste exactement sklearn.pipeline.Pipeline?

Je n'arrive pas à comprendre comment le sklearn.pipeline.Pipeline fonctionne exactement.

Il y a quelques explications dans le doc . Par exemple, qu'entendent-ils par:

Pipeline de transformations avec un estimateur final.

Pour clarifier ma question, que sont steps? Comment travaillent-ils?

Modifier

Grâce aux réponses, je peux clarifier ma question:

Lorsque j'appelle pipeline et passe, comme étapes, deux transformateurs et un estimateur, par exemple:

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

Qu'est-ce qui se passe 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é.

84
farhawa

Transformer dans scikit-learn - certaines classes ayant une méthode fit et transform, ou une méthode fit_transform.

Predictor - une classe utilisant des méthodes fit et predits ou une méthode fit_predict.

Pipeline est juste une notion abstraite, ce n'est pas un algorithme ml existant. Souvent, dans les tâches ML, vous devez exécuter une séquence de différentes transformations (rechercher un ensemble d’entités, générer de nouvelles entités, ne sélectionner que quelques-unes des fonctionnalités intéressantes) du jeu de données brutes avant d’appliquer l’estimateur final.

Ici est un bon exemple d'utilisation du pipeline. Pipeline vous offre une interface unique pour les 3 étapes de la 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:

    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)

Avec juste:

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)

Avec les pipelines, vous pouvez facilement effectuer une recherche sur la 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 situé dans le pipeline sera installé sur les sorties du transformateur précédent (le premier transformateur est appris en mode brut). base de données). Le dernier estimateur peut être un transformateur ou un prédicteur. Vous pouvez appeler fit_transform () sur un pipeline uniquement si votre dernier estimateur est un transformateur (qui met en œuvre fit_transform ou transforme et adapte les méthodes séparément). votre dernier estimateur est un prédicteur. Vous ne pouvez donc pas appeler fit_transform ou transformer en pipeline, la dernière étape étant le prédicteur.

129
Ibraim Ganiev

Je pense que M0rkHaV a la bonne idée. La classe de pipeline de Scikit-learn est un outil utile pour encapsuler plusieurs transformateurs différents aux côtés d'un estimateur dans un seul objet, de sorte que vous n'ayez à appeler vos méthodes importantes qu'une seule fois (fit(), predict(), etc.). Décomposons les deux composantes principales:

  1. Transformers sont des classes qui implémentent à la fois fit() et transform(). Vous connaissez peut-être certains des outils de pré-traitement Sklearn, tels que TfidfVectorizer et Binarizer. Si vous examinez la documentation de ces outils de prétraitement, vous remarquerez 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 exemple. LinearSVC!

  2. Estimateurs sont des classes qui implémentent à la fois fit() et predict(). Vous constaterez que de nombreux classificateurs et modèles de régression implémentent ces deux méthodes et que vous pouvez ainsi tester de nombreux modèles différents. Il est possible d’utiliser un autre transformateur en tant qu’estimateur final (c’est-à-dire qu’il n’implémente pas nécessairement predict(), mais qu’il met définitivement en œuvre fit()). Tout cela signifie que vous ne pourriez pas appeler predict().

Quant à votre modification: passons à un exemple textuel. À l'aide de LabelBinarizer, nous souhaitons transformer une liste d'étiquettes en une liste de valeurs binaires.

bin = LabelBinarizer()  #first we initialize

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

Maintenant, lorsque le binariseur est ajusté sur certaines données, il aura une structure appelée classes_ qui contient les classes uniques que le transformateur "connaît". Sans appeler fit(), le binariseur n'a aucune idée de ce à quoi ressemblent les données. Par conséquent, appeler transform() n'aurait aucun sens. Cela est vrai si vous imprimez la liste des classes avant d'essayer d'ajuster les données.

print bin.classes_  

J'obtiens l'erreur suivante en essayant ceci:

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

Mais lorsque vous insérez le binariseur dans la liste vec:

bin.fit(vec)

et essayez à nouveau

print bin.classes_

Je reçois ce qui suit:

['cat' 'dog']


print bin.transform(vec)

Et maintenant, après avoir appelé transform sur l'objet vec, nous obtenons ce qui suit:

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

En ce qui concerne les estimateurs utilisés en tant que transformateurs, utilisons le classifieur DecisionTree comme exemple d’extracteur de fonctions. Les arbres de décision sont parfaits pour de nombreuses raisons, mais pour nos besoins, ce qui est important, c’est qu’ils ont la capacité de classer les caractéristiques que arbre a trouvées utiles pour la prédiction. Lorsque vous appelez transform() dans un arbre de décision, vos données d’entrée seront récupérées et le système trouvera ce que il considère comme les caractéristiques les plus importantes. Vous pouvez donc penser à transformer 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.

12
NBartley