基于ARIMA-CNN-LSTM的python代码全系列

笔者原创,开发了ARIMA系列的预测模型全家桶,该代码质量优异,适合新手学子使用,每一步组合都有效果提升,每一步预测,都有评价指标支撑。

1.1 ARIMA 模型

ARIMA 模型由 Box 和 Jenkins 于 20 世纪 70 年代提出,是一种著名的时间序列预测方法,该模型的基本思想是将数据看成一个时间序列对象,再使用数学模型对该时间序列进行描述,训练完成的模型可以通过时间序列的过去值、现在值来预测未来的数据及趋势,在一些工业设备强度预测等问题中得到了广泛的应用。由于实际的水文序列具有非线性非平稳的特点,而 ARIMA 模型引入了差分,对于非线性非平稳的时间序列也具有良好的处理效果,并对水文序列中的线性关系具有良好的学习效果,故本文采用 ARIMA 模型对未来水位变化情况进行预测。ARIMA 模型由自回归( AR) 模型、移动平均模型( MA) 和差分法( I) 组成,其表达式如下。自回归( AR) 模型用来描述现值与过去值之间的关系,使用指标自身的数据对自身进行预测。

1.2 CNN - LSTM 模型

考虑到影响因素众多,故本文使用了一种基于 CNN - LSTM 的多变量预测模型,将数据的多个变量输入进神经网络模型中,通过 CNN 对数据进行特征提取,其中原理如下。

运行指标:

1、ARIMA预测指标:

RMSE 0.351 

R2 0.332

MAE 0.307 

2、ARIMA-LSTM预测指标(拟合程度大幅提升!!!!!)

test Sccore 0.1540 RMSE

test Sccore 0.1313 MAE

test Sccore 0.8701 R2

3、ARIMA-CNN-LSTM (拟合程度明显提升!!!!!)

test Sccore 0.1487 RMSE

test Sccore 0.1204 MAE

test Sccore 0.8805 R2

部分代码:

#定义稳定性检验函数
def adf_val(ts, ts_title):
    '''
    ts: 时间序列数据,Series类型
    ts_title: 时间序列图的标题名称,字符串
    '''
    # 稳定性(ADF)检验
    adf, pvalue, usedlag, nobs, critical_values, icbest = adfuller(ts)

    name = ['adf', 'pvalue', 'usedlag',
            'nobs', 'critical_values', 'icbest']
    values = [adf, pvalue, usedlag, nobs,
              critical_values, icbest]
    print(list(zip(name, values)))

    return adf, pvalue, critical_values,
    # 返回adf值、adf的p值、三种状态的检验值


#白噪声检验也称为纯随机性检验,当数据是纯随机数据时,再对数据进行分析就没有任何意义了,所以拿到数据后最好对数据进行一个纯随机性检验。
def acorr_val(ts):
    '''
    # 白噪声(随机性)检验
    ts: 时间序列数据,Series类型
    返回白噪声检验的P值
    '''
    lbvalue, pvalue = acorr_ljungbox(ts, lags=1)  # 白噪声检验结果
    return lbvalue, pvalue


def tsplot(y, lags=None, figsize=(14, 8)):
    fig = plt.figure(figsize=figsize)
    layout = (2, 2)
    ts_ax = plt.subplot2grid(layout, (0, 0))
    hist_ax = plt.subplot2grid(layout, (0, 1))
    acf_ax = plt.subplot2grid(layout, (1, 0))
    pacf_ax = plt.subplot2grid(layout, (1, 1))
    y.plot(ax=ts_ax)
    ts_ax.set_title('A Given Training Series')
    y.plot(ax=hist_ax, kind='hist', bins=25)
    hist_ax.set_title('Histogram')
    #自相关(Autocorrelation): 对一个时间序列,现在值与其过去值的相关性。如果相关性为正,则说明现有趋势将继续保持。
    plot_acf(y, lags=lags, ax=acf_ax)
    #可以度量现在值与过去值更纯正的相关性
    plot_pacf(y, lags=lags, ax=pacf_ax)
    [ax.set_xlim(0) for ax in [acf_ax, pacf_ax]]
    sns.despine()

    fig.tight_layout()
    fig.show()

    return ts_ax, acf_ax, pacf_ax

需要进一步交流,欢迎关注笔者V公众号:年轻的战场ssd.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值