时间序列预测是一种基于历史数据,通过建立模型来预测未来值的方法。在机器学习领域中,它被广泛应用于各种场景,例如,通过智能电表预测电力消耗,以帮助电力公司规划网络扩展;或者基于历史数据预测城市的降雨量或太阳辐射量,以便气象部门采取预防措施并及时向市民发出警告。
时间序列预测涉及收集一段时间内的时间序列数据以及希望预测的变量。以降雨量预测为例,需要收集本周的历史降雨数据(可以是每日、每小时、每分钟或每秒的粒度),并记录降雨量对应的时间戳。数据样本如下所示:
在上述例子中,日期格式为YYYY-MM-DD,时间为24小时制。目标变量可以是任何想要评估和预测的变量。在例子中,例如,它可能是以毫米为单位的降雨量。
让开始基于五年的历史数据(每日采样)预测未来十个月的产品需求。首先,需要初始化必要的库并将数据导入Jupyter Notebook。
import numpy as np
import pandas as pd
from scipy import stats
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
from fbprophet import Prophet
导入所需库后,让看看数据集的样子:
df=pd.read_csv("product15.csv")
可以看到有1131行数据,对应1131天的数据。理想情况下,数据应该有1825行,对应5年的每日数据(365*5=1825),但数据集中有些天的产品需求是不可用的。数据缺失可能有多种原因,比如节假日、罢工、数据捕获问题等。这可能会影响准确性,但将在后面的教程中找到处理缺失数据的方法。
接下来,将目标和输入变量分别赋给‘y’和‘x’,并可视化数据集:
x=data['Date']
y=data['demand']
plt.plot(x,y)
plt.title("Product 15 Demand over time")
可以看到,产品15的需求在过去几年中并没有遵循一定的模式。2017-2018年期间需求较高,但从2019年开始,需求显示出下降趋势,这可能表明COVID-19对需求的影响。
让简化处理过程,将数据重采样到月度级别,以了解算法的工作原理。还可以总是选择将数据重采样到小时、日、周、季度和年度级别,以查看重采样对模型性能的不同影响。
monthly_data = data.resample('M',on='Date').mean()
可以看到,数据行数已减少到62,对应62个月的数据。该月的需求已被平均化。
df = monthly_data.reset_index()
df.columns = ['ds', 'y']
df.head()
m = Prophet(weekly_seasonality=True,daily_seasonality=True)
m.fit(df)
future = m.make_future_dataframe(periods=10,freq='m')
forecast = m.predict(future)
在m.make_future_dataframe函数中,可以指定希望未来数据集的周期数。请注意,这些周期将添加到现有数据集(m)之外。例如,如果设置periods=0,将拥有原始数据集(m)。还需要指定希望未来数据集的频率。这里的‘m’表示‘每月’频率。也可以有其他频率,如‘d’表示天,‘h’表示小时等。让使用m.plot()命令绘制预测值。
m.plot(forecast)
from sklearn.metrics import r2_score
original=df[['y']]
prediction=forecast[['yhat']]
r2_score(original,prediction)
print("Accuracy of the model is :",100*r2_score(original,prediction))