如何在使用交叉验证训练 xgboost 模型时跟踪进度?

时间:2021-06-16 13:01:15

标签: python xgboost

我需要使用 xgboost 和交叉验证来跟踪训练模型的进度,这取决于交叉验证正在考虑的组合数量。 无论如何我可以做到这一点吗?我不需要需要多长时间,只需查看进度即可估计需要进行多少次迭代以及当前进行的是哪一次......

def train_model_xgboost(dataframe, variables, respuesta, mono_constraints):
    X_train, X_test, y_train, y_test = train_test_split( #probar time series train split
    dataframe[variables],
    dataframe[respuesta],
    random_state=2021
)
    param_grid = {'max_depth': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15],
              'subsample': [0.5, 1],
              'learning_rate': [0.001, 0.01, 0.1],
              'booster': ['gbtree'], # 'dart'
              #'sample_type': ['weighted'],
              #'normalize_type': ['forest'],
              #'skip_drop': [0.3],
              'monotone_constraints': [mono_constraints]
              #'tree_method': ['gpu_hist'],  # auto, hist, gpu_hist
              #'predictor': ['gpu_predictor']
              }
    np.random.seed(2021)
    idx_validacion = np.random.choice(
    X_train.shape[0],
    size=int(X_train.shape[0] * 0.1),
    replace=False
)
    X_val = X_train.iloc[idx_validacion, :].copy()
    y_val = y_train.iloc[idx_validacion].copy()

    X_train_grid = X_train.reset_index(drop=True).drop(idx_validacion, axis=0).copy()
    y_train_grid = y_train.reset_index(drop=True).drop(idx_validacion, axis=0).copy()

    # XGBoost necesita pasar los paramétros específicos del entrenamiento al llamar
    # al método .fit()
    fit_params = {"early_stopping_rounds": 5,
              "eval_metric": "rmse", #  rmse, mae, logloss, error, merror, mlogloss, auc
              "eval_set": [(X_val, y_val)],
              "verbose": 0
              }

# Cross Validation
    grid = GridSearchCV(
    estimator=XGBRegressor(
        n_estimators=1000,
        random_state=2021
    ),
    param_grid=param_grid,
    scoring='neg_root_mean_squared_error', #explained_variance  neg_root_mean_squared_error  neg_mean_absolute_error  neg_mean_squared_error  neg_mean_squared_log_error   neg_median_absolute_error   r2   neg_mean_poisson_deviance   neg_mean_gamma_deviance  neg_mean_absolute_percentage_error
    n_jobs=multiprocessing.cpu_count(),
    cv=RepeatedKFold(n_splits=5, n_repeats=2, random_state=2021),
    refit=True,
    verbose=0,
    return_train_score=True
)

    grid.fit(X=X_train_grid, y=y_train_grid, **fit_params)

我需要的是知道还剩下多少迭代...

1 个答案:

答案 0 :(得分:2)

您可以使用 GridSearchCV 参数更改 verbose 的详细程度:

  • 0 : 不冗长

  • >1 : 显示每个折叠和候选参数的计算时间

  • >2 : 分数也显示

  • >3 :折叠和候选参数索引也与计算的开始时间一起显示。

如果您使用的是 Jupyter Notebook,输出将显示在终端窗口中。


编辑

如果您想估计总持续时间,您可以计算组合数,然后将其乘以迭代持续时间和交叉验证拆分数。

您可以使用 ParameterGrid 来测试组合的数量。

from sklearn.model_selection import ParameterGrid
param_grid = {'max_depth': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15],
              'subsample': [0.5, 1],
              'learning_rate': [0.001, 0.01, 0.1],
              'booster': ['gbtree'],
              'monotone_constraints': [mono_constraints]
}

pg = ParameterGrid(param_grid)
len(pg)

在您的情况下 66 然后乘以 t 1 次迭代的持续时间和 10 交叉验证拆分的数量 (n_splits*n_repeats)。