时间序列模型算法 - Prophet,LSTM(二)

article/2025/10/5 19:40:00

时间序列模型 - Prophet

  • 1.时间序列简介
    • 1.1 时间序列 - 平稳性检验
      • 1.1.1 log法
      • 1.1.2 差分法
    • 1.2 平稳性的单位根检验
  • 2.ARIMA
  • 3.Prophet
    • 3.1 Prophet的优点
    • 3.2 安装Prophet
    • 3.3 数据处理
    • 3.4 预测
  • 4.LSTM
    • 4.1 数据处理
    • 4.2 训练预测

1.时间序列简介

在做时间序列时,首先要知道什么样的数据可以做时间序列。

满足时间序列的数据
时间序列具备平稳性条件,数据有规律的,不是随机性的,这里的规律就可以是数据有明显季节性,周期性的变化。

平稳性
平稳性表示的是数据整体的均值和方差不发生“明显”变化,在这种现象下,平稳性又分强稳定和弱平稳。
强平稳 vs 弱平稳

强平稳:强平稳的分布不随时间的改变而改变,存在一些白噪声
弱平稳:期望与相关系数不变,未来时刻的值,就会依赖过去的信息,存在依赖性

那数据长什么样子
如下图所示,做时间序列模型,数据就只有二个特征,一个是时间,一个就是值。
在这里插入图片描述

1.1 时间序列 - 平稳性检验

拿到数据后,第一步就是观察数据是否具备平稳性,如果不具备就需要对数据做处理例如:

  1. 对数变换:变换的序列必须满足大于0
  2. 平滑法
  3. 差分
  4. 分解

以kaggle数据中 航空乘客数据为例:AirPassengers.csv

data = pd.read_csv('AirPassengers.csv')

数据集是这样的:
在这里插入图片描述
求时间序列数据均值,方差,我们通常可以以年或者月为单位,求连续几年,或者连续几月的均值和方差,这里就需要用到一个函数rolling,函数详细如下

data.rolling(3).mean()

首先对时间序列数据按时间顺序排序,rolling函数对每个数据,选择其自身数据加上最近前的二个数据,然后对这三个数据进行运算聚合(mean)(std)。
在这里插入图片描述

import numpy as np
import pandas as pd
from datetime import datetime
import matplotlib.pylab as plt
from matplotlib.pylab import rcParamsfrom statsmodels.tsa.stattools import adfuller
from statsmodels.tsa.stattools import acf, pacf
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.arima_model import ARIMA# Display and Plottingimport seaborn as sns
%matplotlib inline
rcParams['figure.figsize']=10,6def test_stationarity(timeseries):rolmean = timeseries.rolling(12).mean()rolstd = timeseries.rolling(12).std()plt.plot(timeseries, color='blue',label='Original')plt.plot(rolmean, color='red', label='Rolling Mean')plt.plot(rolstd, color='black', label = 'Rolling Std')plt.legend(loc='best')plt.title('Rolling Mean and Standard Deviation')plt.show(block=False)print("Results of dickey fuller test")adft = adfuller(timeseries,autolag='AIC')output = pd.Series(adft[0:4],index=['Test Statistics','p-value','No. of lags used','Number of observations used'])for key,values in adft[4].items():output['critical value (%s)'%key] =  valuesprint(output)
test_stationarity(data.Passengers)

在这里插入图片描述

从上图看,黑色色为方差数据,红色为均值数据,从数据上看,是不具备平稳性,那我们就需要对数据进行差分或者log处理

1.1.1 log法

data_log = np.log(data.Passengers)
moving_avg = data_log.rolling(12).mean()
std_dev = data_log.rolling(12).std()
plt.legend(loc='best')
plt.title('Moving Average')
plt.plot(data_log, label='Original')
plt.plot(std_dev, color ="black", label = "Standard Deviation")
plt.plot(moving_avg, color="red", label = "Mean")
plt.legend()

在这里插入图片描述

1.1.2 差分法

前一时刻减后一时刻,一阶差分

data_diff=data['#Passengers'].diff(1)
moving_avg = data_diff.rolling(12).mean()
std_dev = data_diff.rolling(12).std()
plt.legend(loc='best')
plt.title('Moving Average')
plt.plot(data_diff, label='Original')
plt.plot(std_dev, color ="black", label = "Standard Deviation")
plt.plot(moving_avg, color="red", label = "Mean")
plt.legend()

在这里插入图片描述

1.2 平稳性的单位根检验

ADF是一种常用的单位根检验方法,他的原假设为序列具有单位根,即非平稳,对于一个平稳的时序数据,就需要在给定的置信水平上显著,拒绝原假设

观察数据平稳性就是观察它的均值和方差 是否发生明显变化,来判断是不是平稳的,是不是适合做时间序列。
也可以使用单位根来检验是否平稳性,单位根检验更准确些,具体如何参考如下博客内容:单位根解释

2.ARIMA

ARIMA模型

3.Prophet

Prophet是一种基于加法模型的时间序列数据预测程序,其中非线性趋势与年度、每周和每日的季节性以及假日效应相匹配。它最适用于具有强烈季节性影响的时间序列和几个季节的历史数据。Prophet对缺失数据和趋势变化非常敏感,通常能很好地处理异常值。

Prophet是Facebook核心数据科学团队发布的开源软件。可在PyPI上下载

3.1 Prophet的优点

  1. 准确快速——Prophet准确快速。Facebook上的许多应用程序都使用它来为规划和目标设定提供可靠的预测。
  2. 全自动-Prophet是全自动的。无需人工操作,我们就能对混乱的数据做出合理的预测。
  3. 可调预测——Prophet生成可调预测。它包括许多用户调整预测的可能性。通过添加领域知识,我们可以使用人类可解释的参数来改进预测
  4. 在R或Python中可用-我们可以在R或Python中实现Prophet过程。
  5. 能够很好地处理季节变化——Prophet能够适应多个时期的季节性。
  6. 对异常值的鲁棒性——它对异常值具有鲁棒性。它通过删除异常值来处理异常值。
  7. 对缺失数据的鲁棒性——Prophet对缺失数据具有弹性

3.2 安装Prophet

亲测有效

conda install pystan
conda install -c conda-forge fbprophet
conda install plotly -y

在这里插入图片描述

3.3 数据处理

Prophet还强制要求输入列必须命名为ds(时间列)和y(度量列),因此,我们必须重命名数据框中的列。

data = data.rename(columns={'Month': 'ds','AirPassengers': 'y'})

3.4 预测

接下来,我们来使用Prophet库预测时间序列数据的未来值

model = Prophet(interval_width=0.95)
model.fit(data)

我们可以通过make_future_DataFrame函数来修改我们预测的范围和预测数据帧。

future_dates = model.make_future_dataframe(periods=36, freq='MS')
future_dates.head()

模型生成了未来36个月的数据帧时间戳
在这里插入图片描述

预测future_dates的数据帧,模型Prophet返回一个包含特征列的大型数据框,其中比较重要的就如下特征:

  • ds:预测值的日期戳
  • yhat:时间序列预测的值
  • yhat_lower:预测值的下限(类似于箱型图的25%)
  • yhat_upper:预测值的上限
forecast = my_model.predict(future_dates)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head()

在这里插入图片描述
绘制的预测结果

model.plot(forecast, uncertainty=True)

在这里插入图片描述
其中观测值为黑点,蓝线就是预测的值,预测的不确定性区间(蓝色阴影区域)。

为了反映预测值的数据分布趋势情况,可以使用函数plot_components绘制图

model.plot_components(forecast)

在这里插入图片描述
从上面二个图可以得到二个特点,也可以作为模型的预测,可解释:

  1. 第一个图显示,每月的航空乘客量随着时间的推移呈线性增长。
  2. 第二个图显示,每周的乘客数量在周末和周六达到高峰

增加趋势变化点,趋势变化点是时间序列在轨迹上发生突变的日期时间点,默认情况下,Prophet会在最初80%的数据集中添加25个趋势变化点。

from fbprophet.plot import add_changepoints_to_plot
fig = model.plot(forecast)
a = add_changepoints_to_plot(fig.gca(), model, forecast)

在这里插入图片描述
查看发生转折点的日期

model.changepoints

在一些真实的时间序列数据往往在趋势中存在一些突变点,这个时候就需要去调整趋势变化点,相当于正则化处理。

#调整数据趋势变化点为20个,changepoint_Preor_scale增加到0.01,使趋势更灵活
pro_change= Prophet(n_changepoints=20,yearly_seasonality=True, changepoint_prior_scale=0.001)
forecast = pro_change.fit(df).predict(future_dates)
fig= pro_change.plot(forecast);
a = add_changepoints_to_plot(fig.gca(), pro_change, forecast)

在这里插入图片描述

4.LSTM

LSTM(Long Short Term Memory Network)长短时记忆网络,是一种改进之后的循环神经网络,可以解决 RNN 无法处理长距离的依赖的问题,模型有很多种如下:
在这里插入图片描述
我们模型选择的是“many to one”,通过过去的连续的时间段的乘客值,来预测未来下一点时间点的乘客值。

4.1 数据处理

data.set_index('Month', inplace=True)#标准化
from sklearn.preprocessing import MinMaxScaler
scaler=MinMaxScaler(feature_range=(0,1))
data=scaler.fit_transform(data)train = int(len(data)*0.75)
test = len(data)-train
train_data,test_data=data[0:train,:],data[train:len(data),:1]

我们这里选择连续4个时间点的数据作为训练集的X,用这个4个时间点的下个时间点的数据作为训练集的Y,因此我需要把数据处理成如下的格式:
在这里插入图片描述

def create_dataset(dataset, time_step=1):dataX, dataY = [], []for i in range(len(dataset)-time_step-1):a = dataset[i:(i+time_step), 0]   ###i=0, 0,1,2,3dataX.append(a)dataY.append(dataset[i + time_step, 0])return np.array(dataX), np.array(dataY)time_step = 4
X_train, y_train = create_dataset(train_data, time_step)
X_test, ytest = create_dataset(test_data, time_step)X_train =X_train.reshape(X_train.shape[0], 4, 1)
X_test = X_test.reshape(X_test.shape[0], 4, 1)

4.2 训练预测

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTMmodel=Sequential()
model.add(LSTM(50,return_sequences=True,input_shape=(4,1)))
model.add(LSTM(50))
model.add(Dense(1))
model.compile(loss='mean_squared_error',optimizer='adam')
model.fit(X_train,y_train,validation_data=(X_test,ytest),epochs=100,batch_size=1,verbose=1)
train_predict=model.predict(X_train)
test_predict=model.predict(X_test)

转化数据

train_predict=scaler.inverse_transform(train_predict)
test_predict=scaler.inverse_transform(test_predict)

评估

math.sqrt(mean_squared_error(ytest,test_predict))
452.56696011597353

http://chatgpt.dhexx.cn/article/Oc31dSwJ.shtml

相关文章

时间序列模型-ARIMA

一、ARIMA模型基本概念 1.1 自回归模型(AR) 描述当前值与历史值之间的关系,用变量自身的历史数据对自身进行预测;自回归模型必须满足平稳性的要求;(何为平稳性:见时间序列数据分析基本概念&am…

ARMA 时间序列模型

更好的理解协方差以及相关系数 ###X因素和Y因素协方差公式: 自相关系数ACF 直观上来说,ACF 描述了一个观测值和另一个观测值之间的自相关,包括直接和间接的相关性信息。 其实自相关系数可以这么理解:把一列数据按照滞后数拆成两…

时间序列模型简介

时间序列模型简介 尽管此前我们已经用到了time series这个专业名词,但我们对时序特征进行的处理,并不是time series这个专业名词所代表的真正含义,既时间序列。尽管本阶段我们并不会讲解时间序列模型,但既然讨论了时序特征&#x…

时间序列的7种预测模型

背景 时间序列问题比较常见,比如股市,工业生产指标等。 导入必要的Python包: from statsmodels.tsa.api import ExponentialSmoothing, \ SimpleExpSmoothing, Holtimport statsmodels.api as sm1. 朴素估计 y ^ t 1 y t \hat{y}_{\math…

算法模型---时间序列模型

文章来源 时间序列 时间序列是时间间隔不变的情况下收集的不同时间点数据集合,这些集合被分析用来了解长期发展趋势及为了预测未来。 时间序列与常见的回归问题的不同点在于: 1、时间序列是跟时间有关的;而线性回归模型的假设:观察结果是独立的在这种情…

ADF单位根检验三种形式_[STATA] 时间序列模型 ARIMA检验

___ ____ ____ ____ ____ (R) /__ / ____/ / ____/___/ / /___/ / /___/ 13.1 Statistics/Data Analysis 此次系列文章的主题是通过Stata软件来分析时间序列的平稳和非平稳关系,以及如何通过Stata软件来进行不同时间序列模型的预测性分析。…

机器学习——时间序列模型

文章目录 1. 基本概念1.1 自相关函数ACF(autocorrelation function)1.2 偏自相关函数PACF(partial autocorrelation function) 2. 常见模型2.1 自回归模型(AR)2.2 移动平均模型(MA)2…

时间序列模型算法 - ARIMA (一)

时间序列模型 1.时间序列模型概述1.1 时间序列的不同分类1.2 确定性时间序列分析方法概述1.3 三种时间序列模型 2.指标平滑ES2.1 一次指数平滑法 3.ACF与PACF4.AR5.MA6.ARMA7.ARIMA7.1 差分 8. ARIMA实践8.1 读取数据8.2 画图,观察数据是否非平稳8.3 差分&#xff0…

Office 2016 定制安装工具 v1.0 | Office 2016 自定义安装组件

软件简介 以往Office的安装包都采用的是MSI安装器,允许用户在安装时选择安装的组件,但是微软发布的Office2016安装包只提供了C2R(ClickToRun)方式,因此默认情况下用户无法选择安装组件,默认会安装所有。大…

office2016激活后还显示激活页面的解决办法

win10系统的office16通过Office激活工具激活之后,但是打开之后还会出现提示“让我们开始吧”的激活的页面, 1.office2016激活后还显示激活页面的解决办法 以后激活之后,每次试用Word或者Excel的时候,都会出现上图的激活提示页面…

运维 office2016自定义安装

office2016自定义安装组件简明教程 引言 以往Office的安装包都采用的是MSI安装器,允许用户在安装时选择安装的组件, 但是微软发布的Office 2016安装包只提供了C2R(ClickToRun)方式,因此默认情况下用户无法选择安装组…

安装Office的一些工具

1.可以下载各个版本的office:https://msdn.itellyou.cn/ 这个站点经常装系统的朋友应该都知道,一个老站了。 2.部署工具Office Tool Plus:https://otp.landian.vip/zh-cn/ 这个工具挺强大的,可以下载,可以部署&…

office2016 使用KMS破解无法连接服务器

最后发现是wmi服务异常。 修复完成后就正常 注册了

使用office tool plus清除office激活状态

如何清除office激活状态 大多数问题直接更改许可证就行,只有更改许可证无反应才需要使用,本文只是使软件变成未激活,但是激活仍需你已购买许可证 1下载office tool plus 2解压下载好的压缩包 3运行office too lplus.exe 4关闭所有office软件…

OFFICE激活报错0X80080005

点击工具箱->修复Office无法正常激活->修复,看到修复成功,再用Office Tool Plus激活就可以了

Office2016软件安装教程

关注公众号,免费获取资料 ​ 解压压缩文件 点击office 2013 专业增强版 64位文件夹(根据自身系统选择位数),右击setup - >以管理员的身份运行 3.勾选接收,继续 4.选择自定义安装, 5.点击浏览,选在office 安装位置&…

office2016专业增强版

链接: https://pan.baidu.com/s/1XBEwwkdwhfSDVpIrBm0cFg 密码: nkv2 Microsoft office 2016官方版是针对Windows 10环境从零全新开发的通用应用(Universal App)。office2016正式版中的Word将会增加“Insights for Office”、“Read Mode”等新功能,powerpoint增加了“Prese…

office2016 + visio2016

在电脑已经安装好了office20016增强版后,如果安装visio2016软件来画图,会弹出了如下提示框: cn_office_professional_plus_2016_x86_x64_dvd_6969182.iso和cn_visio_professional_2016_x86_x64_dvd_6970929.iso虽然镜像名称不同,但…

安装office2016专业增强版

安利2个工具 1.Office 2013-2019 C2R Install Main Window Install Office 为安装,这里无需提前下好镜像文件或安装包但要保持有网的状态,如果显示有别的版本则使用强力卸载,卸载干净之后再安装。右边界面为自定义安装选项,选择版…

激活office2016遇:The Software Licensing Service reported that the product SKU is not found.

今天把办公电脑系统重装了,之前的已经用了3年多了,win10还是不错了!!哈哈 打开巨硬的下载地址:https://www.microsoft.com/zh-cn/software-download/windows10 上面的立即更新,可以更新当前win10系统到最…