精华内容
下载资源
问答
  • 通过 Python 代码实现时间序列数据的统计学预测模型 在本篇中,我们将展式使用 Python 统计学模型进行时间序列数据分析。 *** 问题描述 *** 目标:根据两年以上的每日广告支出历史数据,提前预测两个月的广告支出...

    通过 Python 代码实现时间序列数据的统计学预测模型

    在本篇中,我们将展式使用 Python 统计学模型进行时间序列数据分析。
    *** 问题描述 ***
    目标:根据两年以上的每日广告支出历史数据,提前预测两个月的广告支出金额。

    原始数据:2017-01-01 到 2019-09-23 期间的每日广告支出。

    数据准备:划分训练集和测试集。

    df1 = data[['Date','Spend']].set_index('Date')
    train = df1.iloc[:933,:]
    test = df1.iloc[933:,:]
    test.shape,train.shape
    

    测试集大小:(63,1);训练集大小:(933,1)

    本文目录

    1. 综述
    • 时间序列分析常用统计模型
    • 单变量时间序列数据建模的关键要素
    1. ARIMA
    • ACF 和 PACF
    • SARIMA
    • 案例:通过 SARIMA 预测广告支出
    1. ETS
    • ETS
    • Holt-Winter 季节性预测算法
    • 案例:通过 Holt-Winter 季节性预测算法预测广告支出
    1. 算法对比
    2. 结束语

    综述

    时间序列分析常用统计模型

    • 单变量时间序列统计学模型,如:平均方法、平滑方法、有/无季节性条件的 ARIMA 模型。
    • 多变量时间序列统计学模型,如:外生回归变量、VAR。
    • 附加或组件模型,如:Facebook Prophet、ETS。
    • 结构化时间序列模型,如:贝叶斯结构化时间序列模型、分层时间序列模型。

    在本篇文章中,我们主要关注 SARIMA 和 Holt-winters 方法。

    单变量时间序列统计学模型的关键要素

    如果我们想要对时间序列数据进行上述统计学模型分析,需要进行一系列处理使得:(1)数据均值 (2)数据方差 (3)数据自协方差 这三个指标不依赖于时间项。即时间序列数据具有平稳性。

    如何明确时间序列数据是否具有平稳性?可以从两个特征进行判断。(1) 趋势,即均值随时间变化;(2) 季节性,即方差随时间变化、自协方差随时间变化。若满足以上两个条件,则时间序列数据不符合平稳性要求。

    可以通过以下方法消除上述问题:

    1. 变换,如:取对数、取平方等。
    2. 平滑处理,如:移动平均等。
    3. 差分。
    4. 分解。
    5. 多项式拟合,如:拟合回归。

    ARIMA

    Autoregressive Integrated Moving Average model (ARIMA),差分整合移动平均自回归模型。ARIMA(p,d,q)主要包含三项:

    p:AR项,即自回归项(autoregression),将时间序列下一阶段描述为前一阶段数据的线性映射。
    d项,即积分项(integration),时间序列的差分预处理步骤,使其满足平稳性要求
    q:MA项,即移动平均项(moving average),将时间序列下一阶段描述为前一阶段数据平均过程中的残留误差的线性映射。

    该模型需要指定 p d q 三项参数,并按照顺序执行。ARIMA 模型也可以用于开发 AR, MA 和 ARMA 模型。

    ACF 和 PACF 图

    自相关函数,autocorrelation function(ACF),描述了时间序列数据与其之后版本的相关性(如:Y(t) 与 Y(t-1) 之间的相关性)。

    偏自相关函数,partial autocorrelation function(PACF),描述了各个序列的相关性。

    1. 通过 PACF 图可以确定 p
    2. 通过 ACF 图可以确定 q

    SARIMA

    季节性差分自回归滑动平均模型,seasonal autoregressive integrated moving averaging(SARIMA),在 ARIMA 模型的基础上进行了季节性调节。

    其形式为:SARIMA(p,d,q)(P,D,Q)s,其中P,D,Q为季节参数,s为时间序列周期。

    案例:通过 SARIMA 预测广告支出

    首先,我们建立 test_stationarity 来检查时间序列数据的平稳性。

    from statsmodels.tsa.stattools import adfuller
    df1=df.resample('D', how=np.mean)
    
    def test_stationarity(timeseries):
        rolmean = timeseries.rolling(window=30).mean()
        rolstd = timeseries.rolling(window=30).std()
        
        plt.figure(figsize=(14,5))
        sns.despine(left=True)
        orig = plt.plot(timeseries, color='blue',label='Original')
        mean = plt.plot(rolmean, color='red', label='Rolling Mean')
        std = plt.plot(rolstd, color='black', label = 'Rolling Std')
    
        plt.legend(loc='best'); plt.title('Rolling Mean & Standard Deviation')
        plt.show()
        
        print ('<Results of Dickey-Fuller Test>')
        dftest = adfuller(timeseries, autolag='AIC')
        dfoutput = pd.Series(dftest[0:4],
                             index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
        for key,value in dftest[4].items():
            dfoutput['Critical Value (%s)'%key] = value
        print(dfoutput)
    test_stationarity(df1.Spend.dropna())
    

    通过 test_stationarity 函数,可以绘制移动平均值以及标准差,并且通过 Augmented Dickey-Fuller test 输出 P 值。

    对比临界值(critical value)可以看到,时间序列数据时非平稳的。

    首先我们试试对数变换,能不能使数据达到平稳性要求。

    可以看到,利用对数变换df1[‘log_Spend’]=np.log(df1[‘Spend’]),时间序列在阈值为5%时满足平稳性要求。

    接下来,我们试试差分操作:test_stationarity(df1[‘Spend’].diff(1).dropna())

    显然,通过差分操作后,效果更好,时间序列在阈值为1%时满足平稳性要求。

    然后,我们就可以建立 SARIMA 模型,并且预测 2019-07-23 到 2019-09-23 这两个月间每天的广告指出。

    import statsmodels.api as sm
    fit1 = sm.tsa.statespace.SARIMAX(train.Spend, order=(7, 1, 2), seasonal_order=(0, 1, 2, 7)).fit(use_boxcox=True)
    test['SARIMA'] = fit1.predict(start="2019-07-23", end="2019-09-23", dynamic=True)
    plt.figure(figsize=(16, 8))
    plt.plot(train['Spend'], label='Train')
    plt.plot(test['Spend'], label='Test')
    plt.plot(test['SARIMA'], label='SARIMA')
    plt.legend(loc='best')
    plt.show()
    

    现在,让我们通过从 sklearn.metrics 包导入 mean_squared_error,mean_absolute_error 函数计算 mse 和 mae 来检查这个模型的性能。结果如下:

    进行数据可视化:

    从 mse、mae 以及预测曲线可以看出,SARIMA 模型成功预测了时间序列变化趋势和季节性特征。但是在峰值处的表现仍旧有待提高。

    ETS

    ETS,Exponential Smoothing

    由于时间序列数据随时间变化但具有一定的随机性,我们通常希望对数据进行平滑处理。为此,我们将使用 ETS 技术,通过指数方法为过去的数据分配较少的权重。同时将时间序列数据分解为趋势(T)、季节(S)和误差(E)分量。

    三种常用 ETS 方法如下:

    • Linear:双指数平滑;
    • Additive:三指数平滑;
    • Multiplicative:三指数平滑。

    Holt-Winter 季节性预测算法

    Holt-winter 季节性预测算法是一种三指数平滑方法。它包含三个主要部分:水平、趋势、季节性分量。

    案例:通过 Holt-Winter 季节性预测算法预测广告支出

    通过 Holt-winter 季节性预测算法预测 2019-07-23 到 2019-09-23 期间的每日广告支出,代码如下:

    from statsmodels.tsa.api import ExponentialSmoothing
    fit1 = ExponentialSmoothing(np.asarray(train['Spend']) ,seasonal_periods=7 ,trend='add', seasonal='add').fit(use_boxcox=True)
    test['Holt_Winter'] = fit1.forecast(len(test))
    plt.figure(figsize=(16,8))
    plt.plot( train['Spend'], label='Train')
    plt.plot(test['Spend'], label='Test')
    plt.plot(test['Holt_Winter'], label='Holt_Winter')
    plt.legend(loc='best')
    plt.show()
    


    同样,我们通过 mean_squared_error,mean_absolute_error 函数查看 mse 和 mae。

    可以看到,H-W 模型同样能够预测时间序列变化趋势和季节性特征。

    算法对比

    通过将两种算法的预测结果进行对比,可以评价哪种方法预测能力更好。

    从图中可以看出,在MSE和MAE均较低的情况下,SARIMA模型的性能略优于Holt-Winter模型。尽管这两种模式都无法完美地抓住峰谷特征,但它们仍然对企业有用。根据数据,平均每月广告支出为2百万美元以上。而这两种算法的MAE大约在6000左右。换言之,对于一家平均每月广告支出为2百万美元的企业,两个月的广告支出预测误差只在6000美元左右,这是相当可观的。

    结束语

    在本文中,单变量预测方法在广告支出数据上表现良好。但这些方法难以组合/合并新的信号(如事件、天气)。同时这些方法对丢失数据也非常敏感,通常不能很好地预测很长一段时间。

    而在未来的文章中,我们将展示如何使用深度学习技术来预测同一数据集上的时间序列!

    展开全文
  • 在本篇中,我们将展示使用 Python 统计学模型进行时间序列数据分析。 问题描述 目标:根据两年以上的每日广告支出历史数据,提前预测两个月的广告支出金额。 原始数据:2017-01-01 到 2019-09-23 期间的每日广告支出...

    在本篇中,我们将展示使用 Python 统计学模型进行时间序列数据分析。

    问题描述

    目标:根据两年以上的每日广告支出历史数据,提前预测两个月的广告支出金额。

    原始数据:2017-01-01 到 2019-09-23 期间的每日广告支出。

    数据准备:划分训练集和测试集。

    df1 = data[[‘Date’,‘Spend’]].set_index(‘Date’) train = df1.iloc[:933,:] test = df1.iloc[933:,:] test.shape,train.shape

    测试集大小:(63,1);训练集大小:(933,1)。

    1、综述

    时间序列分析常用统计模型

    • 单变量时间序列统计学模型,如:平均方法、平滑方法、有/无季节性条件的 ARIMA 模型。
    • 多变量时间序列统计学模型,如:外生回归变量、VAR。
    • 附加或组件模型,如:Facebook Prophet、ETS。
    • 结构化时间序列模型,如:贝叶斯结构化时间序列模型、分层时间序列模型。

    在本篇文章中,我们主要关注 SARIMA 和 Holt-winters 方法。

    单变量时间序列统计学模型的关键要素

    如果我们想要对时间序列数据进行上述统计学模型分析,需要进行一系列处理使得:

    (1)数据均值
    (2)数据方差
    (3)数据自协方差

    这三个指标不依赖于时间项。即时间序列数据具有平稳性。

    如何明确时间序列数据是否具有平稳性?

    可以从两个特征进行判断:

    (1) 趋势,即均值随时间变化;

    (2) 季节性,即方差随时间变化、自协方差随时间变化。

    若满足以上两个条件,则时间序列数据不符合平稳性要求。

    可以通过以下方法消除上述问题:

    1. 变换,如:取对数、取平方等。
    2. 平滑处理,如:移动平均等。
    3. 差分。
    4. 分解。
    5. 多项式拟合,如:拟合回归。

    2、ARIMA

    Autoregressive Integrated Moving Average model (ARIMA),差分整合移动平均自回归模型。ARIMA(p,d,q)主要包含三项:

    p:AR项,即自回归项(autoregression),将时间序列下一阶段描述为前一阶段数据的线性映射。

    d项,即积分项(integration),时间序列的差分预处理步骤,使其满足平稳性要求

    q:MA项,即移动平均项(moving average),将时间序列下一阶段描述为前一阶段数据平均过程中的残留误差的线性映射。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87U2Njct-1586507267021)(https://upload-images.jianshu.io/upload_images/13825820-cdcf5af2c09d2fb4.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

    该模型需要指定 p d q 三项参数,并按照顺序执行。ARIMA 模型也可以用于开发 AR, MA 和 ARMA 模型。

    ACF 和 PACF 图

    自相关函数,autocorrelation function(ACF),描述了时间序列数据与其之后版本的相关性(如:Y(t) 与 Y(t-1) 之间的相关性)。

    偏自相关函数,partial autocorrelation function(PACF),描述了各个序列的相关性。

    1. 通过 PACF 图可以确定 p
    2. 通过 ACF 图可以确定 q

    SARIMA

    季节性差分自回归滑动平均模型,seasonal autoregressive integrated moving averaging(SARIMA),在 ARIMA 模型的基础上进行了季节性调节。

    其形式为:SARIMA(p,d,q)(P,D,Q)s,其中P,D,Q为季节参数,s为时间序列周期。

    案例:通过 SARIMA 预测广告支出

    首先,我们建立 test_stationarity 来检查时间序列数据的平稳性。

    from statsmodels.tsa.stattools import adfuller df1=df.resample(‘D’, how=np.mean)def test_stationarity(timeseries): rolmean = timeseries.rolling(window=30).meanrolstd = timeseries.rolling(window=30).std plt.figure(figsize=(14,5))sns.despine(left=True) orig = plt.plot(timeseries, color=‘blue’,label=‘Original’)mean = plt.plot(rolmean, color=‘red’, label=‘Rolling Mean’) std = plt.plot(rolstd, color=‘black’, label = ‘Rolling Std’) plt.legend(loc=‘best’); plt.title(‘Rolling Mean & Standard Deviation’) plt.show print (’’) dftest = adfuller(timeseries, autolag=‘AIC’) dfoutput = pd.Series(dftest[0:4], index=[‘Test Statistic’,‘p-value’,’#Lags Used’,‘Number of Observations Used’]) for key,value in dftest[4].items: dfoutput[‘Critical Value (%s)’%key] = value print(dfoutput) test_stationarity(df1.Spend.dropna)

    通过 test_stationarity 函数,可以绘制移动平均值以及标准差,并且通过 Augmented Dickey-Fuller test 输出 P 值。

    对比临界值(critical value)可以看到,时间序列数据时非平稳的。

    首先我们试试对数变换,能不能使数据达到平稳性要求。

    可以看到,利用对数变换df1[‘log_Spend’]=np.log(df1[‘Spend’]),时间序列在阈值为5%时满足平稳性要求。

    接下来,我们试试差分操作:test_stationarity(df1[‘Spend’].diff(1).dropna)。

    显然,通过差分操作后,效果更好,时间序列在阈值为1%时满足平稳性要求。

    然后,我们就可以建立 SARIMA 模型,并且预测 2019-07-23 到 2019-09-23 这两个月间每天的广告指出。

    import statsmodels.api as sm fit1 = sm.tsa.statespace.SARIMAX(train.Spend, order=(7, 1, 2), seasonal_order=(0, 1, 2, 7)).fit(use_boxcox=True) test[‘SARIMA’] = fit1.predict(start=“2019-07-23”, end=“2019-09-23”, dynamic=True)plt.figure(figsize=(16, 8)) plt.plot(train[‘Spend’], label=‘Train’)plt.plot(test[‘Spend’], label=‘Test’) plt.plot(test[‘SARIMA’], label=‘SARIMA’)plt.legend(loc=‘best’) plt.show

    现在,让我们通过从 sklearn.metrics 包导入 mean_squared_error,mean_absolute_error函数计算 mse 和 mae 来检查这个模型的性能。结果如下:

    进行数据可视化:

    从 mse、mae 以及预测曲线可以看出,SARIMA 模型成功预测了时间序列变化趋势和季节性特征。但是在峰值处的表现仍旧有待提高。

    3、ETS

    ETS,Exponential Smoothing

    由于时间序列数据随时间变化但具有一定的随机性,我们通常希望对数据进行平滑处理。为此,我们将使用 ETS 技术,通过指数方法为过去的数据分配较少的权重。同时将时间序列数据分解为趋势(T)、季节(S)和误差(E)分量。

    三种常用 ETS 方法如下:

    • Linear:双指数平滑;
    • Additive:三指数平滑;
    • Multiplicative:三指数平滑。

    Holt-Winter 季节性预测算法

    Holt-winter 季节性预测算法是一种三指数平滑方法。它包含三个主要部分:水平、趋势、季节性分量。

    案例:通过 Holt-Winter 季节性预测算法预测广告支出

    通过 Holt-winter 季节性预测算法预测 2019-07-23 到 2019-09-23 期间的每日广告支出,代码如下:

    from statsmodels.tsa.api import ExponentialSmoothing fit1 = ExponentialSmoothing(np.asarray(train[‘Spend’]) ,seasonal_periods=7 ,trend=‘add’, seasonal=‘add’).fit(use_boxcox=True) test[‘Holt_Winter’] = fit1.forecast(len(test)) plt.figure(figsize=(16,8)) plt.plot( train[‘Spend’], label=‘Train’) plt.plot(test[‘Spend’], label=‘Test’)plt.plot(test[‘Holt_Winter’], label=‘Holt_Winter’) plt.legend(loc=‘best’)plt.show

    同样,我们通过 mean_squared_error,mean_absolute_error 函数查看 mse 和 mae。

    可以看到,H-W 模型同样能够预测时间序列变化趋势和季节性特征。

    4、算法对比

    通过将两种算法的预测结果进行对比,可以评价哪种方法预测能力更好。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XeYaaFjb-1586507267026)(https://upload-images.jianshu.io/upload_images/13825820-9be63052fb689c18.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

    从图中可以看出,在MSE和MAE均较低的情况下,SARIMA模型的性能略优于Holt-Winter模型。尽管这两种模式都无法完美地抓住峰谷特征,但它们仍然对企业有用。根据数据,平均每月广告支出为2百万美元以上。而这两种算法的MAE大约在6000左右。换言之,对于一家平均每月广告支出为2百万美元的企业,两个月的广告支出预测误差只在6000美元左右,这是相当可观的。

    结束语

    在本文中,单变量预测方法在广告支出数据上表现良好。但这些方法难以组合/合并新的信号(如事件、天气)。同时这些方法对丢失数据也非常敏感,通常不能很好地预测很长一段时间。

    而在未来的文章中,我们将展示如何使用深度学习技术来预测同一数据集上的时间序列!

    展开全文
  • 在本篇中,我们将展式使用 Python 统计学模型进行时间序列数据分析。 问题描述目标:根据两年以上的每日广告支出历史数据,提前预测两个月的广告支出金额。 原始数据:2017-01-01 到 2019-09-23 期间的每日广告...

    在本篇中,我们将展式使用 Python 统计学模型进行时间序列数据分析。

    问题描述 目标:根据两年以上的每日广告支出历史数据,提前预测两个月的广告支出金额。

    原始数据:2017-01-01 到 2019-09-23 期间的每日广告支出。

    数据准备:划分训练集和测试集。

    df1 = data[['Date','Spend']].set_index('Date')
    train = df1.iloc[:933,:]
    test = df1.iloc[933:,:]
    test.shape,train.shape

    测试集大小: (63,1) ;训练集大小: (933,1) 。

    本文目录

    1. 综述
    • 时间序列分析常用统计模型
    • 单变量时间序列数据建模的关键要素
    1. ARIMA
    • ACF 和 PACF
    • SARIMA
    • 案例:通过 SARIMA 预测广告支出
    1. ETS
    • ETS
    • Holt-Winter 季节性预测算法
    • 案例:通过 Holt-Winter 季节性预测算法预测广告支出
    1. 算法对比
    2. 结束语

    综述

    时间序列分析常用统计模型

    • 单变量时间序列统计学模型,如:平均方法、平滑方法、有/无季节性条件的 ARIMA 模型。
    • 多变量时间序列统计学模型,如:外生回归变量、VAR。
    • 附加或组件模型,如:Facebook Prophet、ETS。
    • 结构化时间序列模型,如:贝叶斯结构化时间序列模型、分层时间序列模型。

    在本篇文章中,我们主要关注 SARIMA 和 Holt-winters 方法。

    单变量时间序列统计学模型的关键要素

    如果我们想要对时间序列数据进行上述统计学模型分析,需要进行一系列处理使得:(1)___数据均值___ (2)___数据方差___ (3)___数据自协方差___ 这三个指标不依赖于时间项。即时间序列数据具有平稳性。

    如何明确时间序列数据是否具有平稳性?可以从两个特征进行判断。(1) 趋势,即均值随时间变化;(2) 季节性,即方差随时间变化、自协方差随时间变化。若满足以上两个条件,则时间序列数据不符合平稳性要求。

    可以通过以下方法消除上述问题:

    1. 变换,如:取对数、取平方等。
    2. 平滑处理,如:移动平均等。
    3. 差分。
    4. 分解。
    5. 多项式拟合,如:拟合回归。

    ARIMA

    Autoregressive Integrated Moving Average model (ARIMA),差分整合移动平均自回归模型。 ARIMA(p,d,q) 主要包含三项:

    p:AR项,即自回归项(autoregression),将时间序列下一阶段描述为前一阶段数据的线性映射。

    d项,即积分项(integration),时间序列的差分预处理步骤,使其满足平稳性要求

    q:MA项,即移动平均项(moving average),将时间序列下一阶段描述为前一阶段数据平均过程中的残留误差的线性映射。

    该模型需要指定 p d q 三项参数,并按照顺序执行。ARIMA 模型也可以用于开发 AR, MA 和 ARMA 模型。

    ACF 和 PACF 图

    自相关函数,autocorrelation function(ACF),描述了时间序列数据与其之后版本的相关性(如:Y(t) 与 Y(t-1) 之间的相关性)。

    偏自相关函数,partial autocorrelation function(PACF),描述了各个序列的相关性。

    1. 通过 PACF 图可以确定 p
    2. 通过 ACF 图可以确定 q

    SARIMA

    季节性差分自回归滑动平均模型,seasonal autoregressive integrated moving averaging(SARIMA),在 ARIMA 模型的基础上进行了季节性调节。

    其形式为: SARIMA(p,d,q)(P,D,Q)s ,其中 P,D,Q 为季节参数, s 为时间序列周期。

    案例:通过 SARIMA 预测广告支出

    首先,我们建立 test_stationarity 来检查时间序列数据的平稳性。

    from statsmodels.tsa.stattools import adfuller
    df1=df.resample('D', how=np.mean)
    
    def test_stationarity(timeseries):
        rolmean = timeseries.rolling(window=30).mean()
        rolstd = timeseries.rolling(window=30).std()
        
        plt.figure(figsize=(14,5))
        sns.despine(left=True)
        orig = plt.plot(timeseries, color='blue',label='Original')
        mean = plt.plot(rolmean, color='red', label='Rolling Mean')
        std = plt.plot(rolstd, color='black', label = 'Rolling Std')
    
        plt.legend(loc='best'); plt.title('Rolling Mean & Standard Deviation')
        plt.show()
        
        print ('<Results of Dickey-Fuller Test>')
        dftest = adfuller(timeseries, autolag='AIC')
        dfoutput = pd.Series(dftest[0:4],
                             index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])
        for key,value in dftest[4].items():
            dfoutput['Critical Value (%s)'%key] = value
        print(dfoutput)
    test_stationarity(df1.Spend.dropna())

    通过 test_stationarity 函数,可以绘制移动平均值以及标准差,并且通过 Augmented Dickey-Fuller test 输出 P 值。

    对比临界值(critical value)可以看到,时间序列数据时非平稳的。

    首先我们试试对数变换,能不能使数据达到平稳性要求。

    可以看到,利用对数变换 df1[‘log_Spend’]=np.log(df1[‘Spend’]) ,时间序列在阈值为5%时满足平稳性要求。

    接下来,我们试试差分操作: test_stationarity(df1[‘Spend’].diff(1).dropna()) 。

    显然,通过差分操作后,效果更好,时间序列在阈值为1%时满足平稳性要求。

    然后,我们就可以建立 SARIMA 模型,并且预测 2019-07-23 到 2019-09-23 这两个月间每天的广告指出。

    import statsmodels.api as sm
    fit1 = sm.tsa.statespace.SARIMAX(train.Spend, order=(7, 1, 2), seasonal_order=(0, 1, 2, 7)).fit(use_boxcox=True)
    test['SARIMA'] = fit1.predict(start="2019-07-23", end="2019-09-23", dynamic=True)
    plt.figure(figsize=(16, 8))
    plt.plot(train['Spend'], label='Train')
    plt.plot(test['Spend'], label='Test')
    plt.plot(test['SARIMA'], label='SARIMA')
    plt.legend(loc='best')
    plt.show()

    现在,让我们通过从 sklearn.metrics 包导入 mean_squared_error,mean_absolute_error函数计算 mse 和 mae 来检查这个模型的性能。结果如下:

    进行数据可视化:

    从 mse、mae 以及预测曲线可以看出,SARIMA 模型成功预测了时间序列变化趋势和季节性特征。但是在峰值处的表现仍旧有待提高。

    ETS

    ETS,Exponential Smoothing

    由于时间序列数据随时间变化但具有一定的随机性,我们通常希望对数据进行平滑处理。为此,我们将使用 ETS 技术,通过指数方法为过去的数据分配较少的权重。同时将时间序列数据分解为趋势(T)、季节(S)和误差(E)分量。

    三种常用 ETS 方法如下:

    • Linear:双指数平滑;
    • Additive:三指数平滑;
    • Multiplicative:三指数平滑。

    Holt-Winter 季节性预测算法

    Holt-winter 季节性预测算法是一种三指数平滑方法。它包含三个主要部分:水平、趋势、季节性分量。

    案例:通过 Holt-Winter 季节性预测算法预测广告支出

    通过 Holt-winter 季节性预测算法预测 2019-07-23 到 2019-09-23 期间的每日广告支出,代码如下:

    from statsmodels.tsa.api import ExponentialSmoothing
    fit1 = ExponentialSmoothing(np.asarray(train['Spend']) ,seasonal_periods=7 ,trend='add', seasonal='add').fit(use_boxcox=True)
    test['Holt_Winter'] = fit1.forecast(len(test))
    plt.figure(figsize=(16,8))
    plt.plot( train['Spend'], label='Train')
    plt.plot(test['Spend'], label='Test')
    plt.plot(test['Holt_Winter'], label='Holt_Winter')
    plt.legend(loc='best')
    plt.show()

    同样,我们通过 mean_squared_error,mean_absolute_error 函数查看 mse 和 mae。

    可以看到,H-W 模型同样能够预测时间序列变化趋势和季节性特征。

    算法对比

    通过将两种算法的预测结果进行对比,可以评价哪种方法预测能力更好。

    从图中可以看出,在MSE和MAE均较低的情况下,SARIMA模型的性能略优于Holt-Winter模型。尽管这两种模式都无法完美地抓住峰谷特征,但它们仍然对企业有用。根据数据,平均每月广告支出为2百万美元以上。而这两种算法的MAE大约在6000左右。换言之,对于一家平均每月广告支出为2百万美元的企业,两个月的广告支出预测误差只在6000美元左右,这是相当可观的。

    结束语

    在本文中,单变量预测方法在广告支出数据上表现良好。但这些方法难以组合/合并新的信号(如事件、天气)。同时这些方法对丢失数据也非常敏感,通常不能很好地预测很长一段时间。

    源码获取视频案例:850591259

     

    展开全文
  • ARIMA单变量预测股价DEMO时间序列介绍:统计学模型-ARIMA介绍ARIMA 参数选择说明源代码解析参考资料 时间序列介绍: 时间序列(TIME-SERISE)充斥着我们生活的空间,在金融、医疗、交通等领域都可体现,甚至我认为人类...

    时间序列介绍:

    时间序列(TIME-SERISE)充斥着我们生活的空间,在金融、医疗、交通等领域都可体现,甚至我认为人类个体生存生活的时间线都是时间序列,个体在什么时间干了什么事,具体量化细分皆是时间序列。在严格学术意义上大致将时间序列区别为,平稳时间序列和非平稳时间序列。平稳时间序列是标准的严平稳时间序列,表示有着明显的周期性的序列数据,在整个序列中不存在“噪声”等,而现实的世界中大都是非平稳的时间序列,本文中介绍的ARIMA模型主要是针对平稳时间序列有效。

    统计学模型-ARIMA介绍

    网络上存在很多的ARIMA模型的原理介绍,本文在此不再陈述,具体的参考为下。

    https://zhuanlan.zhihu.com/p/67092940

    ARIMA 参数选择说明

    关于ARIMA模型参数的确定是根据具体自己的数据来选择的。一共有三个参数(P、Q、D)
    D: 是数据的差分阶数,根据自己数据的特点选择,但是一般情况下我们选择一阶差分或者二阶差分。
    Q: Q指的是自相关系数(ACF)。自相关(英语:Autocorrelation),也叫序列相关,是一个信号于其自身在不同时间点的互相关。非正式地来说,它就是两次观察之间的相似度对它们之间的时间差的函数。它是找出重复模式(如被噪声掩盖的周期信号),或识别隐含在信号谐波频率中消失的基频的数学工具。它常用于信号处理中,用来分析函数或一系列值,如时域信号。也就是研究序列T时刻与T+K时刻的关系,量化两者间是否存在一定的相似性。
    P: P是指偏相关系数(PACF)。在多要素所构成的序列中,当研究某一个要素对另一个要素的影响或相关程度时,把其他要素的影响视作常数(保持不变),即暂时不考虑其他要素影响,单独研究两个要素之间的相互关系的密切程度,所得数值结果为偏相关系数 。也就是只研究序列T时刻与T+K时刻的关系,忽略中间K-1个数值的影响。
    至于PQ的参数选择可以参考下图:
    在这里插入图片描述

    源代码解析

    本文的数据集是沪深股票数据。具体获取处理可以自行解决。本博客部分代码参考下博客:

    https://blog.csdn.net/qq_36523839/article/details/80191243

    源代码部分:

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    from statsmodels.tsa.arima_model import ARIMA
    from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
    sns.set_style("whitegrid", {"font.sans-serif": ['KaiTi', 'Arial']})
    import csv
    def run_main():
    
        with open('scaled_open.csv', 'r') as csvfile:
            reader = csv.reader(csvfile)
            for i, rows in enumerate(reader):
                if i == 3:  ###读取某行
                    row_2 = rows
                if  i==0:
                    row_0 = rows
        row_0.reverse()
        row_2.reverse()
        data = pd.DataFrame(row_2[:1000],columns=['open'],index=row_0[:1000],dtype=np.float64)
        print(data)
        # plt.plot(data['open'])  # 原始数据
        # plt.title('股市每日开盘价')
        # plt.show()
    
        data = data.set_index(pd.DatetimeIndex(pd.to_datetime(data.index))) ##日期索引转换
        data1_w = data['open'].resample('W-MON').mean()  #一周来采样,更好预测,并取每一周的均值
        data1_train = data1_w['2017':'2019']  # 我们只取2018到2020的数据来训练
        plt.plot(data1_train)
        plt.title('周重采样数据')
        plt.show()
        # data2_train = data2_train.tolist()
        # data2_train = data['open']['2019':'2020']
        data1_train[np.isnan(data1_train)] = 0
        data1_train[np.isinf(data1_train)] = 0
        print(data1_train)
    
        data1_diff = data1_train.diff(1)  # 差分使用pandas的diff()函数可以进行一阶差分
        diff = data1_diff.dropna()
        plt.plot(diff)
        plt.title('一阶差分')
        plt.show()
        #分析ACF
        plot_acf(diff, lags=20)  # 通过plot_acf来查看训练数据,以便我们判断q的取值
        plt.title("股票指数的 ACF")
        plt.show()
        #
        # 分析PACF
        plot_pacf(diff, lags=20)  # 通过plot_pacf来查看训练数据,以便我们判断p的取值
        plt.title("股票指数的 PACF")
        plt.show()
        # 根据ACF和PACF以及差分 定阶并建模
        model = ARIMA(data1_train, order=(2, 1, 3), freq='W-MON')  # pdq    频率按周
        # model = ARIMA(data2_train, order=(2, 1, 3))  # pdq
        # 拟合模型
        arima_result = model.fit()
        print(arima_result.summary())### 打印模型参数
        # 预测
        pred_vals = arima_result.predict('2020-01-01','2021-1-28',dynamic=True, typ='levels')  # 输入预测参数,这里我们预测2021-01-01以后的数据
        print(pred_vals)###输出预测值
        #可视化预测
        stock_forcast = pd.concat([data1_w, pred_vals], axis=1, keys=['original', 'predicted'])  # 将原始数据和预测数据相结合,使用keys来分层
    
        # 构图
        plt.figure()
        plt.plot(stock_forcast)
        plt.title('真实值vs预测值')
        plt.show()
    
    
    if __name__ == "__main__":
        run_main()
    

    参考资料

    https://zhuanlan.zhihu.com/p/67092940
    https://www.cnblogs.com/tianqizhi/p/9277376.html
    https://blog.csdn.net/qq_36523839/article/details/80191243
    https://www.bilibili.com/video/BV1F441187xt?p=2&spm_id_from=pageDriver
    https://zhuanlan.zhihu.com/p/35069699

    展开全文
  • 信用评价是上市公司财务困境预警研究的重要手段之一。本书介绍了肖当前国际上...最后,研究并建立了logistic回归预测模型、AR及AR模型、ARCH类预测模型及神经网络预测技术,探讨了各种方法在我国股市波动预测中的应用。
  • 为实现高精度煤层厚度预测,选取该区对地层岩性分辨率较高的自然伽马作为预测属性,并将计算的岩性概率模型作为三维数据约束进行地质统计学反演。通过地质统计学反演得到的岩性数据,区分了煤层和泥岩,成功的预测了煤层...
  • 统计预测方法及预测模型 统计预测方法及预测模型 统计预测方法及预测模型
  • 针对鄂尔多斯地区煤样,对其做灰成分分析,并测得其灰熔融温度,将煤的灰熔点与煤灰中的化学组成含量建立数学关系,采用统计学的方法运用曲线拟合建立3种灰熔点预测模型,将通过预测模型得到的灰熔融点流动温度的预测值与...
  • 依据测井资料建立岩性概率模型,以电阻率剖面与岩性概率模型约束地质统计学反演,得到地层岩性剖面。地层岩性剖面表明:该区铀矿主要集中在深度100 m左右及180~260 m二个层段,其岩性结构表现为砂泥-细、粗砂岩-砂泥/泥...
  • 数据资料是数学模型与实际问题接轨的重要途径和手段,有时还可以直接从数据资料中发现规 律组建模型。...介绍用统计学的最小二乘法构造拟合数据模型,以及用计算数学的函数插值方法处理数据解决 实际问题。
  • 统计学——时间序列预测

    万次阅读 2019-02-15 10:43:12
    统计学(第6版) 贾俊平 读书笔记 第13章 时间序列分析和预测 时间序列是同一现象在不同时间上的相继观测值排列而成的序列。本书中用t表示所观察的时间,Y表示观察值,则Yi( i =1, 2, …, n)为时间ti上的观察值。 时间...
  • 线性回归预测模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(即自变量)来预测某个连续的数值变量(因变量)。例如,餐厅根据每天的营业数据(菜谱价格、就餐人数等等)来预测就餐规模或者营业额;...
  • 数据统计与预测模型 数据资料是数学模型与实际问题接轨的重要途径和手段有时还可以直接从数据资料中发现规 律组建模型数据分析和处理是统计学研究的主要内容也是计算数学的工作领域近年来随 着计算机科学的发展对...
  • 地质统计学模拟方法能够模拟空间结构和模式,基于统计模型的选择。过去几十年中,多点统计方法得到了快速发展,它通过训练图像推测统计模型。这种方法能够得到更简单的定量模型,更真实地模拟地质结构。目前已经提出...
  • 最近在做销售量预测模型相关的项目,重新拾起时间序列算法,包括AR(自回归模型)、MA(移动平均模型)、ARIMA(差分回归移动平均模型)等。综合预测效果想要特别记录时间序列中的Prophet算法,操作简单,效果显著。...
  • 临床预测模型是指使用参数/半参数/非参数数学模型来评估受试者当前患有某种疾病的概率或将来发生某种结局的可能性。通过该模型,利用已知特征来计算未知结局发生的概率。临床预测模型一般采用各种回归分析方法建模...
  • 【机器学习】基于机器学习的乳腺癌预测模型

    千次阅读 多人点赞 2018-12-11 20:07:54
    基于机器学习的乳腺癌预测模型(附Python代码)前提说明项目介绍导入数据概述数据数据可视化评估算法实施预测代码参考 前提说明 此博客内容为2018年山东省人工智能大赛曲阜师范大学青春梦想队所创作,未经授权,禁止...
  • 看到网上很多人在讲新冠的预测模型,主流的是SIR 与 SIRE, 这里大致记录一下我对传染病模型的理解。之后会陆续补充该模型的应用,扩展,以及code。 一、SIR的由来(网络资料): 该模型最早是在1760年于Daniel ...
  • 全栈技术详解1-个人贷款违约预测模型1.1数据介绍1.2业务分析1.3数据理解1.4数据整理1.5建立分析模型 教科书中一般提供了建模使用的宽表,我们学习的是建立一个逻辑回归模型作预测。但是当我们面临许多张原始客户或...
  • 第七章线性回归预测模型

    千次阅读 多人点赞 2019-07-29 09:22:15
    线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量)。例如,餐厅根据每天的营业数据(包括菜谱价格、就餐人数、预定人数、特价菜折扣等)预测就餐...
  • 线性回归模型属于经典的统计学模型,该模型的应用场景是根据已知的变量(自变量)来预测某个连续的数值变量(因变量)。 一元线性回归模型:y=a+bx+ε import pandas as pd import matplotlib.pyplot as plt ...
  • 预测模型-完整-教程

    千次阅读 2018-05-30 18:23:05
    基于树的方法支持具有高精度、高稳定性和易用性解释的预测模型。不同于线性模型,它们映射非线性关系相当不错。他们善于解决手头的任何问题(分类或回归)。决策树方法,随机森林,梯度增加被广泛用于各种数据科学问题...
  • 针对当前松毛虫滞后阶数确定方法存在局部最优、耗时长等问题,提出一种基于地统计学(GS)快速定阶的松毛虫发生面积组合预测模型(GS-ARIMA-SVM)。首先采用差分自回归移动平均(ARIMA)对松毛虫发生面积进行线性建模预测...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,539
精华内容 11,015
关键字:

统计学预测模型