减少Python中xgboost增量训练的错误率

减少Python中xgboost增量训练的错误率,python,memory,machine-learning,xgboost,Python,Memory,Machine Learning,Xgboost,我正在尝试批量训练模型,以提高内存使用率 下面是我在xgboost中进行梯度提升增量训练的示例: 它使用xgb\u模型进行批量训练。但该培训创建的模型的性能仅与在单个批次上培训的模型一样好 我如何减少增量培训所导致的错误 细节 我的增量培训: def xgb_native_batch(batch_size=100): """Train in batches that update the same model""" batches = int(np.ceil(len(y_

我正在尝试批量训练模型,以提高内存使用率

下面是我在
xgboost
中进行梯度提升增量训练的示例:

它使用
xgb\u模型
进行批量训练。但该培训创建的模型的性能仅与在单个批次上培训的模型一样好

我如何减少增量培训所导致的错误

细节 我的增量培训:

def xgb_native_batch(batch_size=100):
    """Train in batches that update the same model"""

    batches = int(np.ceil(len(y_train) / batch_size))

    dtrain = xgb.DMatrix(data=X_train, label=y_train)
    if XGB_MODEL_FILE:
        # Save the model
        bst = xgb.train(
            params=xgb_train_params,
            dtrain=dtrain,
            num_boost_round=0
        )  # type: Booster
        bst.save_model(XGB_MODEL_FILE)
    else:
        # OR just use an empty Booster class
        bst = None

    for i in range(batches):

        start = i * batch_size
        end = start + batch_size
        dtrain = xgb.DMatrix(X_train[start:end, :], y_train[start:end])

        bst = xgb.train(
            dtrain=dtrain,
            params=xgb_train_params,
            xgb_model=XGB_MODEL_FILE or bst
        )  # type: Booster

        if XGB_MODEL_FILE:
            bst.save_model(XGB_MODEL_FILE)

    dtest = xgb.DMatrix(data=X_test, label=y_test)
    pr_y_test_hat = bst.predict(dtest)

    return pr_y_test_hat
测验 测试基于四个数据集。我创建了这些模型:

  • xgb\u native\u bulk
    是一次对所有数据进行训练的参考模型
  • xgb\u native\u bulk\u是在大小为N的子样本上训练的模型
  • xgb\u native\u batch\u
    是对所有数据进行连续训练的模型,这些数据分为大小为N的小批量(通过模型更新进行连续学习):
指标:

make_classification: binary, N=3750
========================================
                       accuracy_score    aurocc
algorithm                                      
xgb_native_bulk                0.8624  0.933398
xgb_native_bulk_100            0.6192  0.669542
xgb_native_batch_100           0.6368  0.689123
xgb_native_bulk_500            0.7440  0.837590
xgb_native_batch_500           0.7528  0.829661
xgb_native_bulk_1000           0.7944  0.880586
xgb_native_batch_1000          0.8048  0.886607

load_breast_cancer: binary, N=426
========================================
                       accuracy_score    aurocc
algorithm                                      
xgb_native_bulk              0.958042  0.994902
xgb_native_bulk_100          0.930070  0.986037
xgb_native_batch_100         0.965035  0.989805
xgb_native_bulk_500          0.958042  0.994902
xgb_native_batch_500         0.958042  0.994902
xgb_native_bulk_1000         0.958042  0.994902
xgb_native_batch_1000        0.958042  0.994902

make_regression: reg, N=3750
========================================
                                mse
algorithm                          
xgb_native_bulk        5.513056e+04
xgb_native_bulk_100    1.209782e+05
xgb_native_batch_100   7.872892e+07
xgb_native_bulk_500    8.694831e+04
xgb_native_batch_500   1.150160e+05
xgb_native_bulk_1000   6.953936e+04
xgb_native_batch_1000  5.060867e+04

load_boston: reg, N=379
========================================
                             mse
algorithm                       
xgb_native_bulk        15.910990
xgb_native_bulk_100    25.160251
xgb_native_batch_100   16.931899
xgb_native_bulk_500    15.910990
xgb_native_batch_500   15.910990
xgb_native_bulk_1000   15.910990
xgb_native_batch_1000  15.910990
问题是,增量学习在长而宽的数据集上做得不好。例如,分类问题:

                       accuracy_score    aurocc
algorithm                                      
xgb_native_bulk                0.8624  0.933398
xgb_native_bulk_100            0.6192  0.669542
xgb_native_batch_100           0.6368  0.689123
一次训练100行的模型与100批训练3750行的模型之间没有差异。而且这两个模型都远远没有同时在3750行上训练的参考模型

工具书类
  • xgboost
    repo获得增量学习的示例:
XGBoost需要整个数据集进行持续学习 XGBoost中的“持续培训”指的是持续的,例如助推轮,如单元测试所示:

即使指定了
xgb\u model
,这些测试也会使用整个数据。然后,“完整模型”的错误率等于增量训练的模型的错误率

当模型根据数据子集进行更新时,它将变得像以前没有过培训一样糟糕


以“外部内存”的名义在讨论中进行内存节省增量培训。总的来说,FAQ涵盖了大数据集的问题。

您的增量培训是否完全解决了冷启动问题?我的Xgboost有问题,每次折叠都会得到冷启动分数,所以我提出了你的线程。你为什么不尝试更新参数?刷新树叶-让我们知道您是否可以回答自己的问题并分享您的经验教训!