如何使用残差遵循特定分布的事实创建预测区间(在python中)

数据挖掘 机器学习 Python 统计数据 分配
2022-03-02 00:23:22

我正在研究一个软件开发管道,我在其中预测流经管道的不同产品的交货时间。

在对前置时间(目标变量)应用 boxcox 变换并创建 XGBoost 回归模型后,我可以看到残差遵循 t-locationScale 分布。 在此处输入图像描述

因此,现在我查看了本指南,该指南描述了一种为任何回归模型创建预测区间的方法,假设残差是正态分布的。https://qucit.com/a-simple-technique-to-estimate-prediction-intervals-for-any-regression-model_en/

但我试图将它调整到我的发行版。

所以一个 t-locationScale 分布有一个参数。方差仅针对定义。我的特定分布有所以我可以取这个分布的 95% 区间,并说对于任何,预测区间是 95% 的区间残差分布。σμνν>2ν=2.56μ=0.04σ=0.97y^

但我想考虑到预测间隔应该随着不同的输入而变化。我创建了一个回归模型,我对其进行了训练,然后使用验证集进行了预测。然后,我取误差的平方,并在这些数据上训练了一个额外的误差模型。这样误差模型就可以预测残差分布的方差。

  xgb = XGBoostRegressor()
  xgb.fit(X_train,y_train)
  y_hat = xgb.predict(X_val)
  val_error = (y_hat-y_val)**2

  xgb_error = XGBoostRegressor()
  xgb_error.fit(X_val, val_error)

  variance_hat_residuals = xgb_error.predict(X_test)

对于 t-locationScale 分布之间的关系是σν

var =σ2νν2

现在在这里我做了一个我不确定是否有意义的假设。

我假设自由度与所有残差的自由度相同, ,然后我通过以下方法求解νν=2.56σ

σ^=var^(ν2)ν

并根据该分布估计下分位数和上分位数。

 residual_distribution_lower_quantile = scipy.stats.t.ppf(q = 0.025, df = 2.56, scale = sigma)
 residual_distribution_upper_quantile = scipy.stats.t.ppf(q = 0.0975, df = 2.56, scale = sigma)

然后我预测提前并说分布的平均值是y^y^

   pred = xgb.prediction(X_test)
   lower_interval = pred + residual_distribution_lower_quantile
   upper_interval = pred + residual_distribution_upper_quantile

的声明是静态的有意义吗?我的预测区间得分现在是,因为我显然是在简化问题。ν81%

对改进我的方法有什么建议吗?

0个回答
没有发现任何回复~