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

scipy.minimize优化HoltWinters参数触发ZeroDivisionError如何解决

问题解决方案

错误根本原因

你使用的三次指数平滑(Holt-Winters)模型计算初始季节分量时,训练集长度不足以覆盖至少1个完整的季节周期,导致n_seasons = 训练集长度 // 季节周期slen结果为0,触发除零错误。你在交叉验证代码中设置的slen=24*7=168,而TimeSeriesSplit拆分出的第一个训练折长度小于168,就会触发该问题。

可落地的解决步骤

  • 第一步:验证训练集长度是否符合要求
    在timeseriesCVscore的交叉验证循环中加入长度校验代码,确认是否存在训练折长度不足的问题,同时避免优化过程中断:
    for train, test in tscv.split(values):
        # 不足2个完整季节周期无法准确计算季节分量,直接返回大损失值
        if len(train) < 2 * 24*7:
            return 1e10
        # 原有模型训练逻辑不变
    
  • 第二步:调整交叉验证参数
    如果你用的sklearn版本≥0.24,给TimeSeriesSplit添加min_train_size参数,强制每个训练折的最小长度:
    tscv = TimeSeriesSplit(n_splits=3, min_train_size=2*24*7)
    
    如果sklearn版本较低,要么减少拆分折数(比如把n_splits改成2),要么增加总数据量,确保拆分后的训练折都能覆盖至少2个完整的季节周期。
  • 第三步:修正代码参数不匹配问题
    你调用minimize时传入了args=(data, mean_squared_log_error),但timeseriesCVscore函数没有接收这两个参数,直接使用了全局变量data,会导致数据传递错误,修改函数定义:
    def timeseriesCVscore(x, data, loss_func):
        errors = []
        values = data.values
        alpha, beta, gamma = x
        # 剩余逻辑不变,计算error时替换为传入的损失函数
        error = loss_func(predictions, actual)
    
  • 第四步:调整初始参数取值
    不要把初始参数x = [0, 0, 0]设为全0,全0的平滑参数会导致模型分量完全不更新,容易触发数值异常,调整为非0的小值:
    x = [0.1, 0.05, 0.05]
    
  • 第五步(可选):如果数据量确实不足,关闭季节项
    如果你的总数据量无法覆盖2个以上的季节周期,把gamma固定为0,改用二次指数平滑(无季节项),避免计算季节分量时的除零问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 11:54:01