xgboost预测方法为所有行返回相同的预测值

时间:2015-11-02 03:52:11

标签: python machine-learning xgboost

我在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个数值特征

我还尝试使用相同的数据从sklearn进行RandomForest回归,它确实给出了真实的预测。也许是xgboost实现中的合法错误?

7 个答案:

答案 0 :(得分:3)

同样的原因之一是您通过参数伽玛提供高罚款。比较训练响应变量的平均值,并检查预测是否接近此值。如果是,则模型对预测进行过多限制,以使train-rmse和val-rmse尽可能接近。您的预测是最简单的,具有更高的伽玛值。因此,您将获得最简单的模型预测,例如训练集的平均预测或天真预测。

答案 1 :(得分:1)

此问题已收到多个回复,包括此主题以及herehere

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

我正在使用大型稀疏数据集(200,000行和7000列)的随机样本(~0.5%)在本地计算机上进行训练,因为我没有足够的本地内存用于算法。事实证明,对我来说,预测值数组只是目标变量平均值的数组。这告诉我,该模型可能不合适。欠装配模型的一个解决方案是在更多数据上训练您的模型,因此我在具有更多内存的机器上尝试分析并解决了问题:我的预测数组不再是平均目标值的数组。另一方面,问题可能只是我正在观察的预测值切片是从具有非常少信息的训练数据(例如0和纳米)预测的。对于使用非常少的信息训练数据,预测目标特征的平均值似乎是合理的。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您需要为任何真实调查发布可重现的示例。您的响应目标很可能是高度不平衡的,并且您的训练数据不是超级预测的,因此您总是(或几乎总是)预测一个级别。您是否根据预测的概率查看是否存在任何差异?这只是一个没有使用适当的分类标签截止的问题吗?

既然你说RF给出了合理的预测,那么查看你的训练参数会很有用。一眼就看出为什么你在xgboost调用中使用回归目标函数很奇怪 - 这很容易就是你看到这种糟糕表现的原因。尝试将目标更改为:'binary:logistic

答案 4 :(得分:0)

您是否将目标变量保留为预测变量,即火车组中的列? 我注意到,在这种情况下,xgboost会为预测返回一个常量值。

答案 5 :(得分:-2)

我已经尝试过此页面上的所有解决方案,但没有一个起作用。

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

答案 6 :(得分:-2)

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