8

我在 Python 中创建了一个 xgboost 分类器:

train 是一个 pandas 数据框,有 100k 行和 50 个特征作为列。目标是熊猫系列

xgb_classifier = xgb.XGBClassifier(nthread=-1, max_depth=3, silent=0, 
                                   objective='reg:linear', n_estimators=100)
xgb_classifier = xgb_classifier.fit(train, target)

predictions = xgb_classifier.predict(test)

然而,在训练之后,当我使用这个分类器来预测值时,整个结果数组是相同的数字。知道为什么会发生这种情况吗?

数据说明:约 50 个具有数值目标的数值特征

我也尝试过RandomForestRegressor使用相同数据的 sklearn,它确实给出了现实的预测。也许是 xgboost 实现中的一个合法错误?

4

9 回答 9

6

这个问题已经收到了几个回复,包括在这个线程以及这里这里

我对 XGBoost 和 LGBM 都遇到了类似的问题。对我来说,解决方案是增加训练数据集的大小。

我在本地机器上使用大型稀疏数据集(200,000 行和 7000 列)的随机样本(~0.5%)进行训练,因为我没有足够的本地内存用于该算法。事实证明,对我来说,预测值数组只是目标变量平均值的数组。这向我表明该模型可能欠拟合。欠拟合模型的一个解决方案是在更多数据上训练模型,因此我尝试在具有更多内存的机器上进行分析,问题得到解决:我的预测数组不再是平均目标值数组。另一方面,问题可能只是我正在查看的预测值切片是根据训练数据预测的,信息非常少(例如 0 和 nan)。对于信息很少的训练数据,

我遇到的其他建议解决方案都对我没有帮助。总结一些建议的解决方案包括:1)检查 gamma 是否太高 2)确保您的目标标签不包含在您的训练数据集中 3)max_depth 可能太小。

于 2018-06-03T21:55:16.107 回答
3

相同的原因之一是您通过参数 gamma 提供了高惩罚。比较您的训练响应变量的平均值并检查预测是否接近此值。如果是,那么模型对预测的限制太多,以使 train-rmse 和 val-rmse 尽可能接近。您的预测是最简单的,具有较高的 gamma 值。所以你会得到最简单的模型预测,比如训练集的平均值作为预测或朴素预测。

于 2017-06-30T11:17:36.730 回答
0

您需要为任何实际调查发布一个可重现的示例。您的响应目标很可能非常不平衡,并且您的训练数据不是超级预测,因此您总是(或几乎总是)得到一个预测类。你有没有看过预测的概率,看看是否有任何差异?这只是没有对分类标签使用正确的截止值的问题吗?

既然您说 RF 给出了合理的预测,那么查看您的训练参数会很有用。乍一看,很好奇为什么您在 xgboost 调用中使用回归目标函数 - 这很可能就是您看到性能如此差的原因。尝试将您的目标更改为:'binary:logistic.

于 2016-01-09T17:27:04.680 回答
0

我刚遇到这个问题并设法解决它。问题是我正在训练tree_method='gpu_hist'它给出了所有相同的预测。如果我设置tree_method='auto'它可以正常工作,但运行时间更长。那么,如果我设置它就可以了tree_method='gpu_hist'base_score=0我认为base_score应该与您的预测变量的平均值有关。

于 2021-12-02T03:51:55.417 回答
0

max_depth =3 会不会太小,试着把它变大,如果我没记错的话,默认值为 7。并将silent设置为1,然后您可以监控每个时期的错误是什么

于 2015-11-05T08:24:51.700 回答
0

尝试min_child_weight在 XGBoost 或min_data_in_leafLightGBM 中(显着)增加:

min_data_in_leaf    oof_rmse
20000               0.052998
2000                0.053001
200                 0.053002
20                  0.053015
2                   0.054261

实际上,这可能是过度拟合掩蔽为欠拟合的情况。例如,在保险理赔频率模型中,零膨胀目标会发生这种情况。一种解决方案是通过将控制最小叶大小的超参数增加到一些相当大的值(例如上面示例中指定的值)来增加每个树叶中稀有目标级别(例如非零保险索赔)的表示/覆盖率。

于 2021-08-27T10:26:16.673 回答
0

您应该检查目标中没有inf值。

于 2021-01-14T23:26:36.050 回答
-2

您使用的超参数可能会导致错误。尝试使用默认值。就我而言,这个问题是通过从参数中删除subsamplemin_child_weight超参数来解决的。

于 2020-10-08T11:09:46.497 回答
-2

我已经尝试了此页面上的所有解决方案,但没有一个有效。

当我对时间序列进行分组时,某些频率会在数据中产生差距。我通过填充所有 NaN 解决了​​这个问题。

于 2020-07-28T14:10:10.320 回答