You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中使用Holt Winters模型出现“Optimization Failure”错误求助

问题:Holt Winters模型报错"Optimization Failure"导致多SKU预测中断

在R中批量处理多个SKU的时间序列预测时,使用Holt Winters模型遇到**"Optimization Failure"**错误,该错误直接中断循环,导致后续SKU无法完成预测。以下是复现代码及数据集结构:

复现代码

library(dplyr)
library(tidyverse)
library(tidyr)
library(tidymodels)
library(forecast)
library(prophet)
library(readxl)

pd1 <- readxl::read_excel("C:X/X/X")
colnames(pd1)[1]="X1"

Y1 = ts(data = pd1$X1,
        frequency = 12,
        start = c(2019,1),
        end = c(2022,8))

training_Y1 = window(x=Y1,
                  end = c(2022,8))

Model_Y1 = HoltWinters(x=training_Y1,
                       seasonal = "additive")

数据集结构

structure(list(X1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 7, 7, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -44L), class = "data.frame")
问题原因

从数据集可以看出,该SKU的序列前30个值全为0,仅最后3个观测值有非零数据,后续又回到0。Holt Winters模型依赖优化算法估计趋势、水平和季节参数,这种极度稀疏、几乎无有效波动的序列无法提供足够信息让算法找到合理参数解,直接触发优化失败。

另外代码中training_Y1与原序列Y1时间范围完全一致,等于未拆分训练集,但这不是报错的核心原因。

解决方法

1. 提前过滤无效序列

在循环处理前,先筛选掉无法拟合的SKU:

  • 判断序列中非零值数量(比如少于5个则跳过)
  • 判断序列方差是否为0(全为0的序列方差为0)

示例代码:

# 定义序列有效性检查函数
valid_series <- function(x) {
  non_zero_count <- sum(x != 0)
  var_x <- var(x, na.rm = TRUE)
  return(non_zero_count >= 5 & var_x > 0)
}

# 循环中先判断再建模
if(valid_series(pd1$X1)) {
  # 执行Holt Winters建模逻辑
} else {
  cat("当前SKU序列无效,跳过\n")
}

2. 循环中加入错误捕获

用tryCatch包裹建模代码,即使当前SKU报错,也能继续处理下一个:

# 示例批量处理框架
sku_list <- unique(pd$sku_id) # 假设数据集包含sku_id列
results <- list()

for(sku in sku_list) {
  sku_data <- pd %>% filter(sku_id == sku) %>% pull(X1)
  Y_ts <- ts(data = sku_data, frequency = 12, start = c(2019,1), end = c(2022,8))
  
  model <- tryCatch({
    HoltWinters(x = Y_ts, seasonal = "additive")
  }, error = function(e) {
    cat(sprintf("SKU %s 建模失败:%s\n", sku, e$message))
    return(NULL)
  })
  
  results[[as.character(sku)]] <- model
}

3. 手动指定模型参数(仅特殊场景使用)

如果非要对稀疏序列建模,可以手动设置alpha(水平平滑参数)、beta(趋势平滑参数)、gamma(季节平滑参数),跳过自动优化:

Model_Y1 = HoltWinters(x=training_Y1,
                       seasonal = "additive",
                       alpha = 0.1,
                       beta = 0.05,
                       gamma = 0.05)

注意:手动参数需结合业务经验调整,预测结果可能可靠性不足。

4. 更换适合稀疏数据的模型

对于大量零值的时间序列,Holt Winters不是最优选择,可尝试:

  • 简单指数平滑(ses()函数)
  • Prophet模型(已加载该包,对稀疏数据兼容性更好)
  • 零膨胀类时间序列模型

内容的提问来源于stack exchange,提问作者user20203146

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 09:35:19