首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XGBoost回归中的负值

XGBoost回归中的负值
EN

Data Science用户
提问于 2020-10-11 05:59:23
回答 2查看 9.2K关注 0票数 4

我正在尝试使用XGBoost执行回归。我的数据集具有所有正值,但有些预测为负值。

我在此链接上读到,减少树木的数量可能对这种情况有所帮助。

我把估计量从700减少到570,负面预测的数量减少了,但有没有办法消除这些负面预测呢?当我进一步尝试将估计量减少到400时,我得到了更高的rmse和更多的负面预测结果。

我查看了负面预测,以了解模型出错的地方(见下图):

看起来,如果我取负预测的绝对值,那就足够了,但这是正确的方法吗?

我的代码是:

代码语言:javascript
复制
!pip install xgboost
!pip install scikit-optimize
from xgboost import XGBRegressor

final_XGB=XGBRegressor(random_state=123,gamma= 24.47 ,learning_rate=0.1235,max_depth=10,min_child_weight=0.21509999999999999,
                      n_estimators=570,subsample=0.74,reg_lambda=0.8)

from sklearn.model_selection import cross_validate

cross_val_scores=cross_validate(final_XGB,X_train,y_train,cv=3,scoring=['neg_mean_squared_error','r2'],verbose=1,return_train_score=True,n_jobs=-1 )

cross_val_scores['test_r2'].mean() #returns 0.9595609470775659

编辑:

更多关于数据集的内容。我正试图预测在某一特定时间内会出现在某个地点的人数。

为了预测人数,我采取了

  • 一天中的一个小时,
  • 日期,
  • 高峰(是公共假日吗?)
  • 周末(1/0),
  • 面积(m2中的位置区域)
  • 地点名称。

位置名称是字符串值(例如: Location1、Location2等)所以我用JamesSteinEncoder对它们进行了转换。

这里没有缺少的值,我已经从数据集中删除了一些异常值。

关于“实际”和“错误”列之间的关系,我绘制了以下图表:

最后结果快照:

EN

回答 2

Data Science用户

发布于 2020-11-11 19:19:55

(从评论升级到答复)

因为您的目标是一个计数变量,所以最好将其建模为Poisson回归。xgboost通过objective='count:poisson'实现了这一点。

@Cryo建议使用对数变换也是值得一试的,但您不应该直接跳过零的转换:而是使用\log(1+Y)或类似的东西。请注意,当日志转换时,您的错误优化将本质上是乘性的:对于真值10,预测100或1具有相同的“错误性”。

票数 2
EN

Data Science用户

发布于 2020-10-11 15:49:48

梯度助推机可以返回超出训练范围的值。看看这篇文章被提升的树能预测到训练标签的最小值吗?

在实践中,这种情况不大可能发生,但对于您的数据来说可能是这样的。

如果正在发生这种情况,可能意味着您的培训数据和您正在评估的数据是不同的。

票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/82851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档