XGBoost 在预测超过 300 个类别时变得不稳定

数据挖掘 Python xgboost
2022-03-09 23:48:29

我正在使用 XGBoosts(0.80 版)XGBoostClassifier 的 Python 实现来预测大量类之一。

我的特征数据由约 10M 行、约 5k 列的稀疏布尔矩阵组成,密度为 0.003。(所以每行大约 15 个值)。

我的目标包含 2000 多个不同的类,呈长尾偏态分布(约 300 个类出现超过 1 万次)。

现在,我将所有不常见的类(<10k)归为“其他”,因此它们至少算作负面示例。但理想情况下,我希望能够使用更多不同的类作为实际目标。

但是,每当我使用 800 个不同的目标(每个目标出现约 5k+ 次)时,模型就会变得不稳定:训练需要更长的时间,训练损失似乎没有收敛(不幸的是,我没有保存这个输出) 并且预测质量变得越来越差(对于错误的类,predict_proba 返回 0.99+)。

我应该改变一些我忽略的参数吗?我的损失是否已经没有浮点精度了?是因为approx方法中的采样吗?有没有人有任何想法?

我的具体分类器:

clf = XGBClassifier(
    n_jobs=8,
    max_depth=7, #arbitrary
    min_child_weight=5, #arbitrary
    subsample=0.5, #arbitrary
    colsample_bytree=0.9, #arbitrary
    tree_method='approx',
    objective='multi:softprob',
    eval_metric='mlogloss',
    silent=False
)
1个回答

我担心调整 XGB 分类器可能不是问题,而是您的数据集。

即使有 1000 万行,超过 5000 行的 0.003 的密度似乎还远远不足以获得大约 300 多个类的有趣结果。

我建议从一种更简单的方法开始,以确认建模方法是可以的。这意味着:

  • 将变量分组更多(<100),识别并保留出现显着预测因子的变量
  • 将您的课程分组更多(<10)
  • 从一个更简单的模型开始(可能是随机森林)

一旦你这样做并获得基线性能指标,你可以尝试向你的模型添加更多的类/变量/复杂性,看看它是否真的有所改进。

一步校准过程,您将所有数据转储到一个非常复杂的模型中,这很少是可行的方法。