【问题标题】:Confusion about predicted value from two-tree xgboost regressor对来自两棵树 xgboost 回归器的预测值的混淆
【发布时间】:2019-03-15 06:01:12
【问题描述】:

我对 xgboost 回归器预测的分数似乎存在差异感到困惑。

我在三样本训练集上训练模型:

X = [[1 2],
    [1 2],
    [2 2]]
y = [5, 5, 8]

...使用此代码:

reg = XGBRegressor(n_estimators=2,max_depth=2,learning_rate=1.0, silent=False,objective=‘reg:linear’)
reg.fit(X,y)
plot_tree(reg, num_trees=0)

...这给了我两棵树,根据这个情节:plot of two trees

但是当我用测试样本X_test = [1,2] 进行预测时,我会感到困惑,因为:

X_test = [1,2]
reg.predict(X_test)
# print score = 4.875

但是上面绘制的树结构的分数应该是:0.25 + 4.125 = 4.375

为什么?我的操作有什么问题吗?

【问题讨论】:

  • 好吧,我找到了答案。每个叶子输出都会添加一个 0.5 的全局偏差。您可以通过在训练时设置 base_score=0 来消除这种偏差。感谢@hcho3。
  • 你的问题真的不清楚。令人困惑的是:您只能从三个样本生成一个两树模型?当您尝试预测时它的行为如何?别的东西?为了清楚起见,请编辑问题。另外,如果您回答了自己的问题,请发布您的自我回答。但只有在你首先澄清问题之后。我从中得到的唯一一件事是您的问题不是关于sklearn api plot_tree(),因为这只是一个绘制您的树的API,并且它工作正常。但是您的问题是关于树本身,而不是绘图 API。
  • 啊,我想你的意思是你的困惑是 predict() 给你的值和你从绘制的两棵树预测时所期望的值之间存在差异。
  • 诚然,如果xgboost plot_tree() 也在图中明确显示base_score 偏差(如果非零),那将是一个很好的增强。但总的来说,我认为回归变量中的base_score 是个坏消息。顺便说一句,plot_tree 与 sklearn 无关,它在xgboost.plotting 中实现(并基于graphviz 绘图包,而不是matplotlib

标签: python prediction xgboost


【解决方案1】:

解决方案:用参数base_score=0声明你的XGBRegressor

根据您在评论中的自我回答,xgboost.XGBRegressor(..., base_score) 存在偏见:

  • base_score – 所有实例的初始预测分数,全局偏差。

(HTML)文档没有告诉您它的默认值,但这似乎是base_score = 0.5,至少命令行帮助似乎是这样说的。对于(二类)分类器来说,这将是一个很好的选择,但对于回归器来说,这可能是一个可怕的默认值,更糟糕的是,它没有被记录在案。

这似乎是一个合法的 docbug,请在 sklearn 上提出。


如果用参数base_score=0 声明您的XGBRegressor 并不能解决问题,您可以尝试在fit()predict() 方法上使用以下(文档不足)参数(根据命令行文档):

  • fit(... base_margin=None, ...)
  • predict(..., output_margin=False, base_margin=None)

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 2018-12-23
    • 2017-09-27
    • 2021-11-27
    • 2019-10-30
    • 2013-07-11
    • 1970-01-01
    • 2020-08-07
    • 2022-10-16
    相关资源
    最近更新 更多