配置增量 XGBoost 模型

数据挖掘 机器学习 xgboost 过拟合
2022-03-16 08:55:12

我有一个无法加载到内存中的大型数据集,因此我决定使用 Xgboost 进行增量学习。我目前所做的是:

  1. 使用大量数据调整 num_boosting_rounds
  2. 将早期停止轮次设置为值 (60) << num_boosting_rounds 以防止过度拟合

当我的训练代码运行时,它会在前两个块上运行 1000 轮,优化损失函数。然后它在每个后续块的 60 轮处停止,因为在第 2 块的第 1000 轮中观察到损失函数的最佳值。这是配置增量模型的正确方法吗?由于大多数训练块的提前停止,这是否会导致我的模型低于标准。

for idx,df in enumerate(df_pointer):
    num_round = 1000
    early_stopping_rounds = 60
    param = {'max_depth':5, 'eta':0.02, 'silent':1, 'objective':'binary:logistic', 'eval_metric':'logloss', 'max_delta_step':4, 'scale_pos_weight': 4}
    dtrain, deval = getDMatrixSplit(df)
    watchlist  = [(deval,'eval')]
    bst = xgb.train(param, dtrain, num_round, watchlist,
    early_stopping_rounds=early_stopping_rounds, xgb_model=xgb_model)
    xgb_model = self.model_path +'/xgb_%s_%s.model'%(ml_algo, idx)
    bst.save_model(xgb_model)
1个回答

XGBoost 的“最佳”停止点实际上取决于您输入其中的数据。

以 Chunk N 和 Chunk N+1 为例,考虑以下两种情况:

  1. Chunk N 和 Chunk N+1 中的数据非常不同- 每个块的最佳停止点可能非常不同。
  2. Chunk N 和 Chunk N+1 中的数据非常相似- 每个块的最佳停止点可能非常相似。

我建议使用不同的方法 - 所以对于每个块:

  • 使用xgb.cv函数首先确定最佳停止点
  • 使用[ie set = ]xgb.cv中的结果xgb.trainnroundsxgb.cv$best.iteration

作为旁注,您是否探索过任何其他技术/工具来处理大型数据集?在 R 中,有一些包旨在解决类似的问题 - 例如bigmemoryff.