Я использую несбалансированные данные для выполнения классификации с помощью scikit-learn и для повышения точности модели я создал больше синтетических данных с помощью метода SMOTE. Я хочу знать, когда лучше всего реализовать оптимизацию гиперпараметров с помощью GridSearch. Должен ли я использовать только исходные данные или исходные + синтетические данные?
Должен ли я выполнять GridSearch (для настройки гиперпараметров) до или после SMOTE?
Ответы (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)