Использование 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)
Заполните детали по мере необходимости, и трубопровод позаботится обо всем остальном.