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

Posted

技术标签:

【中文标题】如何在使用交叉验证训练 xgboost 模型时跟踪进度?【英文标题】:how to track progress while training xgboost model with cross validation? 【发布时间】:2021-09-01 07:17:21 【问题描述】:

我需要使用 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)

我需要知道还剩多少次迭代...

【问题讨论】:

this 不成功吗? 【参考方案1】:

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

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)。

【讨论】:

我真正需要的是了解这需要多长时间...更改详细信息并不能告诉我还剩多少次迭代... 我用一种估算GridSearchCV总持续时间的方法更新了我的答案。 有没有办法知道我是什么迭代...例如... 1 of 66, 2 of 66... 等等?我对持续时间或时间不感兴趣 我认为没有,但我建议您使用verbose=2 在每次折叠计算结束时记录日志。

以上是关于如何在使用交叉验证训练 xgboost 模型时跟踪进度?的主要内容,如果未能解决你的问题,请参考以下文章

R语言caret包构建xgboost模型实战:特征工程(连续数据离散化因子化无用特征删除)配置模型参数(随机超参数寻优10折交叉验证)并训练模型

R语言构建xgboost模型:xgb.cv函数交叉验证确定模型的最优子树个数(可视化交叉验证对数损失函数与xgboost模型子树个数的关系)交叉验证获取最优子树之后构建最优xgboost模型

R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能

ML之R:通过数据预处理利用LiR/XGBoost等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略

XGBoost文本分类,多分类二分类10-Fold(K-Fold)

如何使用交叉验证来确定使用训练、验证和测试集的最终模型