Снижение баллов с imblearn трубопровода и SMOTE - PullRequest
0 голосов
/ 04 мая 2020

У меня есть конвейер:

np.random.seed(42)
tf.random.set_seed(42)

pipeline = Pipeline([
    ('smote', SMOTE()),
    ('under',RandomUnderSampler()),
    ('cl', KerasClassifier(build_fn=create_model, verbose=0))
])

param_grid_pipeline = {
    'smote__sampling_strategy':[.3],
    'smote__random_state':[42],
    'under__sampling_strategy':['auto'],
    'under__random_state':[42],   
    'cl__batch_size':[128],
    'cl__epochs':[20],
}

cv = StratifiedShuffleSplit(n_splits=40, test_size=0.2, random_state=42)
grid = GridSearchCV(estimator=pipeline, param_grid=param_grid_pipeline, cv=cv, scoring='f1', verbose=1, n_jobs=-1)
grid_result = grid.fit(X,y)
print("best_score_",grid_result.best_score_)

И best_score_ равен 0.9981313067607172

Однако, если я исключаю повторную выборку из конвейера и выполняю ее извне:

np.random.seed(42)
tf.random.set_seed(42)

over = SMOTE(sampling_strategy=0.3,random_state=42)
under = RandomUnderSampler(sampling_strategy='auto',random_state=42)
X,y = over.fit_resample(X,y)
X,y = under.fit_resample(X,y)

pipeline = Pipeline([
    ('cl', KerasClassifier(build_fn=create_model, verbose=0))
])

param_grid_pipeline = {
    'cl__batch_size':[128],
    'cl__epochs':[20],
}

cv = StratifiedShuffleSplit(n_splits=40, test_size=0.2, random_state=42)
grid = GridSearchCV(estimator=pipeline, param_grid=param_grid_pipeline, cv=cv, scoring='f1', verbose=1, n_jobs=-1)
grid_result = grid.fit(X,y)
print("best_score_",grid_result.best_score_)

И я получаю (из многих прогонов) значительно лучший результат: 0.9999888503305302

Какая разница в использовании повторной выборки извне из конвейера?

1 Ответ

0 голосов
/ 07 мая 2020

Если вы выполняете избыточную и недостаточную выборку извне, вы выполняете ее для всего набора данных и только затем разделяете ее для перекрестной проверки (что объясняет более высокий балл, так как в этом тесте есть «информация» о вашем тренировочном наборе). набор)! Если вы включаете его в конвейер, вы только повторно пробуете обучающий набор (что на самом деле является правильным способом сделать это). Попробуйте выполнить ручное разбиение для перекрестной проверки вручную, а затем выполнить повторную выборку только на тренировочных наборах, а затем вручную рассчитать оценки (поскольку в этом примере у вас фактически нет сетки параметров, это не так уж много работы) и тогда вы должны получить тот же результат.

...