Должен ли я выполнять GridSearch (для настройки гиперпараметров) до или после SMOTE?

Я использую несбалансированные данные для выполнения классификации с помощью scikit-learn и для повышения точности модели я создал больше синтетических данных с помощью метода SMOTE. Я хочу знать, когда лучше всего реализовать оптимизацию гиперпараметров с помощью GridSearch. Должен ли я использовать только исходные данные или исходные + синтетические данные?


person aasilvaf    schedule 29.10.2019    source источник
comment
Привет и добро пожаловать в SO. Чтобы все остальные поняли и могли помочь вам, рассмотрите возможность редактирования своего вопроса. Вы можете начать с прочтения этой статьи: Как задать хороший вопрос и попробовать переформулировать вопрос. Это поможет другим воспроизвести проблему и, возможно, найти ответ.   -  person Phmarc    schedule 29.10.2019
comment
Конечно, используйте исходные + синтетические данные, потому что это все ваши обучающие данные этой модели.   -  person Jim Chen    schedule 30.10.2019


Ответы (1)


Вы говорите о том, как использовать метод передискретизации, такой как SMOTE, конкретно с GridSearchCV sklearn? Я делаю это предположение, поскольку у вас есть тег scikit-learn в сообщении.

Если это так, вы можете использовать объекты Pipeline для передачи передискретизированных данных SMOTE в GridSearchCV. Если вы хотите подобрать модели со схемой перекрестной проверки через GridSearchCV, sklearn автоматически обработает правильную подгонку/преобразование каждой складки. См. этот ответ здесь, в котором спрашивается, как НЕ применять SMOTE к сверткам проверки:

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

В пакете imblearn есть sklearn-подобный конвейер специально для решения этой проблемы, как указано в приведенной выше ссылке: https://imbalanced-learn.readthedocs.io/en/stable/generated/imblearn.pipeline.Pipeline.html

Трудно понять, не видя ваших примеров кода и того, что вы пытаетесь сделать, но, возможно, это может помочь:

from imblearn.pipeline import Pipeline
from imblearn.over_sampling import SMOTE
from sklearn.ensemble import RandomForestClassifier
from sklearn.preprocessing import StandardScaler

pipe = Pipeline(
    [('scaler', StandardScaler(copy=True),
    ('resample', SMOTE()),
    ('model', RandomForestClassifier()]
)

kf = StratifiedKFold(n_splits=5, shuffle=True)


p_grid = dict(model__n_estimators=[50,100,200])
grid_search = GridSearchCV(
    estimator=pipe, param_grid=p_grid, cv=kf, refit=True
)
grid_search.fit(X_train, y_train)

# Adding below in as could be helpful to know how to get fitted scaler if used
# best = grid_search.best_estimator_
# X_val_scaled = best['scaler'].transform(X_val)
# grid_search.predict(X_val_scaled)
person Marc Kelechava    schedule 30.10.2019