如何为模型的预测增加信心?

数据挖掘 机器学习 时间序列
2022-03-10 18:37:55

我是 ML 的新手,从事时间序列预测项目。目标是根据历史值预测时间序列的未来结果(int 值,具有不同的上限,将其视为不同大小的停车场可用性预测)。

我目前正在使用使用滑动窗口算法的回归方法。我尝试了不同的 ML 模型,它们似乎工作正常(至少比我的基线好)。

现在我正在尝试为我的预测增加信心,比如“我有 95% 的信心相信结果会是 2”。我正在考虑使用预测均方误差作为指标。

问题是,

  1. 假设预测误差遵循高斯分布并在此基础上增加置信度是否可行?
  2. 对于高度离散的状态空间,我应该使用什么分布?例如,当只有 4 个可能的状态 {0,1,2,3},并且我用 mse 1 预测 2.5,我如何将可能性分布到这些状态?

任何关于一般模型架构和置信度设置的建议都将不胜感激!

2个回答

通常说误差项遵循标准的高斯分布。如果您假设这是真的,那么您的平方误差遵循卡方分布

在概率论和统计学中,自由度为 k 的卡方分布(也称为卡方或 χ2 分布)是 k 个独立标准正态随机变量的平方和的分布。

根据您的(均方)误差,在此处查看有关如何实施准置信度指标的一些想法。它假设误差遵循卡方分布,然后使用归一化 RMSE 为给定的置信水平定义一组置信边界, α, 如下:

[nχ1α2,n2RMSE,nχα2,n2RMSE]

有关所涉及的步骤,请参阅链接。这是从该帖子中获取的编码模拟,并添加了一些注释(需要 python 3):

from scipy import stats
import numpy as np

s = 3                           # a constant to scale the random distribution
n = 4                           # number of samples/states per prediction
alpha = 0.05                    # confidence interval

# distribution with confidence intervals ɑ = 0.05
c1, c2 = stats.chi2.ppf([alpha/2, 1-alpha/2], n)

# we will take this many samples (this pre-allocates the y-vector)
y = np.zeros(50000)

# Loop over each sample and record the result mean sample
# This would be your prediction vector - here it is random noise
for i in range(len(y)):
    y[i] = np.sqrt(np.mean((np.random.randn(n)*s)**2))

# Use the chi-squared distributed confidence intervals to see when predictions fall
# finds percentage of samples that are inside the confidence interval
conf = mean((sqrt(n/c2)*y < s) & (sqrt(n/c1)*y > s))

print("1-alpha={:2f}".format(conf))

这是CrossValidated 上的另一个答案,它提供了该地区的更多信息。


此外,如果您假设您的预测位于高斯分布内,您可以使用预测的方差作为置信度(欢迎使用贝叶斯学习!)。

有一些软件包可以帮助您做到这一点,例如BayesOptimization该网页上有很多示例。从本质上讲,您将能够做出预测并自动获得可靠的置信度估计......以及一些很酷的图来显示您的模型在哪里非常确定,在哪里不是:

贝叶斯优化示例图

假设高斯正态分布是常见的,但有时是不切实际的,尤其是当您的模型是相同独立观测值的最小二乘时。即使这种情况很少发生,许多人也会提出非常有说服力的论据来证明预测的分布是正态的,主要是因为您可以轻松计算置信区间。

在这些所谓的“精确测试”之外,您还拥有重采样技术,这实际上是回答第二个问题(离散分布)的更实用的方法。简而言之,您创建了一个与观察到的历史具有相同分布的模拟历史,进行预测并重复此操作很多次。然后,您可以对这些模拟预测进行统计并测量(而不是计算)置信区间。

各种重采样方法在如何制作模拟样本方面有所不同。两种更常见的技术是:

  • 折刀:你忘记了一点,这使得n模拟样本(n是原始样本的大小)。

  • 引导程序:你随机n观察样本的点,有的点被采集一次,有的点被采集了两次,有的点被采集了 3 次,有的点根本没有采集。这将产生尽可能多的具有相似分布的模拟样本,其“平均值”是观察到的样本。

我更喜欢折刀,因为当过程随着时间的推移而演变时,引导程序会出现问题,但在你的情况下,你可以使用引导程序。