01月23, 2017

智能预测之cpu预测

背景与目标

cpu是服务器正常运行的比较重要的指标之一。为了保证其性能,业界通常为其设定阈值的方法来确保服务的可靠性和可用性。甚至有学者使用时间序列的预测模型来提前预测服务器的cpu的走势。在预测情况比较复杂的监控项时候,传统的ARIMA或者指数平滑的方法很难达到比较好的效果,因为他们很难捕捉到以前从未出现过的情况。相反,神经网络模型由于输入的是非线性方程,可以处理更复杂的时间序列。

本文采用神经网络模型去预测cpu的走势,提前预测出将要发生报警的机器,尽可能将具有隐患的故障扼杀在摇篮中,提高系统的可靠性和可用性。

模型使用

获取数据

我们采集过去7天的数据,采集间隔是1小时。使用下面代码得到历史的数据。

#导入需要的模块
import csv
import date
import datetime
import pandas as pd
#从csv文件中读取时间和对应的数据
data = pd.read_csv("cpu_idle_data.csv")

time_series = []
mydata = []
#将数据保存在mydata中
#将.csv数据读入Pandas数据帧
for timestamp,used_percent in zip(data["timestamp"],data["used_percent"]):
    mydata.append(used_percent)

建立神经网络模型

建立神经网络模型,首先要确定输入、隐藏和输出层的神经元个数。

由于我们的线上业务具有天的周期性,所以我们将输出层的个数设为24,隐藏层的个数一般为输输入层个数乘以2再加1,所以输出层为49,输出层的个数为1,,我们根据此规则建立模型:

from pybrain.structure import *
fnn = FeedForwardNetwork()
#设立三层,一层输入层(3个神经元,别名为inLayer),一层隐藏层,一层输出层
inLayer = LinearLayer(24, name="inLayer")
hiddenLayer = SigmoidLayer(49, name="hiddenLayer0")
outLayer = LinearLayer(1, name="outLayer")

#将三层都加入神经网络(即加入神经元)
fnn.addInputModule(inLayer)
fnn.addModule(hiddenLayer)
fnn.addOutputModule(outLayer)

#建立三层之间的连接
in_to_hidden = FullConnection(inLayer, hiddenLayer)
hidden_to_out = FullConnection(hiddenLayer, outLayer)

#将连接加入神经网络
fnn.addConnection(in_to_hidden)
fnn.addConnection(hidden_to_out)

#让神经网络可用
fnn.sortModules()

构造数据集

from pybrain.datasets import SupervisedDataSet
    ds = SupervisedDataSet(24, 1)
    for i in range(24, len(data)-1):
        sample = data[i-24:i]
        output = data[i+1]
        ds.addSample(sample,output)
    #把数据集切分成训练集和测试集,训练集:测试集=8:2
    dataTrain,dataTest = ds.splitWithProportion(0.8)
    xTrain, yTrain = dataTrain["input"], dataTrain["target"]
    xTest, yTest = dataTest["input"], dataTest["target"]

训练神经网络

训练时候采用BP神经网络:

from pybrain.supervised.trainers import BackpropTrainer
trainer = BackpropTrainer(fnn, ds, verbose = True, learningrate=0.01)
#maxEpochs即你需要的最大收敛迭代次数,这里采用的方法是训练至收敛,此处设为1000
trainer.trainUntilConvergence(maxEpochs=1000)

验证与分析

我们可以挑选出测试集中的任意一个数据来验证模型的好坏。

import random

# c为从0到xTest的长度(包括0,不包括长度)之间的随机值
c = random.randint(0, xTest.shape[0])

# X2为xTest的一个随机样本点
X2 = xTest[c,:]

# activate函数即神经网络训练后,预测的X2的输出值
prediction = fnn.activate(X2)

# 可以将其打印出来
print("true number is: " + str(yTest[c]),
    "prediction number is:" + str(prediction),
      "error:" + str((prediction-yTest[c])/yTest[c]))

后期尝试

上面输出层含有一个神经元,如果想预测多个时间点的数据,可以修改输出层的个数。

如果普通的BP神经网络的效果不理想,可以尝试深度神经网络中的RNN模型。

本文链接:https://www.opsdev.cn/post/cpu-predict.html

-- EOF --

Comments

评论加载中...

注:如果长时间无法加载,请针对 disq.us | disquscdn.com | disqus.com 启用代理。