[LSTM]使用LSTM预测监控数据的数值

2018年08月13日 10009点热度 0人点赞 1条评论

本次命题: 数值预测

上一篇文章我们的小题目是使用LSTM预测字符顺序的下一个字符。

命题虽然简单, 可是实际上应用范围也很广。 比如输入法里面, 就一定会用到相关的技术。 只不过不一定是LSTM, 肯定也不止一维特征。这次这个命题相对来说, 比较实际一些:从历史预测监控数据预测即将来临的监控指标的数值。

比如下图就是本站在友盟上面的监控数据。 最右边的虚线部分就是友盟进行的预测的数值:

本文代码特别鸣谢:https://blog.csdn.net/aliceyangxi1987/article/details/73420583

预测代码做了简单修改就迁移过来直接用了。

具体修改与讨论放在最后进行。

获取数据并展示

因为X轴坐标太挤,显示不出来, 所以没有显示在这里。

数据介绍:

  • 这个是我司某个监控指标的数值。 具体名字就不说啦:D
  • 时间跨度: 一个月
  • 粒度: 每个小时一个数值
  • 数据下载: 链接

可以看到, 在前面一段时间, 数值的跳动是比较规律的。 当然中间也有一个异常点。 只不过后面忽然出现了几个大的波峰。 如果是异常检测, 在这里就一定要把后面几个波峰给挑出来。

开始炼丹 / 训练模型

完整代码如下:

如上图所示:

  • 红色虚线是原始数据,
  • 蓝色为训练数据的预测值。重合度一般
  • 绿色为测试数据的预测值。 虽然波峰突然起来, 预测的值也相应的升高。 只不过跟真实值还是有区别。 这就为我们使用LSTM做异常检测(Anomaly Detection) 打下了基础。

改动的地方

  • look_back

    原文的look_back 是1, 个人觉得在实际生产之中, 应该不会这样使用

    根据我们已知的时间窗口周期, 改成了24。

  • numpy.reshape / input_shape

    原文代码:

    我的修改:

    我的理解:

    1. 因为我们的数据的特征是一维, 因此features的值应该是1
    2. 而我们往回看的时间窗口实际值是look_back的值。 在create_dateset函数里面, 是的数据集的宽度就是look_back, 即trainX.shape[1] == look_back
  • plot_result函数

    原来的绘图函数太简陋, 在这里做了好一些优化,比如:

    • 图放大
    • 有legend
    • x坐标的值间隔显示

本文原创, 转摘需要注明出处:
https://www.flyml.net/2018/08/13/lstm-prediction-for-monitoring-metric-data

RangerWolf

保持饥渴的专注,追求最佳的品质

文章评论

  • pikachu

    你好,这个应该是单指标的预测以及监控,请问您有接触过多指标的预测以及异常点检测吗?

    2019年04月09日