使用ARIMA时间序列算法+腾讯Metis开源的时间序列异常检测学件预测系统容量变化趋势

以Oracle数据库表空间容量增长变化为例,用不同的数据分析算法来进行容量变化的预估,通过评估各种算法最终的效果,选用ARIMA算法和Metis的时间序列异常检测学件预测的效果最好。原因有如下三点:

1 从回归算法的评估指标来看,ARIMA+时间序列异常预测效果最好,使用的评价指标为R2 Score=0.72(拟合优度,越接近1,表明模型越好)和RMSE均方误差根=110.2(预测值与真实值的误差平方根的均值)。

2 空间容量的变化基本符合时间序列的特征。容量的变化应该呈现一种比较缓慢而长期的持续上升趋势。有的情况下会出现周期性的变动。

时间序列中的指标值不具有可加性。

序列中每个指标数值的大小与其间隔时间长短没有直接联系。

序列中每个指标数值通常是通过定期的一次登记取得的。

3 Metis时序异常检测使用了TSFRESH时序特征提取库来获取30多种时序特征,配合各种统计特征比如EWMA、68–95–99.7 Rule、多项式拟合等来判断数据分布是否存在异常。最后通过XGBoost高效算法进行类别判断。时间序列异常检测学件在织云企业版本中已覆盖 20w+ 服务器,承载了 240w+ 业务指标的异常检测。经过了海量监控数据打磨,该学件在异常检测和运维监控领域具有广泛的应用性。

先给出ARIMA+Metis的容量趋势预测结果图:

存在的问题:

1 图中两个尖点,我理解应该算是一个异常值,但是Metis并没有检测出来。还有待研究一下

2 虽然蓝色的预测曲线和黄色的真实值曲线大致吻合,但还是有些误差的。同时,在测试过程中,ARIMA的参数需要不断的调整,不同时段的数据对应的算法模型的参数不一致。说明算法的鲁棒性查,抗干扰能力弱。主要原因是数据量少(目前数据只有三个月,几千行样本数据)、样本类型单一等。有待研究改进。

下面把整个数据分析过程大概介绍一下,包括系统架构、数据采集、数据处理、数据分析几个方面。有关算法和一些名词的解释在文档后面有介绍。

一 系统架构

使用主流框架组合:Python+Django+Celery+BootStrap。后端数据库为Mysql

数据分析过程分为数据采集、数据预处理、数据预测及算法评估三个部分。

1 数据采集

使用Celery每小时收集一次数据库表空间变化数据。每次收集的数据特征为163维。全部为Oracle数据库本身的特征。主要的数据源如下:

DBA_HIST_SYSMETRIC_SUMMARY

DBA_HIST_TBSPC_SPACE_USAGE

DBA_TABLESPACES

DBA_DATA_FILES

DBA_FREE_SPACE

DBA_TEMP_FILES

其他特征比如操作系统等暂时没有收集。

下图是Django中定时任务的配置信息:

2 数据预处理

对数据进行清理、格式化。以满足后面数据分析使用,包括一下几个部分:

1)因子分析

2)K-Means聚类

3)时序异常检测

先用 Factor-analyze(FA)方法来转换高维度的DBMS特征,将数据转换为较低维度的数据。然后使用k-means聚类算法来聚集这个较低维度的数据成有意义的组。使用这些降维技术来减少数据中的“噪音”。提高聚类分析的鲁棒性和质量。

用k-means聚类结果是30个组时,得到的系统特征如下 红色标注的部分是我觉得和空间变化率有关的特征。

Total Sorts Per User Call, 用户排序次数

Cell Physical IO Interconnect Bytes

Total PGA Allocated PGA大小

Physical Read Bytes Per Sec 每秒物理读字节

Temp Space Used 临时表空间使用大小

Total PGA Used by SQL Workareas 用于SQL语句的PGA大小

Physical Write Bytes Per Sec 每秒物理写字节数 (感觉这个有些多余,下面的就可以代替)

Physical Write Total Bytes Per Sec, 每秒物理写的总字节数

Cursor Cache Hit Ratio, cursor cache的命中率

Redo Generated Per Sec 每秒redo生成大小

Redo Generated Per Txn 每事务redo生成的大小

Consistent Read Gets Per Sec 每秒一致读大小

Rows Per Sort 行排序大小

Physical Read Total Bytes Per Sec 每秒物理读字节数

Logical Reads Per Txn 每事务逻辑读

Network Traffic Volume Per Sec 每秒网络流量

Physical Reads Direct Per Sec 每秒物理直接读

Logical Reads Per User Call 每用户的逻辑读

DB Block Changes Per Sec, DB 块每秒的变化大小

Logical Reads Per Sec, 每秒逻辑读

Database Time Per Sec, 每秒DB time占多少

Physical Reads Per Sec, 每秒物理读

Physical Read Total IO Requests Per Sec 每秒物理读请求数

DB Block Changes Per Txn 每事务的DB 块改变大小

Open Cursors Per Sec 每秒打开的游标数

Consistent Read Gets Per Txn 每事务一致读大小

Response Time Per Txn 每事务相应时间

Physical Reads Per Txn, 每事务物理读大小

Host CPU Utilization (%) 主机CPU利用率

这里采用Metis的最值检测。适用于大多数KPI指标数据的检测,使用无监督和有监督联合检测。

样本的选取规则如下:

异常查询的界面

下图是本次样本数据的检测结果,可以看到蓝色线是待检测的数据,可以看到明显的异常值。

下面简单介绍一下Metis的异常检测过程,这是我撸了一遍代码大概总结出来的,后续还要继续深入了解。

1)获取样本数据的时序特征。 分为三个部分:统计特征、拟合特征、分类特征

统计特征:用开源的时序数据特征提取工具包TSFRESH来提取。总共提取30个时序特征。包括最大最小值、均值、方差、中位数、唯一值比例、后续时间绝对差异的平均值、最长连续子序列的长度等时序特征。

拟合特征:包括移动平均差值、加权移动平均差值、指数移动平均差值、双指数移动平均差值。同时还增加了统计特征中的一些特增值

分类特征:自相关性计算、变异系数计算、数据分布的特征统计等

2)利用时序特征通过统计的算法进行首层判决。下面三种算法来判断数据分布是否存在异常,只要一种算法判断数据分布异常,就进入XGboost算法进行异常值的判断,

1、使用68-95-99.7规则(https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule) 。目的是在观测样本数据的分布。包括正态和非正态分布。

其主要目的就是为了看大部分数据分布在哪个范围内,有些像异常值检测。

在实验科学中有对应正态分布的三西格马定律(three-sigma rule of thumb),是一个简单的推论,内容是“几乎所有”的值都在平均值正负三个标准差的范围内,也就是在实验上可以将99.7%的机率视为“几乎一定”[1]。不过上述推论是否有效,会视探讨领域中“显著”的定义而定,在不同领域,“显著”(significant)的定义也随着不同,例如在社会科学中,若置信区间是在正负二个标准差(95%)的范围,即可视为显著。但是在粒子物理中,若是发现新的粒子,置信区间要到正负五个标准差(99.99994%)的程度。

在不是正态分布的情形下,也有另一个对应的三西格马定律(three-sigma rule),即使是在非正态分布的情形下,至少会有88.8%的机率会在正负三个标准差的范围内,这是依照切比雪夫不等式的结果。若是单模分布(unimodal distributions)下,正负三个标准差内的机率至少有95%,若一些符合特定条件的分布,机率至少会到98%[2] 。

https://zh.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7%E5%8E%9F%E5%89%87

代码片段

3、多项式拟合分析(https://en.wikipedia.org/wiki/Polynomial_regression): 通过多项式回归,逼近出曲线的大致形状,然后按照偏离程度为后面的XGBoost算法做一些分析做准备。

代码片段:

3) 用XgBoost算法进行分类预测。

XGBoost是近几年利用机器学习领域内一个强有力的武器。执行速度要比传统的GDBT实现要快。另外在结构化的数据集上,在分类\回归\排序预测建模上表现很突出。官网地址:https://xgboost.readthedocs.io/en/latest/parameter.html

主要步骤如下:

1 根据三大特征,统计特征、拟合特征、分类特征。来对样本数据进行特征扩展。

2 然后根据得到的特征开始训练数据。

3 对数据进行分类预测。

得出的分类结果说明如下:

4 数据分析

使用数据分析算法对经过时序数据异常检测后的样本数据进行在线分析和评估。

本次测验使用的数据分析算法由如下:

1)线性回归 RIDGE算法。

最先想到的算法。经过特征降维后,得到有意义的分组,然后根据这些分组的样本数据,用线性回归算法来计算空间的变化大小,下图是模型在测试数据集上的测试结果,可以看到预测的效果很不好

Ridge回归预测的平均绝对误差高达831.51。基本起不到预测趋势的目的。

2)Adaboost算法

Adaboost选取的弱学习算法是决策回归树。预测的效果如下:

对比Ridge效果要好一些。图中蓝色的框在Ridge回归预测中都没有显著的预测出趋势。但是Adaboost的平均绝对误差也高达600.15. 也基本上起不到预测趋势的目的

3)ARIMA算法

下图是模型的趋势预测结果,蓝色线未预测结果,黄色线是真是数据。RMSE差不多为230。 比之前的两个算法RMSE有大幅度的降低。R2 score的值为0.67. 模型还是不很理想。但基本能够预测出容量变化的趋势。

存在的问题:

1 图中两个尖点,我理解应该算是一个异常值,但是Metis并没有检测出来。还有待研究一下

2 虽然蓝色的预测曲线和黄色的真实值曲线大致吻合,但还是有些误差的。同时,在测试过程中,ARIMA的参数需要不断的调整,不同时段的数据对应的算法模型的参数不一致。说明算法的鲁棒性查,抗干扰能力弱。主要原因是数据量少(目前数据只有三个月,几千行样本数据)、样本类型单一等。有待研究改进。

5 名词解释

1 学件:

是一种性能良好的预训练机器学习模型,其具有一套解释模型意图和/或特性的规约

2 ARIMA算法:

差分自回归移动平均模型。是用于时间序列分析的算法。原理是将非平稳时间序列转换为平稳时间序列然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。是时间序列分析中常用的算法模型。

AR是自回归。MA是移动平均。

三个参数:p为自回归项 q为移动平均数。d为时间序列成为平稳时所做的差分次数

3 Metis时间序列异常检测学件。

由腾讯开源出来的机器学习学件。时间序列异常检测学件的实现思路是基于统计判决、无监督和有监督学习对时序数据进行联合检测。通过统计判决、无监督算法进行首层判决,输出疑似异常,其次进行有监督模型判决,得到最终检测结果。检测模型是经大量样本训练生成,可根据样本持续训练更新。

4 TSFRESH时间序列特征提取库

很有用的时间序列特征提取库,一共有100+时间特征可以使用。在Metis中使用了30多种时序特征。 https://github.com/blue-yonder/tsfresh。 TSFRESH自动从时间序列中提取100多个个特征。这些特征描述了时间序列的基本特征,如峰值的数量、平均值或最大值或更复杂的特征,如时间反转对称统计量。

5 线性回归

RIDGE: 用于共线性数据分析的回归方法,用最小二乘线性回归来估计。也叫先验分布为高斯分布的贝叶斯估计

LASSO:用于共线性数据分析的回归方法,用最小二乘线性回归来估计,也叫先验分布为拉普拉斯分布的贝叶斯估计。

6 因子分析

用于研究观测变量变动的共同原因和特殊原因,从而达到简化变量结构的目的的多元统计分析方法。两个方面,以寻求变量的基本结构,简化变量系统,二是用于分类。

7 K-Means聚类

基于距离、相似度的聚类算法。基本步骤如下:

1 给定数据

2 确定类别数,并初始化K个类的中心

3 对每个数据点,计算离其最近的类。

4 多每个类,计算其所有数据的中心,并更新为新的中心

5 重复3-4步。知道数据点所属类别类不再改变

8 Adaboost算法

Boosting算法就是将弱学习器组合成强的分类器或者回归算法。没有先验知识的情况下,初始的分布为等概分布,即训练集如果有N个样本,每个样本的分布概率为1/N。

每次循环后提高误分样本的分布概率,误分样本在训练集中所占权重增大,使得下一次循环的弱学习器能够集中力量对这些误分样本进行判断。

9 XGBoost算法

是由 Tianqi Chen http://homes.cs.washington.edu/~tqchen/ 最初开发的实现可扩展,便携,分布式 gradient boosting (GBDT, GBRT or GBM) 算法的一个库,可以下载安装并应用于 C++,Python,R,Julia,Java,Scala,Hadoop,现在有很多协作者共同开发维护。不论从运行时间还是模型的性能上,XGBoost目前是机器学习领域一个强有力的工具,在各种竞赛中都取得了很好的成绩,可用于分类\回归\排序的数学分析。

oracle单表空间预估,使用ARIMA和腾讯的Metis时序数据异常检测来预测系统空间容量变化趋势...相关推荐

  1. oracle单表数据量上亿_MySQL数据库中,数据量越来越大,有什么具体的优化方案么?...

    个人的观点,这种大表的优化,不一定上来就要分库分表,因为表一旦被拆分,开发.运维的复杂度会直线上升,而大多数公司和开发人员是欠缺这种能力的. 所以MySQL中几百万甚至小几千万的表,先考虑做单表的优化 ...

  2. [数据库] Oracle单表查询总数及百分比和数据横向纵向连接

    这是最近项目关于SQL语句的,本文简单记录并总结以下几个知识点:         1.如何统计一张表中某个字段的总数,如不同"专业"的学生数及所占百分比:         2.如何 ...

  3. oracle当查询没有输出返回0,[数据库] Oracle单表查询总数及百分比和数据横向纵向连接...

    这是最近项目关于SQL语句的,本文简单记录并总结以下几个知识点: 1.如何统计一张表中某个字段的总数,如不同"专业"的学生数及所占百分比: 2.如何联系另一张表进行查询某个字段的总 ...

  4. Oracle单表内连接查询

    源数据如下: 根据Col3值,把Co1和Co2映射并去空查询,预期结果如下: 思路分析: 使用单表内连接+where条件判断非空即可 查询SQL: SELECT t1.col1,t2.col2 FRO ...

  5. Oracle单表备份三种方案

    备份方案一: 1. 备份 create table [备份名] as select * from [表名]; 2. 恢复 truncate table org_group; insert into o ...

  6. oracle 单表查询 详细图文

    1.简单查询 1.1查询指定列 (1)指定部分列 检索所有教师的姓名,名称,工资,参加工作时间等信息 SELECT  <*/expression1 [AS alias1],....>FRO ...

  7. oracle单表存储记录,oracle从各个表获得数据保存到另一个表

    oracle从各个表取得数据保存到另一个表 从各个表中取得数据保存另一个表中: CREATE VIEW PARAMETER_view AS WITH tall AS ( SELECT p.PI_NO, ...

  8. oracle 单表查重,Oracle如何用单字段或多字段进行查重

    最近在整理数据形成信用报告,发现重复的数据真的多,梳理都好久.我就做个笔记把去掉重复数据的方法整理下来.方便我后期查阅. 我将我目前已知的两种去重方法分为:视图去重和表去重.原理就是有无rowid这个 ...

  9. oracle表删除重复数据,oracle单表删除重复数据

    1.建立一个mytesttable表 CREATE TABLE mytesttable( idno NUMBER(2), val NUMBER(2) ); 2.插入测试数据 INSERT INTO m ...

  10. 【PL/SQL】--导出oracle单表数据--drp204

    转载于:https://www.cnblogs.com/wangmei/p/5187660.html

最新文章

  1. Java中对象的销毁
  2. TOAD FOR MYSQL 进行数据插入时乱码的解决办法---MariaDB 5.5
  3. 初探 es6 promise
  4. WebAPI(part7)--Tab栏切换案例
  5. linux中内部命令有哪些,linux内部命令有哪些
  6. 50万年薪程序员,被百万网民怒喷后,却迎来大撕逼
  7. java学习(70):GUL图形用户界面初识
  8. 十三、PHP框架Laravel学习笔记——构造器的 where 派生查询
  9. linux 下wine 和plyaonlinux 安装以及卸载 (linux下运行windows软件的神器)
  10. Objective-c 子类重写方法调用[super method]小实验
  11. 12. Qt中相关字符串处理
  12. weblogic时间问题
  13. .net mvc 获取项目文件夹路径
  14. Windows电脑搜索功能不能用怎么办
  15. android 剪切并上传图片
  16. 闲谈IPv6-IPv4的TCP和NAT让互联网变得畸形
  17. 湖北省武汉市社会保险参保缴费查询
  18. 虚拟桌面更新,自定义快捷键
  19. uni.navigateTo传参
  20. 计算机实践教程作业桌面管理截图,如何将电脑现在的桌面截图,并保存在考试题目里面...

热门文章

  1. 为Jumpserver 配置企业微信
  2. 影响下载速度的因素--总结
  3. unity的立方贴图
  4. wex5 页面跳转
  5. built a JNCIS LAB系列:Chapter 1 Communities v1.0
  6. easymock 图片_小程序——使用Easy Mock
  7. 批量替换ppt内容_在office宏中运行即可
  8. Emacs键盘练习方法
  9. Android 蓝牙4.0 BLE 获取链接设备Rssi值
  10. QIODevice::write : device not open