Проблема с конвейером Imblearn и HyperOpt

В настоящее время я пытаюсь выполнить передискретизацию с помощью SMOTE, а затем запустить свой XGBClassifier в конвейере. По какой-то причине я не могу заставить HyperOpt нормально работать с конвейером.

Оба приведенных ниже примера работают правильно:

smote = SMOTE(random_state = 42)
model = XGBClassifier(random_state = 42)
pipe = Pipeline([('smote', smote),
('model',model)])

cv = StratifiedKFold(n_splits = 5)

score = cross_val_score(pipe, X_train, y_train, cv=cv, scoring='roc_auc', n_jobs=-1).mean()

print(score)
model = XGBClassifier(random_state = 42)

def objective_pipe(params):
  model.set_params(**params)

  cv = StratifiedKFold(n_splits = 5)

  score = cross_val_score(model, X_train, y_train, cv=cv, scoring='roc_auc', n_jobs=-1).mean()

  return {'loss': -score, 'params':params, 'status':STATUS_OK}

trials = Trials()
best = fmin(fn=objective_pipe, space = params, algo=tpe.suggest, max_evals = 10, trials = trials, rstate=np.random.RandomState(42))

Однако в тот момент, когда я помещаю конвейер внутрь целевой функции, я получаю значения NaN для оценки.

smote = SMOTE(random_state = 42)
model = XGBClassifier(random_state = 42)
pipe = Pipeline([('smote', smote),
('model',model)])

def objective_pipe(params):
  pipe.set_params(**params)

  cv = StratifiedKFold(n_splits = 5)

  score = cross_val_score(pipe, X_train, y_train, cv=cv, scoring='roc_auc', n_jobs=-1).mean()

  return {'loss': -score, 'params':params, 'status':STATUS_OK}

trials = Trials()
best = fmin(fn=objective_pipe, space = params, algo=tpe.suggest, max_evals = 10, trials = trials, rstate=np.random.RandomState(42))

Возможно, мне просто не хватает чего-то очень простого, но я не совсем уверен, как решить эту проблему. Любые предложения / помощь / ресурсы приветствуются.


person eidoiruson    schedule 15.07.2020    source источник


Ответы (1)


Я не совсем уверен, почему, но у меня была аналогичная проблема, и она исчезла, установив njobs = 1. Я думаю, это связано с неспособностью SMOTE работать в параллельном режиме.

person Sofia Cardoso Pereira    schedule 29.12.2020