ПРИМЕЧАНИЕ : я видел подобный вопрос , но он не решает мою проблему.
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 с.