用Tensorflow搭建预测磁盘性能的机器学习模型

前言:这篇文章的内容是去年上家公司参加部门code hackthon活动上运用了一些简单的Tensorflow机器学习模型,做的一个预测磁盘性能的小工具。因为和现在所做的行业和工作内容有些一定差距,就不详述应用的详细场景。google今年的开发者大会上定位所有的方向主攻“AI First”,相信机器学习将来会越来越多的提高大家的工作效率,也希望以后能用机器学习来给业务赋能。

背景:企业级存储器在目前应用在众多银行和大企业中,目前主流的存储,底层介质依然还是性价比高的磁盘(价格便宜,容量大),不过由于flash的强势崛起,新的中高端存储会越来越多的使用flash做为其存储介质。在实际使用中,不同企业在存储数据的时候应用场景不一样,有些是频繁,小批量;有些是单次大文件;有些是无规律的写入大小数据。不同存储在这些应用场景下,性能差距会比较大。这会导致销售人员在前线了解到需求后,需要测试部门模拟相应的场景,来给出存储的具体性能数据,这种场景可能需要花费一周才能拿到性能数据。

目标:收集足够多的磁盘性能原始数据,选择合适的机器学习模型来仿真性能数据。以后销售人员在评估性能的时候,只需要将数据输入到系统中,就可以得出一个较合理的结果。

说明:影响磁盘性能有30多个因素,在初期的模型中选择了特征显著的9个参数,磁盘性能的结果也有10多个维度来表示,这里选择了2个特征值。

直接贴:

import tensorflow as tf
import numpy as np
import csv
import time
from sklearn.preprocessing import StandardScaler

input_ = []
output1_ = []
output2_ = []
data_lenth = 1000
with open('train_5.csv') as f:
f_csv = csv.reader(f)
headers = next(f_csv)
for row in f_csv:
num_row = [ float(i) for i in row ]
input_.append(num_row[0:9])
output1_.append(num_row[9:10])
output2_.append(num_row[10:11])

my_X = np.array(input_[0:data_lenth])
my_Y1 = np.array(output1_[0:data_lenth])
my_Y2 = np.array(output2_[0:data_lenth])

scaler_x = StandardScaler().fit(my_X)
scaler_y1 = StandardScaler().fit(my_Y1)
scaler_y2 = StandardScaler().fit(my_Y2)

trX = scaler_x.transform(my_X)
trY1 = scaler_y1.transform(my_Y1)
trY2 = scaler_y1.transform(my_Y2)
print(" starting normalize *")
time.sleep(2)
print(" normalize input data *")
print(trX)
print(" normalize response_time_rnd *")
print(trY1)
print(" normalize response_time_seq *")
print(trY2)

创建两个占位符,数据类型是 tf.float32

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
biases = tf.Variable(tf.zeros(1) + 0.1)

创建一个变量系数 w , 最后训练出来的值,应该接近 2

w = tf.Variable(tf.zeros([1, 9]), name = "weights")
y_model = tf.multiply(X, w)+biases

定义损失函数 (Y - y_model)^2

cost = tf.square(Y - y_model)

定义学习率

learning_rate = 0.01

使用梯度下降来训练模型,学习率为 learning_rate , 训练目标是使损失函数最小

train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

with tf.Session() as sess:

初始化所有的变量

init = tf.global_variables_initializer()
sess.run(init)

对模型训练100次

for i in range(100):
for (x, y) in zip(trX, trY1):
sess.run(train_op, feed_dict = {X: x, Y: y})

输出 w 的值

W = sess.run(w)

输出 b 的值

B = sess.run(biases)

test_input = np.transpose(np.transpose(np.array([100,5000,4000])))

test_input = np.transpose(np.transpose(np.array([50,100,5000,4000,70,20,40,90,1000000])))
W = np.transpose(W)

print(" testing response_time_rnd *")
print(W)
print(B)
print("testing data: ")
print(test_input)
test_X = scaler_x.transform(test_input)
print(test_X)
test_output = np.dot(test_X,W)+B
print("result data(response_time_rnd): ")
print(scaler_y1.inverse_transform(test_output))

with tf.Session() as sess:

初始化所有的变量

init = tf.global_variables_initializer()
sess.run(init)

对模型训练100次

for i in range(100):
for (x, y) in zip(trX, trY2):
sess.run(train_op, feed_dict = {X: x, Y: y})

输出 w 的值

W = sess.run(w)

输出 b 的值

B = sess.run(biases)

W = np.transpose(W)
print(" testing response_time_seq *")
print(W)
print(B)
print("testing data: ")
print(test_input)
test_X = scaler_x.transform(test_input)
print(test_X)
test_output = np.dot(test_X,W)+B
print("result data(response_time_seq): ")
print(scaler_y1.inverse_transform(test_output))

此处的入参需要做归一化处理,不做归一化,数据量达到一定量时就会出现不收敛的情况。

scaler_x = StandardScaler().fit(my_X)
scaler_y1 = StandardScaler().fit(my_Y1)
scaler_y2 = StandardScaler().fit(my_Y2)
矩阵运算的转置处理。

trX = scaler_x.transform(my_X)
trY1 = scaler_y1.transform(my_Y1)
trY2 = scaler_y1.transform(my_Y2)
这部分是模型的核心,注释说明比较清楚。

创建两个占位符,数据类型是 tf.float32

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
biases = tf.Variable(tf.zeros(1) + 0.1)

创建一个变量系数 w , 最后训练出来的值,应该接近 2

w = tf.Variable(tf.zeros([1, 9]), name = "weights")
y_model = tf.multiply(X, w)+biases

定义损失函数 (Y - y_model)^2

cost = tf.square(Y - y_model)

定义学习率

learning_rate = 0.01

使用梯度下降来训练模型,学习率为 learning_rate , 训练目标是使损失函数最小

train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

with tf.Session() as sess:
# 初始化所有的变量
init = tf.global_variables_initializer()
sess.run(init)
# 对模型训练100次
for i in range(100):

for (x, y) in zip(trX, trY1): 
  sess.run(train_op, feed_dict = {X: x, Y: y}) 

# 输出 w 的值
W = sess.run(w)

# 输出 b 的值
B = sess.run(biases)

结果:因为对数据做了奇异值处理,所以用模型跑出来的结果八成以上是符合预期的,不过当实际存在较多奇异点的时候,准确率会下降到六至七成。而且原始数据的量还不够,也会导致现实场景奇异点较多。后续考虑用多层神经网络模型来模拟这种场景,在数据源足够的情况下,结果会更加符合预期。

附件说明:

py文件是包含QT界面的完整文件

csv文件是数据素材

上一篇:磁盘占用百分百?Windows 10必做各项优化


下一篇:1016. 最大上升子序列和