ARIMA模型准确率显示NaN及测试数据警告问题求助
问题原因与修复方案
1. 测试集NaN准确率与“未来数据集不完整”警告的核心原因
使用stretch_tsibble做拉伸训练时,你设置了.step=1,意味着每个训练窗口仅向后滑动1个时间步,对应测试集仅包含1个观测值。但你调用forecast(h = "1 years")生成了12步预测,这就导致:
- 实际测试数据(
cn中每个窗口的后续数据)只有1个值,无法匹配12步预测,触发“未来数据集不完整”警告 - 准确率计算时因预测值与实际值长度不匹配,无法生成有效指标,返回NaN
2. 训练集NaN准确率的可能原因
部分强制去掉截距的ARIMA模型(带~0设定),在初始小窗口(仅12个观测值)中无法正常收敛,模型拟合失败后,训练集准确率无法计算,返回NaN。
修复步骤
步骤1:匹配预测步长与拉伸逻辑
将预测步长改为h=1,与.step=1的滑动逻辑对齐:
fc <- fit %>% fabletools::forecast(h = 1)
此时每个训练窗口仅预测下1个时间点,能和cn中的测试观测值一一对应,警告会消失,测试集准确率可正常计算。
步骤2:优化模型设定,避免拟合失败
去掉强制~0的设定,让ARIMA自动判断是否需要截距,减少小窗口下的拟合失败概率:
fit <- cn %>% model( ar112 = ARIMA(paid ~ pdq(1,1,2)), ar110 = ARIMA(paid ~ pdq(1,1,0)), ar011 = ARIMA(paid ~ pdq(0,1,1)), ar012 = ARIMA(paid ~ pdq(0,1,2)), ar010 = ARIMA(paid ~ pdq(0,1,0)), ar211 = ARIMA(paid ~ pdq(2,1,1)), ar311 = ARIMA(paid ~ pdq(3,1,1)), ar011010 = ARIMA(paid ~ pdq(0,1,1) + PDQ(0,1,0)), ar001010 = ARIMA(paid ~ pdq(0,1,0) + PDQ(0,1,0)), arm = ARIMA(paid) )
步骤3:调整拉伸窗口的初始大小
如果初始12个月窗口仍导致部分模型拟合失败,可将.init调至更大值(如24),确保有足够数据支撑复杂模型:
cn <- file %>% filter(location == "Central", as.Date(start_month) >= "2012-01-01") %>% filter_index(~ "2022-12-31") %>% stretch_tsibble(.init = 24, .step = 1)
完整修复后代码示例
library(fpp3) # 数据处理 file <- file %>% select(location, start_month, paid) %>% as_tsibble(index = start_month, key = location) # 调整拉伸窗口参数 cn <- file %>% filter(location == "Central", as.Date(start_month) >= "2012-01-01") %>% filter_index(~ "2022-12-31") %>% stretch_tsibble(.init = 24, .step = 1) # 优化模型定义 fit <- cn %>% model( ar112 = ARIMA(paid ~ pdq(1,1,2)), ar110 = ARIMA(paid ~ pdq(1,1,0)), ar011 = ARIMA(paid ~ pdq(0,1,1)), ar012 = ARIMA(paid ~ pdq(0,1,2)), ar010 = ARIMA(paid ~ pdq(0,1,0)), ar211 = ARIMA(paid ~ pdq(2,1,1)), ar311 = ARIMA(paid ~ pdq(3,1,1)), ar011010 = ARIMA(paid ~ pdq(0,1,1) + PDQ(0,1,0)), ar001010 = ARIMA(paid ~ pdq(0,1,0) + PDQ(0,1,0)), arm = ARIMA(paid) ) # 匹配预测步长 fc <- fit %>% fabletools::forecast(h = 1) # 计算准确率 accuracy(fit) # 训练集 accuracy(fc, cn) # 测试集
内容的提问来源于stack exchange,提问作者On_demand
相关产品推荐
相关产品推荐

