更改LSTM网络自动编码器的超参数

时间:2019-12-07 13:18:20

标签: python tensorflow machine-learning keras lstm

我具有从触摸屏和智能手机上的内置传感器评估的数据集功能。我想在python中使用LSTM自动编码器实现异常检测代码,以计算小于10%的EER值(相等错误率)。训练数据集具有真实用户的大小,带有零标签。但是,测试数据集包括真实用户和异常用户的样本。我们将真实用户样本标记为零,将异常用户样本标记为1。

数据结构:

真正用户的

X_train的形状为(4814,158),表示(样本数量(原始),要素数量(列))。 Y_train的形状为(4814,1),全为零。

X_test包括总数(3000,158),其中真实用户为(1500,158),其他异常用户为(1500,158)。

Y_test(3000,1),其中第一个(1500,1)标签为零表示真实用户,其余(1500,1)标签为一个代表其他异常用户。

规范化过程中,我使用Standardscalre规范化方法来拟合和转换训练数据,然后转换测试数据集。

# import libraries
import os
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from sklearn.externals import joblib
import seaborn as sns
sns.set(color_codes=True)
import matplotlib.pyplot as plt
%matplotlib inline
from numpy.random import seed
from tensorflow import set_random_seed
import tensorflow as tf
tf.logging.set_verbosity(tf.logging.ERROR)
from Keras.layers import Input, Dropout, Dense, LSTM, TimeDistributed,
from keras.layers import RepeatVector
from keras.models import Model
from keras import regularizers
# normalize the data
scaler = StandardScaler().fit(X_train )
X_train = scaler.transform(X_train )
X_test = scaler.transform(X_test)

为LSTM [示例,时间步长,特征]调整输入

X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
print("Training data shape:", X_train.shape)
X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
print("Test data shape:", X_test.shape)

训练数据形状:(4814,1,158),测试数据形状:(3000,1,158)

定义自动编码器网络模型

def autoencoder_model(X):
inputs = Input(shape=(X.shape[1], X.shape[2]))
L1 = LSTM(10, activation='relu', return_sequences=True, 
kernel_regularizer=regularizers.l2(0.00(inputs)
L2 = LSTM(10, activation='relu', return_sequences=False)(L1)
L3 = RepeatVector(X.shape[1])(L2)
L4 = LSTM(10, activation='relu', return_sequences=True)(L3)
L5 = LSTM(10, activation='relu', return_sequences=True)(L4)
output = TimeDistributed(Dense(X.shape[2]))(L5)    
model = Model(inputs=inputs, outputs=output)
return model

创建自动编码器模型:

model = autoencoder_model(X_train)
model.compile(optimizer='adam', loss='mae')
model.summary()

使模型适合数据:

nb_epochs = 50
batch_size = 128
history = model.fit(X_train, X_train, epochs=nb_epochs, batch_size=batch_size, 
validation_split=0.05).history

计算测试集上的损耗:

X_pred = model.predict(X_test)
X_pred = X_pred.reshape(X_pred.shape[0], X_pred.shape[2])
X_pred = pd.DataFrame(X_pred, columns=test.columns)
X_pred.index = test.index
scored = pd.DataFrame(index=test.index)
Xtest = X_test.reshape(X_test.shape[0], X_test.shape[2])
scored['Loss_mae'] = np.mean(np.abs(X_pred-Xtest), axis = 1)
scored['Anomaly'] = scored['scored_errors'] > scored['Threshold']
print("Output scored errors when thr =0.2:\n", scored)

将测试数据输入模型:

enter image description here

从模型输出预测数据:

enter image description here

模型计算出的得分错误:

enter image description here

我需要模型能够完美地工作,以便它将真实用户的测试样本(即带红线的样本)分类为正常样本时,产生很小的输出得分错误(接近零)。并且模型应为异常用户的测试样本(即,用蓝线圈出的样本)产生较大的输出得分错误(至少大于一个),以将其分类为异常值。

但是,问题是当我为自动编码器模型的四层放置大量神经元(例如500、500、500、500)时,对于所有测试的输出,scored_errors非常小(接近零)样本(即,对于真实样本和异常样本)。相反,当我为自动编码器模型的四层放置少量神经元(例如10、10、10、10)时,输出的scored_errors非常大(超过数百个)。

有人可以控制模型,以便为正常样本提供较小的输出得分错误,而为异常样本提供较大的输出得分错误,以提高分类准确性吗?

0 个答案:

没有答案