提高 XGBoost CV 的速度

机器算法验证 机器学习 交叉验证 超参数 优化 助推
2022-03-30 12:22:45

我的数据集大约有 5 百万行。我打算使用 xgb,cv 找到最佳的发束数量,然后使用插入符号包装器或我自己的自定义超参数调整功能。

XGBoost 的内置 cv 本身需要很长时间。我想其他功能将需要更多时间。

以前我研究过较小的数据集。XGboost 运行得非常快且流畅。

到目前为止,我已经尝试通过将训练数据帧转换为稀疏矩阵、dcgMatrix 和其他几种矩阵类型来进行 CV。仍然需要很多时间。

最后的手段是制作一个验证集并尝试使用该集进行参数调整。从理论上讲,这是一个更合理的想法,但我从未尝试过,对此我不确定。

处理大型数据集的几种方法是什么?

1个回答

我熟悉的“技巧”是:

稀疏矩阵,您已经使用过。但是,您需要确保矩阵中非零值的百分比较低(否则,实际上可能需要更长的时间才能运行)

一棵一棵地种树,观察每批后的表现

我曾经使用过以下(使用 sklearn 的 GBM 实现)

def heldout_auc(model, X_test, y_test):
    score = np.zeros((model.get_params()["n_estimators"],), dtype=np.float64)
    for i, y_pred in enumerate(model.staged_decision_function(X_test)):
        score[i] = auc(y_test, y_pred)
    return score

def cv_boost_estimate(X,y,model,n_folds=3):
    cv = cross_validation.StratifiedKFold(y, n_folds=n_folds, shuffle=True, random_state=11)
    val_scores = np.zeros((model.get_params()["n_estimators"],), dtype=np.float64)
    t = time()
    i = 0
    for train, test in cv:
        i = i + 1
        print('FOLD : ' + str(i) + '-' + str(n_folds))
        model.fit(X.iloc[train,], y.iloc[train])
        val_scores += heldout_auc(model, X.iloc[test,], y.iloc[test])
    val_scores /= n_folds
    return val_scores,(time()-t)

减少 CV 的折叠次数(这会损害性能)。这与您对验证集的描述接近:“最后的手段是制作验证集并尝试使用该集进行参数调整”。但是,我不会推荐这种方法由于 boosting 涉及很多参数,您很容易陷入验证集的过度拟合。

关注一些参数免责声明,这是高度经验性的!根据我的经验,最重要的参数是 max_depth,ηntrees. 最后两个“一起工作”:减少η并增加ntrees可以帮助您提高模型的性能。而似乎有一个“最佳”的最大深度参数。

其他参数(colsample_bytree、subsample)通常不太相关。

看一下 python 实现,我发现我的处理器在 python 上的使用比在 R 上更好。也许这个问题已经修复了……