4 votes

Comment construire un pipeline scikit-learn réutilisable pour le classifieur Random Forest ?

J'essaie de comprendre comment fonctionnent les pipelines scikit-learn. J'ai quelques données fictives et j'essaie d'ajuster un modèle Random Forest à des données d'iris. Voici un peu de code

from sklearn import datasets
from sklearn import svm
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import Pipeline
from sklearn.model_selection import train_test_split
import sklearn.externals
import joblib
from sklearn.datasets import make_classification
from sklearn.svm import SVC
from sklearn.preprocessing import StandardScaler
# Load the Iris dataset
iris = datasets.load_iris()

Diviser les données en formation et test et créer un pipeline en 2 étapes

X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target,random_state=0)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
pipeline = Pipeline([('feature_selection', SelectKBest(chi2, k=2)), ('classification', RandomForestClassifier()) ])
print(type(pipeline))
(112, 4) (38, 4) (112,) (38,)
<class 'sklearn.pipeline.Pipeline'>

Mais lorsque j'exécute pipeline.fit_transform(X_train, y_train) Je reçois un message d'erreur disant AttributeError: 'RandomForestClassifier' object has no attribute 'transform'

Cependant, pipeline.fit(X_train, y_train) fonctionne bien.

Dans un scénario normal, sans aucune pipeline En règle générale, j'ai pris un modèle ML et je l'ai appliqué au code. fit_transform() sur mon training et transform sur mon unseen dataset pour générer des prédictions.

Comment puis-je mettre en place quelque chose de similaire en utilisant des pipelines dans sklearn . Je veux sauvegarder mon pipeline et ensuite effectuer un scoring en le chargeant à nouveau. Puis-je le faire en utilisant pickle ?

Une autre chose concerne le modèle RF lui-même. Je peux obtenir le résumé du modèle en utilisant les méthodes du modèle RF, mais je ne vois aucune méthode dans mon pipeline qui me permette d'imprimer le résumé du modèle à l'aide de pipeline .

2voto

Ben Reiniger Points 3617

Mais lorsque j'exécute pipeline.fit_transform(X_train, y_train) Je reçois un message d'erreur disant AttributeError: 'RandomForestClassifier' object has no attribute 'transform'

En effet, RandomForestClassifier n'est pas transform car il s'agit d'un modèle et non d'un transformateur. Les pipelines mettent en œuvre soit transform o predict (et ses variantes) selon que le dernier estimateur est un transformateur ou un modèle.

En règle générale, vous voudrez donc appeler seulement pipeline.fit(X_train, y_train) puis, en phase de test ou de production, vous appellerez pipeline.predict(X_test, y_test) (ou predict_proba ou ...), qui, en interne, va transform avec la (les) première(s) étape(s) et predict avec la dernière étape.

Comment mettre en place quelque chose de similaire en utilisant les pipelines dans Sklearn. Je veux SAUVEGARDER mon pipeline et ensuite effectuer le scoring en le CHARGEANT à nouveau ? Est-ce que je peux le faire en utilisant pickle ?

Oui, voir Persistance du modèle sklearn pour plus de détails et de recommandations.

Un autre point concerne le modèle RF lui-même. Je peux obtenir le résumé du modèle en utilisant les méthodes du modèle RF, mais je ne vois aucune méthode dans mon pipeline qui me permette d'imprimer le résumé du modèle à l'aide du pipeline.

Il existe plusieurs façons d'accéder aux différentes étapes d'un pipeline. Les étapes d'accès au pipeline sklearn

pipeline.named_steps.classification
pipeline['classification']
pipeline[-1]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X