利用时间序列预测用户系统是否过载

来源:互联网 发布:js bind 用法 编辑:程序博客网 时间:2024/05/16 01:19

目标
预测服务器磁盘已使用空间大小

思路与流程
系统长时间运行,数据会持续写入磁盘,存储空间持续减少。由此看来,磁盘空间大小与时间变化有很强的关联性,且历史数据对未来发展存在一定的影响,故采用时间序列模型
确定模型之后,需要抽取相应的数据。需要对数据进行周期性分析及数据清洗、数据变换等操作,以适应模型的的需要

抽取数据 - 数据探索 - 数据预处理 - 构建模型


一、抽取数据
本次挖掘抽取 2014-10-01 到 2014-11-16 期间C盘和D盘的磁盘容量数据

这里写图片描述

这里写图片描述

综上看出,数据集的大小为(188行, 7列),没有空值

二、数据探索

本次挖掘采用时间序列分析方法建模,需要保证数据的平稳性,我们可以通过时序图初步发现数据的平稳性

C盘已使用空间的时序图:

这里写图片描述

D盘已使用空间的时序图:

这里写图片描述

从图中可以得知,C盘和D盘已使用空间不具有周期性,表现出缓慢增长,呈现趋势性。可以初步判定,数据是非平稳的

三、数据预处理

按照时间序列的要求,我们只需要知道时间序列值就够了。这里的时间序列值是C盘已使用空间和D盘已使用空间,我们需要从原始数据中提取出它们作为单独的列,代码如下:

used_d = d[d['TARGET_ID'] == 184].copy()used_d['COLLECTTIME'] = pd.to_datetime(used_d['COLLECTTIME'])g_d = used_d.groupby('COLLECTTIME')c_d = pd .DataFrame(g_d.apply(lambda x : x['VALUE'].iloc[0]),columns=['CWXT_DB:184:C:\\'])d_d = pd .DataFrame(g_d.apply(lambda x : x['VALUE'].iloc[1]),columns=['CWXT_DB:184:D:\\'])final_d = pd.concat([c_d,d_d],axis=1)

处理后的数据集如下:

这里写图片描述

四、构建模型及应用
注:只采用D盘已使用空间大小的数据

1 平稳性和白噪声检验
时间序列要求我们先对数据的平稳性检验,确保时间序列没有随机趋势或确定趋势。白噪声检验能够确保时间序列的数据是有用的

平稳性检验结果:

这里写图片描述

白噪声检验结果:

这里写图片描述

2 模型识别和模型检验
这里利用BIC信息准则对模型进行定阶,确定合适的p、q参数,从而选择最优的ARIMA模型。代码如下:

stable_s = s.diff(1).dropna()from statsmodels.tsa.arima_model import ARIMApmax = int(len(stable_s)/10) #一般阶数不超过length/10qmax = int(len(stable_s)/10) #一般阶数不超过length/10bic_matrix = [] #bic矩阵for i in range(pmax+1):     l = []    for j in range(qmax+1):        try:            l.append(ARIMA(s, (i,1,j)).fit().bic)        except:            l.append(None)    bic_matrix.append(l)

最终p、q的值确定为:

这里写图片描述

确定p、q之后,还需要检验其残差序列是否为白噪声。如果不是白噪声,说明残差中还存在有用信息,需要进一步提取或者修改模型
残差序列白噪声检验结果:

这里写图片描述

3 模型预测和模型评价
通过已构建的模型,预测未来5天的D盘已使用空间大小。预测结果为:

这里写图片描述

实际值与预测值对比结果表(单位:GB):

这里写图片描述

最后评价时序模型效果的好坏,采用3个衡量模型预测精度的统计指标:平均绝对误差、均方根误差、平均绝对百分比
统计量为:

这里写图片描述

结合实际业务,误差阈值设定为1.5。上述统计量全都小于设定的阈值,模型可用