python - XGBoost 回归 - 超出训练范围的预测值
问题描述
包含各种特征和回归目标(称为 qval)的数据集用于训练 XGBoost 回归器。该值 qval 介于 0 和 1 之间,应具有以下分布:
到现在为止还挺好。但是,当我使用 xgb.save_model() 保存模型并使用 xgb.load_model() 重新加载它以在另一个数据集上预测此 qval 时,预测的 qval 超出 [0,1] 边界,如此处所示。
有人可以解释这是否正常,如果是,为什么会这样?从我的角度来看,可能只是计算 qval 的“方程”(这里是非常糟糕的词)是在某些数据上训练的,而权重并没有真正考虑到 [0,1] 边界。因此,当将这些“权重”应用于新数据时,结果超出范围。虽然不完全确定。
解决方案
是的,xgboost 可以在训练标签范围之外进行预测。
from sklearn.datasets import make_classification
from sklearn.ensemble import GradientBoostingRegressor
X, y = make_classification(random_state=42)
gbm = GradientBoostingRegressor(max_depth=1,
n_estimators=10,
learning_rate=1,
random_state=42)
gbm.fit(X,y)
preds = gbm.predict(X)
print(preds.min(), preds.max())
# Output
#-0.010418732339562916 1.134566081403055
这可能意味着您的测试集与您的训练集不同。
对于随机森林和决策树,这不会发生。
这种现象与 boosting ensembling 及其工作原理有关。
推荐阅读
- java - Selenium Java:如何使用注释从 Excel 中读取数据
- erlang - 如何接收发送到在 gen_server 内运行的 PID 的消息
- angular - angular-oauth2-oidc - 阅读用户声明
- django - 如何自动将配置文件添加到 ManyToManyField?
- javascript - 自定义钩子是一个函数,如何触发另一个函数组件的重新渲染?
- ffmpeg - 我可以将多个 ffmpeg 输出通过管道传输到不同的管道吗?
- python - 为什么“input()”必须在行尾?或者是吗?
- javascript - JavaScript | 如果再次调用函数,则重新启动计时器
- amazon-dynamodb - 无服务器定义具有 GlobalSecondaryIndexes 的 Dynamodb
- c++ - 禁止特定的消毒剂检查,但在所有其他程序上仍然失败