Использование Smote с Gridsearchcv в Scikit-learn

Я имею дело с несбалансированным набором данных и хочу выполнить поиск по сетке, чтобы настроить параметры моей модели с помощью gridsearchcv от scikit. Для пересчета данных я хочу использовать SMOTE, и я знаю, что могу включить это как этап конвейера и передать его в gridsearchcv. Меня беспокоит то, что я думаю, что smote будет применяться как к обучающим, так и к проверочным сгибам, а это не то, что вы должны делать. Набор проверки не должен быть превышен. Прав ли я, что весь конвейер будет применен к обоим разбиениям набора данных? И если да, как я могу обернуться? Заранее большое спасибо

1 ответ

Решение

Да, это можно сделать, но с imblearn Pipeline.

Видите ли, imblearn имеет собственный конвейер для правильной обработки сэмплеров. Я описал это в подобном вопросе здесь.

Когда звонили predict() на imblearn.Pipeline объект, он пропустит метод выборки и оставит данные, как они должны быть переданы следующему преобразователю. Вы можете подтвердить это, посмотрев на исходный код здесь:

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

Поэтому для правильной работы вам необходимо следующее:

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

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

Заполните детали по мере необходимости, и трубопровод позаботится обо всем остальном.

Другие вопросы по тегам