如何在使用交叉验证训练 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等(特征重要性/交叉训练曲线可视化/线性和非线性算法对比/三种模型调参/三种模型融合)实现二手汽车产品交易价格回归预测之详细攻略