实验文档
1.预警模型
预警模型主要任务是根据当前的安全形势给出当前的安全风险值。
当前的安全形势由多项指标组成比如 某些违章的数量,环境的温度湿度等。而安全风险值就是一个具体数值,提供给管理者作为决策依据。由于安全形势和安全风险值之间的关系未知,采用前馈神经网络学习安全形势和安全风险值之间的内在联系。
(1)输入数据形式
采用前馈神经网络作训练, 需要的训练数据形式为
(当前各项安全指标的数值, 当前安全风险值)
具体一些,比如针对一个井场某一天情况,可能需要的安全指标就有,当天所有员工未带安全帽的次数,当天所有员工的操作失误次数,当天的温度,湿度等等。
比如在以前的指标数据中,某个井场某一天,员工未戴安全帽施工的次数是5,操作失误的次数是10, 当天温度 27摄氏度, 而根据以前指标体系计算出来的安全风险值是30,那么当天该井场产生的数据就是一个4维向量(5,10,27,30),前三项是安全指标,最后一项是安全风险值。前馈神经网络需要的就是这种多维向量的数据。
一般做回归,大约几万条数据就能够训练出精度比较高的网络。比如训练完成后,输入 前面的(5,10,27)网络就会输出
30,表示该井场在员工未戴安全帽施工的次数是5,操作失误的次数是10,当天温度 27摄氏度的情况下 安全风险值是30。
现在就是还没有找到 以前的指标体系中 安全风险值 跟哪些具体安全指标有关。
针对不同的单位,用作预警的指标可能不同,比如整个公司的指标,和某个井场的指标 肯定不完全相同,但大致的原理是相同的。针对不同的单位可以构建不同的神经网络。
(2)建模训练
前馈神经网络模型的建立采用的是基于tensorflow 的kera框架,用python实现,训练完成后将达到精度要求的模型保存到默认路径下面,以便于后面部署到线上环境。
我采用的是sklearn自带的用于分类的数据集。
下面是python代码
#导入相关软件包
import numpy
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.datasets import make_blobs
from keras.layers import Dense,Conv2D,Dropout
from keras.models import Sequential
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping, ModelCheckpoint
#导入训练数据
diabetes = datasets.load_boston()
#分割训练数据
X_train = diabetes.data
y_train = diabetes.target
print(len(X_train))
print(len(y_train))
#建立模型
model = Sequential()
model.add(Dense(50, input_dim=X_train.shape[1], activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(25, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(5,activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(1,activation='relu'))
#加载模型
model.load_weights("my_model.h5")
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
#测试模型
y_Predict = model.predict(X_train)
score=0;
for i in range(len(X_train)):
if((y_Predict[i]-y_train[i])/y_train[i]<0.1):
score=score+1
print('Test accuracy: %.2f%%' % (score/100))
#结果可视化
plt.plot(y_Predict)
plt.plot(y_train[1:])
plt.show()
模型训练完成后一共预测了500条数据,橙色的是实际值,蓝色的是预测值。代码本来是作回归分析的,
但因为用的是分类数据集 所以明显看出预测效果不太理想。
而做安全风险值的预测是回归分析,该网络的效果会比较精确。
2.预测模型
(1)预测模型及数据
根据当前的安全形势会影响未来的安全形式这一事实,安全风险值的预测采用的是时间序列预测法,采用的是循环神经网络RNN的一个变体 LSTM。
此时的训练数据只需要各个阶段的安全风风险值这一项 ,并不需要其他的安全指标体系。但是时仍然需要对得到的数据进行处理
比如 我们有有某个井场在一周内的安全风险值数据(25,31,45,76,33,45,27),如果我们假设
每一天的安全风险值和前三天的安全风险值有关,则可以将数据集划分:
(25,31,45,76)表示如果前三天的安全风险值是(25,31,45)那么下一天的安全风险值最可能是76
(31,45,76,33)表示如果前三天的安全风险值是(31,45,76)那么下一天的安全风险值最可能是33
(45,76,33,45)表示如果前三天的安全风险值是(45,76,33)那么下一天的安全风险值最可能是45
将数据集划分为这样的形式后,表示通过前三天的安全风险值预测下一天的安全风险值。同样的也可以通过前四天或者前n天的安全风险值预测下一天或者接下来任意时间的安全风险值,不过一般都只预测接下来一天的安全风险值,因为预测接下来多天安全风险值的准确度比预测接下来一天的安全风险之的准确度要低。
(2)模型建立及训练
仍然采用基于tensorflow的keras框架,下面是构建循环神经网络代码
#导入相关软件包
import numpy as np
from matplotlib import pyplot as plt
from sklearn import preprocessing
from keras.models import Sequential, load_model
from keras.layers import Dense, Dropout, LSTM
from keras.callbacks import EarlyStopping
from keras.optimizers import Adam
import pandas as pd
import os
import tensorflow
#加载数据集
dataframe = pd.read_csv(r'C:\Users\戈浩\Desktop\international-airline-passengers.csv', usecols=[1], engine='python', skipfooter=3)
dataset = dataframe.values
#将整型变为float
dataset = dataset.astype('float32')
#数据归一化
scaler = preprocessing.MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)
#数据分割
train_size = int(len(dataset) * 0.65)
trainlist = dataset[:train_size]
testlist = dataset[train_size:]
#数据分批处理
def create_dataset(dataset, look_back):
dataX, dataY = [],[]
for i in range(len(dataset)-look_back-1):
a=dataset[i:(i+look_back)]
dataX.append(a)
dataY.append(dataset[i+look_back])
return np.array(dataX), np.array(dataY)
look_back=3
DataX, DataY = create_dataset(trainlist, look_back)
TestX, TestY = create_dataset(testlist, look_back)
DataX = np.reshape(DataX, (DataX.shape[0], DataX.shape[1], 1))
TestX = np.reshape(TestX, (TestX.shape[0], TestX.shape[1], 1))
#构建模型
model = Sequential()
model.add(LSTM(20, input_shape=(3,1)))#步数为3,维度为1
model.add(Dense(50, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(1,activation='relu'))
model.compile(loss='mse',optimizer='adam', metrics=['accuracy'])
#训练模型
batch_size = 1
n_epochs = 100
model.fit(DataX, DataY, batch_size=batch_size, epochs=n_epochs)
DataPredict = model.predict(DataX)
TestPredict = model.predict(TestX)
#反归一化
DataPredict = scaler.inverse_transform(DataPredict)
DataY = scaler.inverse_transform(DataY)
TestPredict = scaler.inverse_transform(TestPredict)
TestY = scaler.inverse_transform(TestY)
#结果可视化处理
plt.plot(DataY)
plt.plot(DataPredict[1:])
plt.show()
plt.plot(TestY)
plt.plot(TestPredict[1:])
plt.show()
此处采用的数据集是专门用作时间序列预测的民航公司飞机飞行数据,和井场的安全风险值类似。一共使用了120条数据。
图中橙色的线表示实际值,蓝色的线表示循环神经网络的预测值,可以看出,实际值和预测值的拟合效果比较好