Почему лучший оценочный XGBClassifier работает иначе, чем ванильный классификатор, соответствующий лучшим параметрам? - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь понять, почему лучший оценщик, найденный 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% точности?

...