[深度学习项目] - 时间序列预测 (4)
Prophet 算法
- 只需要有基本的建模知识即可
- 有较强的可解释性和可视化支持
- 能作为大部分时间序列预测的benchmark
模型结构: 关于时间的广义线性模型
y ( t ) = g ( t ) + s ( t ) + h ( t ) + ϵ t y(t)=g(t)+s(t)+h(t)+\epsilon_t y(t)=g(t)+s(t)+h(t)+ϵt
其中,
g(t)表示趋势 trend,用分段线性函数 或者 逻辑斯蒂增长 (逻辑斯蒂增长 相对于 线性 会有上下界限) 函数拟合。
g ( t ) = C 1 + e − k ( t − m ) g(t)=\frac{C}{1+e^{-k(t-m)}} g(t)=1+e−k(t−m)C , C 表示上界 ; k表示增长/下降快慢; m表示增长/下降 最快的点。
用户需要给出 C 和 分段的段数。s(t)表示季节性 seasonality, 用傅里叶级数拟合。可以叠加多个季节性, 比如 weekly, yearly。 s = s 1 + s 2 s=s_1+s_2 s=s1+s2
s ( t ) = ∑ n = 1 N [ a n c o s ( 2 π n t T ) + b n s i n ( 2 π n t T ) ] s(t)=\sum_{n=1}^N [a_ncos(\frac{2\pi nt}{T})+b_n sin(\frac{2\pi n t}{T})] s(t)=∑n=1N[ancos(T2πnt)+bnsin(T2πnt)], T 表示周期长度 , N表示阶数。 T表示了数据的周期性; N 表示了采用的傅里叶级数的最高阶数。 N越大,曲线本身的波动也越大,也越容易造成过拟合。h(t)表示外部变量的影响 regressor,采用线性函数拟合。可以叠加多个外部变量,如节假日,温度,活动。
h = w 1 h 1 + w 2 h 2 + … h=w_1 h_1 +w_2 h_2 +\dots h=w1h1+w2h2+… h(t)可以是连续变量,也可以是0-1量。ϵ t \epsilon_t ϵt表示模型残差,表示不可知的外部变量造成的影响。
import pandas as pd
import prophet
import matplotlib.pyplot as pltdf_sales = pd.read_csv("store_sales.csv",parse_dates=["week"])
df_prom = pd.read_csv("promotion_data.csv",parse_dates=["week"])
# print(df_sales.head(2))
# print(df_prom.head(2))df_all = pd.merge(df_sales, df_prom, how="left")
df_all.fillna(0,inplace=True)dept = 1df_train = df_all[ (df_all["week"]<="2012-07-30")&(df_all["store"]==1)&(df_all["dept"]==dept)]
df_train.rename(columns={"week":"ds","sales":"y"},inplace=True)df_test = df_all[ (df_all["week"]<="2012-08-06")&(df_all["store"]==1)&(df_all["dept"]==dept)]
df_test.rename(columns={"week":"ds","sales":"y"},inplace=True)###### 年周期性
m = prophet.Prophet(yearly_seasonality=True)####### add regressor
m.add_regressor("promotion_sales")##### TRAIN
m.fit(df_train)###### fit previous data
df_fit = m.predict(df_train)###### visualize
fig1 = m.plot_components(df_fit)
fig2 = m.plot(df_fit)
plt.show()
prophet 只能预测线性模型。
机器学习预测 (LightGBM)
- 通过滑动窗口获取 训练集,验证机,测试集
- 构建特征: 将最原始的特征 [ y 1 , x 1 , y 2 , x 2 , … , x T , y T , x T + 1 , x T + 2 , … , x T + h ] [y_1,x_1,y_2,x_2,\dots,x_T,y_T,x_{T+1},x_{T+2},\dots,x_{T+h}] [y1,x1,y2,x2,…,xT,yT,xT+1,xT+2,…,xT+h] 进行处理
- 将过去一段时间的特征进行聚合: 平均值,标准差,最大值,最小值 等等
- 特定时间点的取值: 上一个时间点的x/y , 上一个周期的x/y, …
- 时间序列的复合特征: 自相关性系数,STL分解的结果,差分
import pandas as pd
import prophet
import matplotlib.pyplot as pltimport lightgbm as lgb
from lightgbm.sklearn import LGBMRegressordf_sales = pd.read_csv("store_sales.csv",parse_dates=["week"])
df_prom = pd.read_csv("promotion_data.csv",parse_dates=["week"])
# print(df_sales.head(2))
# print(df_prom.head(2))
#
df_all = pd.merge(df_sales, df_prom, how="left")
df_all.fillna(0,inplace=True)#### lightgbm
df_samples = df_all[ (df_all["store"]==1)&(df_all["dept"]==1)].sort_values("week")### construct features
feature_cols = []### first feature: last week
df_samples["sales_lw"] = df_samples["sales"].shift(1)
df_samples["promotion_lw"] = df_samples["promotion_sales"].shift(1)feature_cols = feature_cols + ["sales_lw", "promotion_lw"]#### second features: last year
df_samples["sales_ly"] = df_samples["sales"].shift(52)
df_samples["promotion_ly"] = df_samples["promotion_sales"].shift(52)feature_cols += ["sales_ly","promotion_ly"]#### third features: variances waiting for prediction
feature_cols = feature_cols + ["promotion_sales"]#### keep the data that is not nan
for col in feature_cols:df_samples = df_samples[ ~df_samples[col].isna() ]######### construct train data and test data
x_train = df_samples[df_samples["week"]<="2012-07-30"][feature_cols].values
y_train = df_samples[df_samples["week"]<="2012-07-30"]["sales"].valuesx_test = df_samples[df_samples["week"]=="2012-08-06"][feature_cols].values
y_test = df_samples[df_samples["week"]=="2012-08-06"]["sales"].valuesmodel = LGBMRegressor()
model.fit(x_train,y_train)#### prediction
y_pred = model.predict(x_test)print("actual data:",y_test)
print("prediction:",y_pred)>>>16119.92
>>>16165.25781465
不同算法区别
特点 | ETS | ARIMA | Prophet | LightGBM |
---|---|---|---|---|
是否适合短的时间序列 | Y | N | N | N |
是否可解释 | Y | Y | Y | N |
是否支持多条序列批量预测 | N | N | N | Y,多条线可以在一个model中 |
是否支持外部变量 | N | N | Y,但只是线性变量 | Y |
homework
使用Prophet 和 LightGBM算法 完成 之后所有时间的预测。
prophet
df_sales = pd.read_csv("store_sales.csv",parse_dates=["week"])
df_prom = pd.read_csv("promotion_data.csv",parse_dates=["week"])
# print(df_sales.head(2))
# print(df_prom.head(2))
#
df_all = pd.merge(df_sales, df_prom, how="left")
df_all.fillna(0,inplace=True)
#
dept = 1print(df_all[ (df_all["store"]==1)&(df_all["dept"]==dept)] .sort_values(["week"]).tail(3))test_date_begin = pd.to_datetime("2012-07-30")
test_date_end = pd.to_datetime("2012-10-22")test_date = df_all[ (df_all["week"]>=test_date_begin)&(df_all["week"]<=test_date_end)]["week"].unique()predict_result = []
actual_result = []print("total prediction num:", len(test_date))
print(test_date)for i, every_test_date in enumerate(test_date):print("predicting: {}".format(i))df_train = df_all[ (df_all["week"]<every_test_date)&(df_all["store"]==1)&(df_all["dept"]==dept)]df_train.rename(columns={"week":"ds","sales":"y"},inplace=True)actual_result.append( df_all[(df_all["week"]==every_test_date)&(df_all["store"]==1)&(df_all["dept"]==dept)]["sales"].values[-1] )# print(actual_result[-1])df_test = df_all[ (df_all["week"]==every_test_date)&(df_all["store"]==1)&(df_all["dept"]==dept)]df_test.rename(columns={"week":"ds","sales":"y"},inplace=True)m = prophet.Prophet(yearly_seasonality=True)m.add_regressor("promotion_sales")m.fit(df_train)df_predict = m.predict(df_test)predict_result.append(df_predict["yhat"].values[0])# print(predict_result[-1])plt.plot(test_date,predict_result,label="prediction")
plt.plot(test_date,actual_result,label="actual")
plt.legend()
plt.xticks(rotation=90)
plt.show()
#### lightgbm
df_sales = pd.read_csv("store_sales.csv",parse_dates=["week"])
df_prom = pd.read_csv("promotion_data.csv",parse_dates=["week"])
# print(df_sales.head(2))
# print(df_prom.head(2))
#
df_all = pd.merge(df_sales, df_prom, how="left")
df_all.fillna(0,inplace=True)test_date_begin = pd.to_datetime("2012-07-30")
test_date_end = pd.to_datetime("2012-10-22")dept = 1df_samples = df_all[ (df_all["store"]==1)&(df_all["dept"]==dept)].sort_values("week")### construct features
feature_cols = []### first feature: last week
df_samples["sales_lw"] = df_samples["sales"].shift(1)
df_samples["promotion_lw"] = df_samples["promotion_sales"].shift(1)feature_cols = feature_cols + ["sales_lw", "promotion_lw"]#### second features: last year
df_samples["sales_ly"] = df_samples["sales"].shift(52)
df_samples["promotion_ly"] = df_samples["promotion_sales"].shift(52)feature_cols += ["sales_ly","promotion_ly"]#### third features: variances waiting for prediction
feature_cols = feature_cols + ["promotion_sales"]#### keep the data that is not nan
for col in feature_cols:df_samples = df_samples[ ~df_samples[col].isna() ]######### construct train data and test data
test_date = df_all[ (df_all["week"]>=test_date_begin)&(df_all["week"]<=test_date_end)]["week"].unique()predict_result = []
actual_result = []for i,every_test_date in enumerate(test_date):x_train = df_samples[df_samples["week"]<every_test_date][feature_cols].valuesy_train = df_samples[df_samples["week"]<every_test_date]["sales"].valuesx_test = df_samples[df_samples["week"]==every_test_date][feature_cols].valuesy_test = df_samples[df_samples["week"]==every_test_date]["sales"].valuesfrom lightgbm.sklearn import LGBMRegressormodel = LGBMRegressor()model.fit(x_train,y_train)#### predictiony_pred = model.predict(x_test)predict_result.append(y_pred[0])actual_result.append(y_test[0])print("actual data:",actual_result)
print("prediction:",predict_result)plt.plot(test_date,predict_result,label="prediction")
plt.plot(test_date,actual_result,label="actual")
plt.legend()
plt.xticks(rotation=90)
plt.show()
[深度学习项目] - 时间序列预测 (4)相关推荐
- [深度学习项目] - 时间序列预测 (5)[待补充]
基于RNN的时序预测 基于LSTM的时序预测: 输入数据时 输入的 y t y_t yt和 x t + 1 x_{t+1} xt+1之间存在一个时间差. DeepAR 和 MQRNN 都可以实现时 ...
- 深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战 LSTM(Long Short Term Memory Network)长短时记忆网络,是一种改进之后的循环神经网 ...
- 深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:Bi-LSTM算法构建时间序列多变量模型预测交通流量+代码实战 人类并不是每时每刻都从一片空白的大脑开始他们的思考.在你阅读这篇文章时候,你都是基于自己已经拥有的对先前所见 ...
- 深度学习多变量时间序列预测:Encoder-Decoder LSTM算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:Encoder-Decoder LSTM算法构建时间序列多变量模型预测交通流量+代码实战 LSTM是一种时间递归神经网络,适合于处理和预测时间序列中间隔和延迟相对较长的重要 ...
- 深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:卷积神经网络(CNN)算法构建时间序列多变量模型预测交通流量+代码实战 卷积神经网络,听起来像是计算机科学.生物学和数学的诡异组合,但它们已经成为计算机视觉领域中最具影响力 ...
- 深度学习多变量时间序列预测:GRU算法构建时间序列多变量模型预测交通流量+代码实战
深度学习多变量时间序列预测:GRU算法构建时间序列多变量模型预测交通流量+代码实战 GRU是LSTM网络的一种效果很好的变体,它较LSTM网络的结构更加简单,而且效果也很好,因此也是当前非常流形的一种 ...
- matlab使用深度学习进行时间序列预测
使用深度学习进行时间序列预测 - MATLAB & Simulink - MathWorks 中国 Deep Learning Toolbox 快速入门 - MathWorks 中国
- 基于深度学习的时间序列预测方法
之前对时间序列预测的方法大致梳理了一下,最近系统的学习了深度学习,同时也阅读了一些处理序列数据的文献,发现对于基于深度学习的时间序列预测的方法,还可以做进一步细分:RNN.Attention和TCN. ...
- 基于深度学习的时间序列预测
# 技术黑板报 # 第十一期 推荐阅读时长:15min 前言 时间序列建模历来是学术和工业界的关键领域,比如用于气候建模.生物科学和医学等主题应用,零售业的商业决策和金融等.虽然传统的统计方法侧重于从 ...
最新文章
- 张亚勤:对于产业来讲,深度学习的黄金时代刚刚开始
- 【linux-command not find解决方法 】
- Android 框架揭秘 --读书笔记
- 计算机ip保留地址,分类ip地址中,保留地址有哪些?具体点说说,作业。
- 前馈控制与反馈控制对比
- linux网卡dhcp获取ip,Linux下通过DHCP服务器获取IPv6地址
- DNS之BIND使用小结(Forward转发)
- ES集群状态检查报错:master_not_discovered_exception 503错误
- Vue的diff算法原理是什么?
- 智慧酒店的建议和分析
- 安徽阜阳计算机高中学校排名,安徽最强的五所高中,都是知名实力中学,考上就离名牌大学不远了!...
- elasticsearch 分词器器读写分词
- MySQL 安装失败 Failed to find valid data directory
- 新买的电脑硬盘如何分区
- [技美CG]ShaderToy对照UnityShader方法目录 [入门替换版]
- 西门子博途TIA Portal V15.0同时打开两个项目的方法
- 后分库分表时代的数据库新选择:二维火搭载OceanBase再出发
- 知道创宇区块链安全实验室|Meter.io 攻击事件分析
- 风投最爱看的商业计划书是这样的
- parallelStream和fork/join 原理和使用
热门文章
- Excel文件如何找回打开密码
- Bentley Systems 收购 Plaxis 以及为业务提供补充的 SoilVision,将岩土工程整合到基础设施项目的数字化工作流中
- openlayers中‘EPSG:3857‘与 ‘EPSG:4326‘互转
- 804. 唯一摩尔斯密码词-ruby解法
- 【转载】System_Verilog打印格式
- VIPLE 对变量实现一个加法计算
- 计算与推断思维 八、随机性
- 抖音账号养号技巧揭秘
- matlab的RTW错误啥意思,MATLAB RTW 编辑错误
- Linux命令行界面菱形乱码解决方法