可以根据输入变量的数量,拥有单变量时间序列或多变量时间序列。对于多变量时间序列预测,使用向量自回归(VAR)的原理。
向量自回归是一种用于发现多个变量随时间变化而改变其值之间关系的模型。它是一个双向模型,意味着变量相互影响,即预测变量不仅影响目标变量,目标变量也影响预测变量。
本指南将预测一家百货商店五款产品A、B、C、D和E的每月销售量和访问量。为简单起见,将只使用一款产品A,并预测其未来三个月的销售量和访问量。
作为第一步,将在Jupyter Notebook中初始化必要的库。
import pandas as pd
from kats.models.prophet import ProphetModel, ProphetParams
from kats.consts import TimeSeriesData
from kats.models.var import VARModel, VARParams
from sklearn.metrics import r2_score
from sklearn.metrics import mean_squared_error
import math
import numpy as np
import matplotlib.pyplot as plt
现在必要的库已经初始化,接下来将加载数据集并进行可视化。
df = pd.read_csv("data.csv", index_col=0)
df
product = "Product A"
multi_df = df[df["Product"] == product].drop(["Product"], axis=1)
multi_df.head()
multi_df.reset_index(inplace=True)
multi_df.rename(columns={"Date": "time"},inplace=True)
x=multi_df['time']
y1=multi_df['SalesCount']
y2=multi_df['VisitsCount']
plt.plot(x,y1,y2)
plt.rcParams["figure.figsize"] = (4.8,6.4)
plt.xticks(rotation = 45)
plt.title("Product A Demand over time")
可以看到,销售量和访问量随时间都在增加。
下一步是将数据集分割为训练集和测试集。将使用训练集来训练模型,然后看看它在未见过的数据,即测试集上的表现如何。
multi_df_train=multi_df[:20]
现在将在代码中引入Kats模型,然后将其拟合到训练集上。
multi_ts = TimeSeriesData(multi_df_train)
params = VARParams()
m = VARModel(multi_ts, params)
m.fit()
现在将使用Kats模型进行预测。只需要运行m.predict函数,并提供模型将预测的未来步数。请注意,步数计数从训练数据集最后一个时间戳条目的下一步开始。例如,在案例中,原始数据集有从2020年1月31日到2021年11月30日的月度日期值。对于训练数据集,选择了前19个值,命令为multi_df_train=multi_df[:20],所以steps=6意味着预测将从第20个值开始。频率指的是数据集值的频率。
fcst = m.predict(steps=6,freq='M')
现在让看看模型是如何产生预测的。
fcst
fcst['SalesCount']
fcst['VisitsCount']
y_pred_sc=sc1['fcst'][:3]
y_true_sc=multi_df['VisitsCount'][20:]
MAPE_SC=mape(y_true_sc,y_pred_sc)
print("n MAPE_SC:n")
print(MAPE_SC*100)
MAPE_SC:
87.35623112447463
m.plot()
plt.show()