1

我在 Stack Overflow 中提到过之前的查询,但仍然无法得出结论。

我有一个包含每月商品价格的数据集。我想使用 SARIMAX 预测价格。我想预测未来 24 个月的价格。最初,我有 509 行实际月度价格。现在我想预测未来 24 个月(或 24 行)的价格,我已经为其创建了新的 Dataframe。新的 Dataframe 还包含实际的 Dataframe 行。

当我使用下面的代码时,我使用“dynamic =True”得到这个图:

 future_df['forecast'] = results.predict(start = 508, end =533, dynamic =True)
 px.line(future_df, x='Date', y= ['Price','forecast'],template = 'plotly_dark')

在此处输入图像描述

当我使用下面的代码时,我使用“dynamic = False”得到这个图:

future_df['forecast'] = results.predict(start = 508, end =533, dynamic =False)
px.line(future_df, x='Date', y= ['Price','forecast'],template = 'plotly_dark')

在此处输入图像描述

现在实际问题来了,我得到了不同的图表。

当我使用下面的代码使用“dynamic =True”或“dynamic =False”时,我得到了不同的图表,以前不是这种情况。

future_df['forecast'] = results.predict(start = 400, end =533, dynamic =True)

px.line(future_df, x='Date', y= ['Price','forecast'],template = 'plotly_dark')

在此处输入图像描述

future_df['forecast'] = results.predict(start = 400, end =533, dynamic =False)
px.line(future_df, x='Date', y= ['Price','forecast'],template = ' plotly_dark')

在此处输入图像描述

我的问题

  1. 为什么我的图表有所不同?我可以注意到动态 = 假与动态 = 真相比提供了更好的预测。
  2. 在预测(开始 = 508,结束 = 533)和验证(例如,开始 = 400,结束 = 533 或开始 = 400,结束 = 508)时,我应该遵循哪种方法(动态 = 假或动态 = 真)?

我还有几个疑问:

Q1) 最初我有 509 行,即 509 个时间段的每月价格(= 行)。现在我想预测未来 24 个月的价格。

我已经使用所有 509 行(价格)构建了 SARIMAX 模型。我想验证每个图的模型。我应该使用哪种方法 "dynamic = True" 或 "dynamic = False" ?例如,我想使用 plotly 验证 509 行内最后 133 行的价格。我可以看到“future_df['forecast'] = results.predict(start = 400, end =533, dynamic =False)”与“future_df['forecast'] = results.predict(start = 400,结束 = 533,动态 = True)"。请指教。

Q2)我使用 dynamic =true 和 false 的预测是相同的。请参阅下面的带有输出的代码。

使用动态 =True 进行预测

future_df['forecast'] = results.predict(start = 510, end =533, dynamic =True)

![509 NaN 510 4697.509465 511 4856.310742 512 4755.252961 513 4787.155811 514 4663.267482 515 4797.953182 516 4888.939789 517 4867.187318 518 4914.688052 519 5096.828530 520 5220.873406 521 5295.573417 522 5542.382493 523 5575.436461 524 5475.326039 525 5524.854306 526 5314.567943 527 5512.470648 528 5556.571233 529 5434.857829 530 5363.764829 531 5541.740158

## 使用动态 =False 进行预测

future_df['forecast'] = results.predict(start = 510, end =533, dynamic =False)

509 NaN 510 4697.509465 511 4856.310742 512 4755.252961 513 4787.155811 514 4663.267482 515 4797.953182 516 4888.939789 517 4867.187318 518 4914.688052 519 5096.828530 520 5220.873406 521 5295.573417 522 5542.382493 523 5575.436461 524 5475.326039 525 5524.854306 526 5314.567943 527 5512.470648 528 5556.571233 529 5434.857829 530 5363.764829 531 5541.740158][6] ][6]

现在我很困惑使用哪种方法来预测未来 24 个月的价格,如果未来 24 个月的预测相似的话。请指教。感谢您提前提供帮助!

4

2 回答 2

3

当您设置dynamic=True时,模型会连续预测前一步 (t+1),然后对于前两步 (t+2) 预测,它会将预测值 (t+1) 附加到数据中,重新拟合新扩展的模型然后数据进行第二步预测。这称为样本外预测。

当您设置dynamic=False时,模型会使用前一时间步的真实值而不是使用预测值顺序提前一步预测。这称为样本内预测。

在您第一次比较从 509 到 533 的图时,您得到相同图的原因是您在外推,您没有预测的下 24 个步骤的真实值,无论设置动态 True 或 False 模型使用样本方法。

由于样本外方法使用上一个时间步的最后一个预测值来及时预测下一个值,随着步数越来越远,它预计会偏离实际值,因为在每一步的预测上,拟合模型都会学习先前的预测步骤的错误也是如此。

从 400 预测到 508 的dynamic=False预测结果将比预期的要好得多dynamic=True,因为它是样本内方法。

于 2021-07-26T17:09:45.057 回答
0

最好的办法可能只是在笔记本或其他任何东西上自己绘制 ['Price''] 并根据真实数据及其外观选择 True 或 False

于 2021-06-27T04:58:27.617 回答