【问题标题】:Why does XGBoost with datasets of zeros return a non-zero prediction?为什么具有零数据集的 XGBoost 返回非零预测?
【发布时间】:2021-07-11 08:09:49
【问题描述】:

我最近使用scikit-learn RandomForestRegressor 模型开发了一个功能齐全的随机森林回归软件,现在我有兴趣将其性能与其他库进行比较。 所以我找到了scikit-learn API for XGBoost random forest regression,并用一个 X 特征和全为零的 Y 数据集做了一个小 SW 测试。

from numpy import array
from xgboost import XGBRFRegressor
from sklearn.ensemble import RandomForestRegressor


tree_number = 100
depth = 10
jobs = 1
dimension = 19
sk_VAL = RandomForestRegressor(n_estimators=tree_number, max_depth=depth, random_state=42,
                               n_jobs=jobs)
xgb_VAL = XGBRFRegressor(n_estimators=tree_number, max_depth=depth, random_state=42,
                         n_jobs=jobs)
dataset = array([[0.0] * dimension, [0.0] * dimension])
y_val = array([0.0, 0.0])

sk_VAL.fit(dataset, y_val)
xgb_VAL.fit(dataset, y_val)
sk_predict = sk_VAL.predict(array([[0.0] * dimension]))
xgb_predict = xgb_VAL.predict(array([[0.0] * dimension]))
print("sk_prediction = {}\nxgb_prediction = {}".format(sk_predict, xgb_predict))

令人惊讶的是,xgb_VAL 模型的输入样本全为零的预测结果非零:

sk_prediction = [0.]
xgb_prediction = [0.02500369]

我的评估或构建我得到此结果的比较有什么错误?

【问题讨论】:

  • 好问题。我以前见过它,但大部分都被忽略了,但如果有人知道这里有什么问题,那会很有趣。
  • 我一定会在未来做(它已经在我的“待办事项清单”中),但对于我参与的项目,我需要指出一个“快速替代”模型。

标签: python machine-learning xgboost


【解决方案1】:

XGBoost 似乎在模型中包含了全局偏差,并且该偏差固定为 0.5,而不是根据输入数据计算得出。这已在 XGBoost GitHub 存储库中作为问题提出(请参阅https://github.com/dmlc/xgboost/issues/799)。对应的超参数是base_score,如果您将其设置为零,您的模型将按预期预测为零。

from numpy import array
from xgboost import XGBRFRegressor
from sklearn.ensemble import RandomForestRegressor

tree_number = 100
depth = 10
jobs = 1
dimension = 19

sk_VAL = RandomForestRegressor(n_estimators=tree_number, max_depth=depth, random_state=42, n_jobs=jobs)
xgb_VAL = XGBRFRegressor(n_estimators=tree_number, max_depth=depth, base_score=0, random_state=42, n_jobs=jobs)

dataset = array([[0.0] * dimension, [0.0] * dimension])
y_val = array([0.0, 0.0])

sk_VAL.fit(dataset, y_val)
xgb_VAL.fit(dataset, y_val)

sk_predict = sk_VAL.predict(array([[0.0] * dimension]))
xgb_predict = xgb_VAL.predict(array([[0.0] * dimension]))

print("sk_prediction = {}\nxgb_prediction = {}".format(sk_predict, xgb_predict))
#sk_prediction = [0.]
#xgb_prediction = [0.] 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多