使用 XGBoost 的预测区间

数据挖掘 回归 xgboost 预言
2021-10-02 07:26:34

我想获得我用来解决回归问题的 xgboost 模型的预测区间。我正在使用此博客上共享的 python 代码,并没有真正理解分位数参数如何影响模型(我使用的是博客上建议的参数值)。当我将此代码应用于我的数据时,我得到了无意义的结果,例如我的目标值的负面预测,而我的目标值总是超过 10K。我不明白这段代码应该如何根据我的数据而变化,非常感谢任何帮助。

我的数据与博客上使用的数据的差异是:

  • 我的分布类似于泊松。
  • 我有超过 100 个功能。

注意:我尝试调整 delta、threshold 和 var 参数,但它们似乎对结果没有可控的影响,并且预测仍然是胡说八道。

2个回答

要为 xgboost 模型生成置信区间,您应该训练多个模型(您可以为此使用 bagging)。每个模型都会为测试样本产生一个响应 - 所有响应都将形成一个分布,您可以使用基本统计数据轻松计算置信区间。您应该为每个测试样本生成响应分布。

这个答案在这里提供: https ://stackoverflow.com/questions/37418938/how-to-obtain-a-confidence-interval-or-a-measure-of-prediction-dispersion-when-u

试试下面的代码。它必须工作正常。这可能需要很长时间(超过 100 个功能)。

如果您想要更高的准确度,请将 max_depth 更改为 6。(因为有 100 个特征。)

我们可以在 0 和 1 之间改变 learning_rate,以提高效率。

import xgboost as xgb
model_xgb = xgb.XGBRegressor(colsample_bytree=0.4603, gamma=0.0468, 
                             learning_rate=0.05, max_depth=3, 
                             min_child_weight=1.7817, n_estimators=4200,
                             reg_alpha=0.4640, reg_lambda=0.8571,
                             subsample=0.5213, silent=1,
                             nthread=-1)

X_train, X_test, Y_train, Y_test= train_test_split(X, Y, random_state= 0)
def model_score_error(model):
    prepared_model=model.fit(X_train, Y_train)
    x=prepared_model.score(X_test,Y_test)
    print('Score: ',x)
    Target_predicted=prepared_model.predict(X_test) 
    MSE=mean_squared_error(Y_test,Target_predicted) 
    print('mean square error', MSE)

model_score_error(model_xgb)