美文网首页时间序列模型时间序列分析
三次指数平滑(holt-winter)

三次指数平滑(holt-winter)

作者: 曦宝 | 来源:发表于2019-03-11 18:27 被阅读69次

    我现在深深的发现我老公就是个杠精,我说啥他都要杠,不杠就活不了了。
    生气。
    这里不多说指数平滑的原理,直接给一个结论。

    指数平滑预测模型的使用场合
    预测模型选择 长期趋势 季节效应
    一次指数平滑
    二次指数平滑
    三次指数平滑 有/无

    上述结论出自王燕的《应用时间序列分析》,第四版,196页。

    请王越不要在跟我抬杠,千恩万谢。
    一次指数平滑预测值恒为常数,所以最好只做1期预测。
    最近我司又让我做时间序列了,就目前我的水平而言,做出来的效果最好的是xgboost算法。
    出于兴趣,自己研究了holt-winter的使用方法。

    首先,这里使用的是统计学模型的python库。

    from statsmodels.tsa.holtwinters import ExponentialSmoothing

    其次,下面贴出代码实现方法。
    # -*- encoding:utf-8 -*-
    
    import pandas as pd
    import matplotlib.pyplot as plt
    
    from statsmodels.tsa.holtwinters import ExponentialSmoothing
    
    # 1、对数据的预处理
    input_data = open("ftproot.txt", mode='r').read().split("\n")
    time_data = []
    for i in range(len(input_data)):
        time_data.append(input_data[i].split(","))
    # 全部数据
    all_data = []
    for i in range(len(time_data)):
        all_data.append(float(time_data[i][1]))
    # 分一部分出来作为train数据
    train_data = []
    test_data = []
    train_data.extend([all_data[i] for i in range(0, 1334)])
    test_data.extend([all_data[i] for i in range(1334, len(all_data))])
    
    # 2、模型参数
    ets3 = ExponentialSmoothing(train_data, trend='add', seasonal='add', seasonal_periods=24)
    # 3、拟合模型
    r3 = ets3.fit()
    # 4、预测
    pred3 = r3.predict(start=len(train_data), end=len(all_data)-1)
    # 5、画图,可以忽略
    pd.DataFrame({
        'origin': test_data,
        'pred': pred3
    }).plot(legend=True)
    plt.show()
    print(pred3)
    
    
    image.png

    数据样式如下,一小时一个点,逗号前面是时间,后面是数值。

    第三,下面给出代码的具体含义。

    1、先拿到数据,一小时一个点,去除时间标记,拿到数值,按照时间顺序,存入数组y3中。
    2、设置模型的参数
    看一下源码里怎么说的

        Holt Winter's Exponential Smoothing
    
        Parameters
        ----------
        endog : array-like
            Time series
        trend : {"add", "mul", "additive", "multiplicative", None}, optional
            Type of trend component.
        damped : bool, optional
            Should the trend component be damped.
        seasonal : {"add", "mul", "additive", "multiplicative", None}, optional
            Type of seasonal component.
        seasonal_periods : int, optional
            The number of seasons to consider for the holt winters.
    
        Returns
        -------
        results : ExponentialSmoothing class        
    
        Notes
        -----
        This is a full implementation of the holt winters exponential smoothing as
        per [1]. This includes all the unstable methods as well as the stable methods.
        The implementation of the library covers the functionality of the R 
        library as much as possible whilst still being pythonic.
    

    参数:
    第一个endog,当然是时间序列的数据了,array-like的形式。
    第二个trend是趋势,有三种可选项,就是加法趋势和乘法趋势还有None。
    第三个damped是衰减,Boolean,是否对趋势进行衰减。
    第四个seasonal是季节性(周期),也是三种选项,加法、乘法还有None。
    第五个seasonal_periods,季节性周期,int型,holt-winter要考虑的季节的数量。
    参数比较简单,一目了然。
    我这边设置的趋势和季节都是加性的。因为数据是一小时一个点的,所以周期我给的是24,即一天为一个周期。
    3、拟合模型
    4、预测


    image.png

    看这个效果还不错是吧,那是因为前面都在训练集里面,真正展现实力的是后面分叉的部分。效果很差。
    如果只是把后面的部分截出来看,是不是对比更明显一点。


    image.png

    下图是我用同样的数据,holt-winter和xgboost预测效果以及真实值的对比效果


    image.png

    相关文章

      网友评论

        本文标题:三次指数平滑(holt-winter)

        本文链接:https://www.haomeiwen.com/subject/qbcbpqtx.html