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