web-dev-qa-db-fra.com

Utilisation de Smote avec Gridsearchcv dans Scikit-learn

J'ai affaire à un ensemble de données déséquilibré et je veux faire une recherche dans la grille pour régler les paramètres de mon modèle en utilisant gridsearchcv de scikit. Pour suréchantillonner les données, je veux utiliser SMOTE, et je sais que je peux l'inclure comme étape d'un pipeline et le transmettre à gridsearchcv. Je crains que je pense que smote sera appliqué à la fois aux trains et aux plis de validation, ce qui n'est pas ce que vous êtes censé faire. L'ensemble de validation ne doit pas être suréchantillonné. Ai-je raison de dire que l'ensemble du pipeline sera appliqué aux deux divisions d'ensembles de données? Et si oui, comment puis-je contourner cela? Merci beaucoup d'avance

10
Ehsan M

Oui, cela peut être fait, mais avec imblearn Pipeline .

Vous voyez, imblearn a son propre Pipeline pour gérer correctement les échantillonneurs. Je l'ai décrit dans ne question similaire ici .

Lorsqu'il est appelé predict() sur un imblearn.Pipeline objet, il sautera la méthode d'échantillonnage et laissera les données telles qu'elles seront transmises au prochain transformateur. Vous pouvez le confirmer en regardant le code source ici :

        if hasattr(transform, "fit_sample"):
            pass
        else:
            Xt = transform.transform(Xt)

Donc, pour que cela fonctionne correctement, vous avez besoin des éléments suivants:

from imblearn.pipeline import Pipeline
model = Pipeline([
        ('sampling', SMOTE()),
        ('classification', LogisticRegression())
    ])

grid = GridSearchCV(model, params, ...)
grid.fit(X, y)

Remplissez les détails si nécessaire et le pipeline s'occupera du reste.

15
Vivek Kumar