Почему xgboost.cv и sklearn.model_selection.validation_curve имеют большую трудоемкую разницу? - PullRequest
0 голосов
/ 25 марта 2020

ПРИМЕЧАНИЕ : я видел подобный вопрос , но он не решает мою проблему.

XGBoost имеет собственную функцию перекрестной проверки xgboost.cv. Но я хочу использовать интерфейс sklearn , который проще взаимодействовать с пакетом sklearn . Поэтому я использую функцию перекрестной проверки sklearn.model_selection.validation_curve. Обе функции могут возвращать одинаковые train_mean_mae и test_mean_mae, но они имеют большую трудоемкую разницу. Форма (xgboost.cv) стоит несколько секунд, но последняя (validation_curve) стоит около минуты!

Я не могу понять, есть ли какая-то разница, когда xgboost и sklearn реализуют функция перекрестной проверки. Или я допустил некоторые ошибки?

Код написан в блокноте Jupyter.

import numpy as np
import xgboost as xgb

from sklearn.datasets import make_regression
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import cross_validate
from sklearn.model_selection import KFold
from sklearn.model_selection import validation_curve

X, y = make_regression(n_samples=10000, n_features=10)

n_estimators = 50
params = {'n_estimators':n_estimators, 'booster':'gbtree', 'max_depth':5, 'learning_rate':0.05,
          'objective':'reg:squarederror', 'subsample':1, 'colsample_bytree':1}
clf = xgb.XGBRegressor(**params)

cv = KFold(n_splits=5, shuffle=True, random_state=100)
%%time

estimator_range = range(1, n_estimators+1)
train_score, test_score = validation_curve(
    clf, X, y, param_name='n_estimators', param_range=estimator_range,
    cv=cv, scoring='neg_mean_absolute_error'
)
print('train_mae_mean:\n', np.abs(train_score).mean(axis=1))
print('test_mae_mean:\n', np.abs(test_score).mean(axis=1))

validation_curve стоит 57 с.

%%time

params_xgb = params.copy() # 修改参数
num_round = params_xgb['n_estimators']
params_xgb['eta'] = params['learning_rate']
del params_xgb['n_estimators']
del params_xgb['learning_rate']

# xgboost原生接口 进行交叉验证
res = xgb.cv(params_xgb, xgb.DMatrix(X, y), num_round, folds=cv, metrics='mae')
print(res)

xgboost.cv стоит 2,25 с.

...