趋势预测算法大PK!

2024-04-29 20:58
文章标签 算法 趋势 预测 pk

本文主要是介绍趋势预测算法大PK!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://blog.csdn.net/dQCFKyQDXYm3F8rB0/article/details/106368395

趋势预测在很多应用场景中都会起到至关重要的作用,比如淘宝商家会考虑库存量应该保持在多少才能够满足客户需求,商场希望得知假期会迎来多大的客流量以安排系列活动,机场想要预测五一黄金周会有多大的客运量来做相应的应急部署等。在智能运维领域,趋势预测同样具有一定的理论意义和实际应用价值。

趋势预测在运维场景中的应用背景

在实时监控系统中会采集到大量的数据,有些数据具有周期性等时间特征,也称之为时间序列。如果能挖掘出时间序列中所蕴含的信息,实现辅助人工决策,甚至是自动决策,都会为运维工作带来事半功倍的效果。

比如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也有相应的模型:

  1. 增长趋势的模型:有几个月(最好是一年)的每小时、每天或每周观察的历史数据;

  2. 季节趋势的模型(seasonality模型):有较强的季节性趋势;

  3. 有事先知道的以不定期的间隔发生的重要节假日(holiday模型),比如国庆节等。

整体来讲,Prophet模型可以根据前一段时间的序列数据,结合专家的经验,预测出期望时间段的输出值,以较小的模型训练成本获得较好的训练结果。

趋势预测算法小试牛刀

3.1 数据采集

本文采集了一些系统工单数据,通过LSTM和prophet模型分别对系统产生的工单数量的趋势进行预测。

首先对对提取到的数据进行预处理,提取出时间(ds)和事件单数(y)两列数据,部分数据可视化结果如下图所示:

 
  1. import numpy as np

  2. import pandas as pd

  3. #读入数据

  4. sales_df = pd.read_csv('false.csv')

  5. sales_df.head()

3.2 数据实验

1)LSTM模型构建与实验

本文采用keras框架,构建有一个LSTM和一个全连接层的网络,采用MSE损失函数,用adam来优化损失函数,并将数据以7:3的比例划分为训练集和测试集。具体代码如下:

 
  1. # create and fit the LSTM network

  2. model = Sequential()

  3. model.add(LSTM(4, input_shape=(1, look_back)))

  4. model.add(Dense(1))

  5. model.compile(loss='mean_squared_error', optimizer='adam')

  6. model.fit(trainX, trainY, epochs=240, batch_size=1, verbose=2)

在数据集上的实验结果如下图所示,左图展现了LSTM模型在数据集上的拟合情况,横轴为时间,纵轴为事件单数,黄色线为真实值,绿色实现代表训练集上的预测结果,绿色虚线表示测试集上的结果。可以看到模型基本可以拟合出变化趋势,但是在具体的数量预测还有改进的空间。右图展现了在验证集和测试集上的loss趋势图。

2)Prophet模型构建与实验

 
  1. from fbprophet import Prophet

  2.  
  3. ## 拟合模型

  4. m = Prophet()

  5. m.fit(sales_df)

  6. # # 构建待预测日期数据框,periods = 10 代表除历史数据的日期外再往后推 10 天

  7. future = m.make_future_dataframe(periods=10)

  8. # 预测数据集

  9. forecast = m.predict(future)

  10. forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

  11.  

通过fit()方法拟合Prophet()模型,make_future_dataframe()可以对未来日期的数据趋势进行预测,periods = 10 代表预测10天的结果,并计算出预测值(yhat),预测最小值(yhat_lower),预测最大值(yhat_upper)。具体趋势预测图如曲线图所示,黑点代表真实值,浅蓝色部分代表预测区间,可以看到模型基本可以拟合出较好的时间预测效果。

还能够通过plot_components(forecast)方法预测出数据的整体趋势和周效应:

趋势--整体趋势:

趋势--周效应:

除了预测每天产生的工单数量,本文还对某些系统每天发生的工单数进行了分析和预测,希望能够在预测的基础上,我们可以根据工单的预测数辅助运维工作的安排和开展。如某系统产生的工单数如下图:

小结

趋势预测算法在众多场景中都有重要的应用价值。本文对比较主流的ARIMA模型、LSTM神经网络模型和facebook发布的Prophet模型进行介绍,并在系统工单数据集上进行了初步探索。

虽然由于数据量的原因以及模型调参上还没有达到最佳的训练结果,但是模型对于趋势预测的有效性已经初步展现。之后,还会对趋势预测算法作进一步的探索和更深层次的研究,相信趋势预测算法在智能运维领域的应用也会更加广泛和可靠。

这篇关于趋势预测算法大PK!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947146

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖