预测过程包括预测时间序列的未来值,或者通过仅基于其过去行为(自回归)对序列进行建模,或者通过使用其他外部变量来进行建模。 本文档描述了如何使用机器学习和统计模型来预测访问网站的流量。

使用自 2020 年 7 月 1 日起,查看网站的每日访问历史。 目标是生成一个能够预测未来 7 天网络流量的预测模型。 用户希望能够在每周一运行模型并获得本周剩余时间的每日流量预测。

https://embed.notionlytics.com/wt/ZXlKd1lXZGxTV1FpT2lJMk16bGxZMkptT1dReFkyRTBOekl4T1RFNU1HUTNOalJrTVRRMFpETmtOeUlzSW5kdmNtdHpjR0ZqWlZSeVlXTnJaWEpKWkNJNklsZHNTR2hsVEZSUFdXeHpaVmRhUW1ZNU1YQmxJbjA9

为了根据预期用途评估模型的性能,建议不要仅预测时间序列的最后 7 天,而是模拟整个过程。 执行此类验证时可以使用的两种策略是:

最合适的验证方法将取决于生产中使用的策略,模型是否将在预测过程之前定期重新训练。

数据集

数据已从集成到网站中的分析服务获得,可在此处下载。包含的字段有:

data['date'] = pd.to_datetime(data['date'], format='%d/%m/%y')
data = data.set_index('date')
data = data.asfreq('1D')
data = data.sort_index()
# Split data: train-validation-test
# ==============================================================================
end_train = '2021-03-30 23:59:00'
end_validation = '2021-06-30 23:59:00'

data_train = data.loc[: end_train, :]
data_val   = data.loc[end_train:end_validation, :]
data_test  = data.loc[end_validation:, :]

print(f"Training dates   : {data_train.index.min()} --- {data_train.index.max()}")
print(f"Validation dates : {data_val.index.min()} --- {data_val.index.max()}")
print(f"Test dates       : {data_test.index.min()} --- {data_test.index.max()}")

图形趋势绘制

使用时间序列时,表示它们的值很重要。这允许识别趋势和季节性等模式。

plot_train = data_train.users.hvplot.line(label='train')
plot_val   = data_val.users.hvplot.line(label='val')
plot_test  = data_test.users.hvplot.line(label='test')

layout = plot_train * plot_val * plot_test
layout = layout.opts(title='Daily visitors', ylabel='users')
layout

自相关图

自回归模型

预测模型训练

ARIMA(自回归综合移动平均线) 模型