Почему наиболее оцененный XGBClassifier работает иначе, чем стандартный классификатор, соответствующий лучшим параметрам?

Я пытаюсь понять, почему лучший оценщик, найденный RandomizedSearchCV, работает иначе, чем ванильная модель, соответствующая лучшим параметрам, найденным для наилучшего оценщика.

Пока у меня есть классификатор:

clf = XGBClassifier()

Пространство параметров:

param_grid = {
            'max_depth': range(2, 15),
            'learning_rate': [0.0001, 0.001, 0.01, 0.1, 0.2, 0,3],
            'colsample_bytree': [0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
            'colsample_bylevel': [0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],
            'min_child_weight': [0.5, 1.0, 3.0, 5.0, 7.0, 10.0],
            'gamma': [0, 0.25, 0.5, 0.75, 1.0],
            'reg_lambda': [0.1, 1.0, 5.0, 10.0, 15.0, 20.0, 25.0, 30.0, 40.0, 50.0, 75.0, 100.0],
            'n_estimators': range(10, 1000, 10)
}

Параметры обучения:

fit_params = {
  'eval_metric': 'logloss',
  'early_stopping_rounds': 10,
  'eval_set': [(self.X_test[features[:num_features]], self.y_test)]
}

И рандомизированный поиск:

rs_clf = RandomizedSearchCV(
  clf, param_grid, n_iter=n_iter,
  n_jobs=-1, verbose=0, cv=self.tscv,
  scoring='neg_log_loss',
  random_state=random_state
)

Если я тренирую классификатор, я получаю следующее:

rs_clf.fit(self.X_train[features[:num_features]], self.y_train, **fit_params) 

best_score = rs_clf.best_score_
best_estimator = rs_clf.best_estimator_
best_params = rs_clf.best_params_

Затем я делаю прогноз на тестовом наборе, чтобы проверить матрицу путаницы:

y_pred = best_estimator.predict(X_test[best_features])

cnf_matrix = confusion_matrix(y_pred=y_pred, y_true=y_test)

plot_confusion_matrix(cnf_matrix, target_names=['SELL', 'BUY'],
                      title='Confusion matrix', normalize=False, figsize=(8,6))

У меня точность 77,2%... Теперь, если я сделаю следующее:

clf = XGBClassifier(**best_params)
clf.fit(X_train[best_features], y_train)

y_pred = clf.predict(X_test[best_features])

cnf_matrix = confusion_matrix(y_pred=y_pred, y_true=y_test)

plot_confusion_matrix(cnf_matrix, target_names=['SELL', 'BUY'],
                      title='Confusion matrix', normalize=False, figsize=(8,6))

Я получаю 50% точности.... Разве не должно быть 77,2% точности?

0 ответов

Другие вопросы по тегам