来了来了!趋势预测算法大PK!
作者 | 王哲
责编 | Carol
头图 | CSDN 付费下载自视觉中国
趋势预测在很多应用场景中都会起到至关重要的作用,比如淘宝商家会考虑库存量应该保持在多少才能够满足客户需求,商场希望得知假期会迎来多大的客流量以安排系列活动,机场想要预测五一黄金周会有多大的客运量来做相应的应急部署等。在智能运维领域,趋势预测同样具有一定的理论意义和实际应用价值。
趋势预测在运维场景中的应用背景
在实时监控系统中会采集到大量的数据,有些数据具有周期性等时间特征,也称之为时间序列。如果能挖掘出时间序列中所蕴含的信息,实现辅助人工决策,甚至是自动决策,都会为运维工作带来事半功倍的效果。
比如KPI异常检测可以衡量服务的健康程度,分析出CPU、交易量、响应时间等指标的历史规律后,设置动态阈值,得到更加准确的异常报警,减少漏报误报情况的发生,提高应急响应效率;通过对历史事件单的分析,预测出下次系统告警可能发生的时间或者指定时间内可能发生告警的系统等,就可以根据分析结果做出相应的响应措施,为后续运维工作带来极大的指导意义。类似这样的应用场景还有很多,如何充分挖掘出时间序列中所蕴含的信息,成为智能运维领域研究中的一大热点。
那么时间序列一般会有哪些比较明显的特征呢?
一般来讲具有趋势性、季节性、周期性和随机性四种特征。但是对于时间序列预测,想要找到一个适用所有场景的通用模型几乎是不可能的,因为现实中每个预测问题的背景不同,影响预测值的因素与程度也往往不同,针对不同的问题就要采用不同的方法和模型进行统计分析,这都会给建模人员和数据分析师带来极大的难度,也使得时间序列预测问题变得复杂。
不同的模型会有各自的优势和劣势,本文将对传统时间序列预测模型ARIMA、经典神经网络模型LSTM以及Prophet模型展开具体介绍,并在事件单数据集上做了初步的探索。
常用的趋势预测算法
2.1、ARIMA模型
ARIMA模型,全称为自回归积分滑动平均模型(Autoregressive Integrated Moving Average Model),是由博克思(Box)和詹金斯(Jenkins)于20世纪70年代初提出的一种时间序列预测方法。ARIMA模型并不是一个特定的模型,而是一类模型的总称。通常用p,d,q值来确定,记做ARIMA(p,d,q)。其中p代表自回归模型阶数,d代表差分阶数,q代表移动平均阶数。
ARIMA模型的建模步骤如下:
首先对时间序列数据进行平稳性检测,若不通过,则采取对数、差分等相应的变换将其变为平稳序列。通过平稳性检测之后,进行白噪声检测,当序列不是白噪声序列时,即可选择合适的ARIMA模型进行拟合。如果误差值通过白噪声检测,就可以采用拟合出的模型对时序数据进行预测了。
虽然ARIMA模型已经在很多个场景中得以应用,但是它存在的缺陷是不可忽视的:要求时序数据具有稳定性,或者通过差分化后是稳定的;对于数据中存在缺失值的情况,需要先进行缺失值填补,这很大程度上损害了数据的可靠性。
2.2 神经网络模型
2.2.1 网络模型初探
在人工智能领域,DNN(Deep Neural Networks,深度神经网络)的应用极其广泛,在图像分类、目标检测等领域已经取得了优异的成绩。但是在DNN中,当前网络层只和上一层神经网络有连接,没有考虑样本出现的时间顺序,只能进行逐层进行训练。
为了将时间因素包含在内,出现了RNN(循环神经网络模型),可以将神经元的输出在下一个时间戳直接作用到自身。具体来讲,就是在t时刻接收到输入之后,隐藏层的值是
,输出值是
。关键点在于,
的值不仅仅取决于
,还取决于
,也就是说当前层的输出值不仅与当前时间点的输入有关,还要结合上一个时间点的输出值共同参与模型的训练。这样RNN就成为了一个在时间上传递的神经网络了。
但RNN也存在一定的弊端,RNN只能够接受上一个节点的输出,随着网络层次的加深,可能会发生梯度消失或者梯度爆炸,通俗来讲,就是当前节点无法对距离自己较远节点的信息进行“记忆”。为了解决该问题,研究人员提出了很多解决办法,其中最为经典的一个网络模型是长短时间记忆模型(Long Short-Term Memory,LSTM)。
LSTM与RNN主要的区别在于,它在模型中加入了一个判断信息是否有用的“处理器”,这个处理器被称为“记忆单元”(Memory Cell)。在一个Cell中放置了三扇门,分别是输入门、遗忘门和输出门。也就是说,当一个信息进入到LSTM中后,可以根据规则来判断其是否有用,只有符合要求的信息才会被留下,不符合的信息会被直接“遗忘”。这样序列数据在训练过程中的“记忆”问题就迎刃而解了。
采用神经网络的方法虽然能够达到较好的效果,但是模型不够灵活,很难让使用者引入问题的背景知识,或者一些有用的假设;训练模型还需要大量的数据,数量不够多很可能会产生过拟合,影响训练效果;除此之外,LSTM是单步预测,只能预测出下一个时间点的值,对于未来任意时间段的预测很不友好。
2.3 Prophet模型
facebook发布了prophet(“先知”)项目,它以更简单、灵活的预测方式获得与经验丰富的分析师相媲美的预测结果。Prophet是Facebook发布的基于可分解(趋势+季节+节假日)模型的开源库。它让我们可以用更加简单、直观的参数进行高精度的时间序列预测,并且支持自定义季节和节假日因素的影响。
prophet的整体框架分为四部分:Modeling、Forecast Evaluation、Surface Problems以及Visually Inspect Forecasts。从整体上看,这是一个循环结构,而这个结构又可以根据虚线分为分析师操纵部分与自动化部分。因此,整个过程就是分析师与自动化过程相结合的循环体系,也是一种将问题背景知识与统计分析融合起来的过程,这种结合大大的增加了模型的适用范围,提高了模型的准确性。
首先Modeling:建立时间序列模型;然后进行Forecast Evaluation,也就时模型评估,对参数进行多种尝试,根据仿真效果评估出更加合适的模型;接着是Surface Problems:呈现问题,将误差较大的潜在原因呈现给分析师进行人工干预;最后一部分是Visually Inspect Forecasts:以可视化的方式反馈整个预测结果,将问题反馈给分析师后,由分析师考虑是否进一步调整和构建模型。
针对不同的应用场景,Prophet也有相应的模型:
增长趋势的模型:有几个月(最好是一年)的每小时、每天或每周观察的历史数据;
季节趋势的模型(seasonality模型):有较强的季节性趋势;
有事先知道的以不定期的间隔发生的重要节假日(holiday模型),比如国庆节等。
整体来讲,Prophet模型可以根据前一段时间的序列数据,结合专家的经验,预测出期望时间段的输出值,以较小的模型训练成本获得较好的训练结果。
趋势预测算法小试牛刀
3.1 数据采集
本文采集了一些系统工单数据,通过LSTM和prophet模型分别对系统产生的工单数量的趋势进行预测。
首先对对提取到的数据进行预处理,提取出时间(ds)和事件单数(y)两列数据,部分数据可视化结果如下图所示:
import numpy as np
import pandas as pd
#读入数据
sales_df = pd.read_csv('false.csv')
sales_df.head()
3.2 数据实验
1)LSTM模型构建与实验
本文采用keras框架,构建有一个LSTM和一个全连接层的网络,采用MSE损失函数,用adam来优化损失函数,并将数据以7:3的比例划分为训练集和测试集。具体代码如下:
# create and fit the LSTM network
model = Sequential()
model.add(LSTM(4, input_shape=(1, look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=240, batch_size=1, verbose=2)
在数据集上的实验结果如下图所示,左图展现了LSTM模型在数据集上的拟合情况,横轴为时间,纵轴为事件单数,黄色线为真实值,绿色实现代表训练集上的预测结果,绿色虚线表示测试集上的结果。可以看到模型基本可以拟合出变化趋势,但是在具体的数量预测还有改进的空间。右图展现了在验证集和测试集上的loss趋势图。
2)Prophet模型构建与实验
from fbprophet import Prophet## 拟合模型
m = Prophet()
m.fit(sales_df)
# # 构建待预测日期数据框,periods = 10 代表除历史数据的日期外再往后推 10 天
future = m.make_future_dataframe(periods=10)
# 预测数据集
forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()
通过fit()方法拟合Prophet()模型,make_future_dataframe()可以对未来日期的数据趋势进行预测,periods = 10 代表预测10天的结果,并计算出预测值(yhat),预测最小值(yhat_lower),预测最大值(yhat_upper)。具体趋势预测图如曲线图所示,黑点代表真实值,浅蓝色部分代表预测区间,可以看到模型基本可以拟合出较好的时间预测效果。
还能够通过plot_components(forecast)方法预测出数据的整体趋势和周效应:
趋势--整体趋势:
趋势--周效应:
除了预测每天产生的工单数量,本文还对某些系统每天发生的工单数进行了分析和预测,希望能够在预测的基础上,我们可以根据工单的预测数辅助运维工作的安排和开展。如某系统产生的工单数如下图:
小结
趋势预测算法在众多场景中都有重要的应用价值。本文对比较主流的ARIMA模型、LSTM神经网络模型和facebook发布的Prophet模型进行介绍,并在系统工单数据集上进行了初步探索。
虽然由于数据量的原因以及模型调参上还没有达到最佳的训练结果,但是模型对于趋势预测的有效性已经初步展现。之后,还会对趋势预测算法作进一步的探索和更深层次的研究,相信趋势预测算法在智能运维领域的应用也会更加广泛和可靠。
作者简介:
王哲,中国农业银行软件研发中心,从事运维支持工作的90后mm。目前承担新一代运维工具的研发,致力于研究人工智能算法,为实现智能运维、提升应用支持效率做出不懈努力。希望寻找业界同仁,共同对智能运维展开探讨:583283841@qq.com。
推荐阅读
实操来了!一文告诉你如何用 Streamlit 和 Heroku 开发 Web
避坑!使用 Kubernetes 最易犯的 10 个错误
雷军:4G 手机已清仓,全力转 5G;QQ音乐播放中途插语音广告引热议;Wine 5.9 发布 | 极客头条
15 岁黑进系统,发挑衅邮件意外获 Offer,不惑之年捐出全部财产,Twitter CEO 太牛了!
必读!53个Python经典面试题详解
赠书 | 1月以来 Tether 增发47亿 USDT,美元都去哪儿了?

你点的每个“在看”,我都认真当成了AI
你点的每个“在看”,我都认真当成了AI
相关文章:

hdu 5713(状态压缩DP)
要进行两次dp, 第一个,dp[i],1<i<(1<<n) 其中用i的二进制形式表示已选择的点。 dp[i] 用来保存i中的点构成一个连通块,边集多少种可能。 转移方程: save[0] 1;//这里用save[i]表示dp[i]for(int i1;i<(1<<n)…

nginx特定的 404页面利于seo
要求:访问http://www.qq.com/123 url保持不变 显示的结果为指定的404页面curl -I http://www.qq.com/123 返回的状态码为404 准备一 404.php页面在最底部加上:<?phpheader(HTTP/1.1 404 Not Found);header(Status: 404 Not Found);?>然后ngin…

python采集bandwidth信息
旧博文,搬到 csdn 原文:http://rebootcat.com/2018/05/21/analyze_bandwidth/ python脚本采集bandwidth 经常要做一些 linux 系统上的性能分析或者采集 cpu/mem/bandwidth 上报到监控系统。 分享一个我平常常用到的 bandwidth 采集脚本,原理…
零基础搭建个性化精准营销 AI 应用,这次手把手教你!
百万学AI系列AI 应用开发大师课已经直播两期了,在前两期的内容中,大家在入门级任务《猫狗分类器》中上手 TensorFlow 开发,通过离线 SDK 在 Android 手机中完成人脸识别应用的部署。在这两个任务中,能成功安装开发环境,…

C++数据类型简析
C语言的基本数据类型有如下四种: 整型,说明符为int;字符型,说明符为char;浮点型(又称实型),说明符为float(单精度),double(双精度&…
浅谈几种区块链网络攻击以及防御方案之51#37攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/11/network_attack_of_blockchain_51_attack/ 写在前面的话 自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之初的…
全球Python调查报告:Python 2正在消亡,PyCharm比VS Code更受欢迎
作者 | 唐小引题图 | 自东方 IC出品 | AI科技大本营(ID:rgznai100)一年一度的 Python 开发者调查报告终于发布了。该报告由 Python 软件基金会和 JetBrains 联合发起,已经持续三年,并且参与调查的开发者人数正在逐年上…

中兴V880使用手记之五——刷入recovery
Recovery是安卓系统的一个特殊工作模式,也就是一个刷机的工程界面,给安卓手机刷入Recovery相当于给系统安装了一个dos界面,可以在未开机的状态下,实现系统更新、还原出厂设置、清除手机缓存等。通过一些第三方工具,可以…

windows 系统常用操作
1、所有端口使用情况 netstat -ano 2、查询xxxx端口pid netstat -aon|findstr "xxxx" 3、根据端口Pid查详情 tasklist|findstr "pkd" 4、根据进程pid kill 进程 taskkill /pid pid -f 转载于:https://www.cnblogs.com/vitre/p/5549344.html
浅谈几种区块链网络攻击以及防御方案之日蚀攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/12/network_attack_of_blockchain_eclipse_attack/ 写在前面的话 自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之…
微服务的理想与现实
来源 | 京东智联云开发者随着云原生微服务的日益火热,很多人都开始对微服务的相关知识内容感兴趣。本篇内容,旨在扫盲(意思是小白可入),希望能对大家有帮助。如有问题,欢迎大家一起讨论,共同学习…

感恩心成就了车建新和红星美凯龙
前几天参加了红星美凯龙成立25周年庆典活动,庆典活动非常的隆重,庆典之前红地毯上星光熠熠,红星美凯龙掌舵人车建新等多位高管、品牌代言人大小S、刘谦、古巨基、萧亚轩、胡一虎等演艺群星、马未都、马艳丽、包小柏、王潮歌、殷智贤等不同领域…

第二阶段团队项目冲刺站立会议(九)
昨天做了什么: 已经简单实现我的后续显示问题。 今天准备做什么: 美观上的东西来不及做了估计,我要整合到项目的实现上去。 遇到的问题: 项目问题大体上和竞赛一致,但也有不一样的地方。转载于:https://www.cnblogs.co…
浅谈几种区块链网络攻击以及防御方案之女巫攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/13/network_attack_of_blockchain_sybil_attack/ 写在前面的话 自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之初…

INODE上网IP地址刷新超时处理
IP地址刷新超时2011-06-07 09:19:08 连接网络...2011-06-07 09:19:08 开始进行身份验证... [wangliyafaguibu]2011-06-07 09:19:09 正在上传用户密码...2011-06-07 09:19:10 您的身份验证成功2011-06-07 09:19:10 自动获取IP地址...2011-06-07 09:19:11 IP地址刷新超时2011-06-…
让大规模深度学习训练线性加速、性能无损,基于BMUF的Adam优化器并行化实践...
导语:深度学习领域经典的 Adam 算法在大规模并行训练的情况下会导致模型性能损失。为了解决这一问题,微软亚洲研究院采用 BMUF 框架对 Adam 算法进行了并行化,并在微软大规模 OCR 和语音产品数据集上进行了测试,使其在并行训练中几…

Spring AOP AspectJ Pointcut Expressions With Examples--转
原文地址:http://howtodoinjava.com/spring/spring-aop/writing-spring-aop-aspectj-pointcut-expressions-with-examples/ 1) Matching Method Signature Patterns The most typical pointcut expressions are used to match a number of methods by their signatu…
限免!百名AI大咖,20大技术和行业论坛,不可错过的开发者嘉年华
根据《2020科技趋势报告》的预测,AI将引发第三次计算浪潮,也是重塑世界最大的动因之一。而在全球人工智能技术的赛道上,中国无疑是领先者,到2030中国将成为全球主要的人工智能创新中心。在这样的大环境下,如何抓住机遇…
浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/14/network_attack_of_blockchain_ddos_attack/ 写在前面的话 自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之初…

C++中#include的工作原理
大多数人可能对“#include”比较熟悉,因为我们写C/C程序的时候都会写的字符串之一,但是它是具体怎么工作的?或者它的原理是什么呢? 可能不太熟悉,也有可能没有去关心过。我们只关心程序能否正确运行,或者程…

浅谈几种区块链网络攻击以及防御方案之其它网络攻击
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/04/16/network_attack_of_blockchain_other_attack/ 写在前面的话 自比特币诞生到现在,比特币(网络)经历过大大小小非常多次的攻击,尤其在比特币诞生之初…
基于深度学习和传统算法的人体姿态估计,技术细节都讲清楚了
作者 | 站长 pursueYfuture来源 | AI专栏(ID: pursue-Y-future)计算机视觉的一大研究热点是人体姿态估计,还有很多问题急需解决,比如遮挡,交互等等。在最近的CVPR2020里边也有很多这方面的工作。本文站长主要是想谈谈基…

怎么让百度快速重新收录
每天更新网站和做外链让百度重新收录的快速方法很多人都比较头疼让百度如何重新来收录你站点,这里为大家介绍一下我的经验;大家都知道做网络推广,特别是企业站推广,如果能在相关的关键字在搜索引擎里有个好的名次,肯定能给企业增长…

HQL语句大全
Hibernate配备了一种非常强大的查询语言,这种语言看上去很像SQL。但是不要被语法结构 上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态 和关联之类的概念。Hibernate配备了一种非常强大的查询语言&#…
自动创建阿里云抢占式实例
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/08/24/auto_run_aliyun_spot/ aliyun_spot 自动创建阿里云抢占式实例。 支持一下作者,购买阿里云 背景 阿里云抢占式实例应该属于阿里云的一种闲置资源利用,性价比非常高&am…
What?! Python一行代码,能玩这么多童年的游戏?
来源 | 早起 Python责编 | Carol封图 | CSDN 下载自视觉中国儿童节就要来了,虽然秃头程序员没有头发,但是童心还是一直都在的,今天就分享一个私藏的GitHub项目——free-python-games,一行代码就能进入使用Python开发的小游戏快乐…

McAfee可能要收购NitroSecurity?
近日,根据国外媒体报道和业界人士的坊间传闻,有传闻指McAfee可能将在近期收购SIEM厂商NitroSecurity。最近,NitroSecurity正在准备IPO,去年年收入约4000万美元,在Gartner的MQ中位于Leader阵营。 NitroSecurity的SIEM技…

进程间通信IPC之--共享内存
每个进程各自有不同的用户地址空间,任何一个进 程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲 区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读…

Scons构建C++项目
旧博文,搬到 csdn 原文:http://rebootcat.com/2020/08/30/scons/ 前言 我是一个 linux c 开发者,但是一直对 Makefile 的语法很是头痛,每次都记不住,所以每次写 Makefile 都很痛苦,Makefile 里需要你自己编…
2020 AI产业图谱启动,勾勒中国AI技术与行业生态
《2020年国务院政府工作报告》提出,重点支持「两新一重」建设。其中「两新一重」中的第一个「新」,就是新基建,而人工智能是新基建的重要组成部分。新基建首次被纳入政府工作报告后,各大科技厂商纷纷押注,重金投向「新…