ht+1
+bh
)(2)
y
t
=
W
h
→
y
h
t
→
W
h
←
y
h
t
←
b
y
y_t=W_{\overrightarrow{h}y}\overrightarrow{h_t}+W_{\overleftarrow{h}y}\overleftarrow{h_t}+b_y
yt=Wh
yht
+Wh
yht
+by (3)
数据集
本系统实现使用了NLS-KDD数据集,该数据集是用来评估入侵检测系统的标准数据集之一,是著名的KDD99数据集的修订版本.由四个子数据集组成:KDDTest+、KDDTest-21、KDDTrain+、KDDTrain+_20Percent.其中KDDTest-21和KDDTrain+_20Percent是KDDTrain+和KDDTest+的子集.数据集每条记录包含 43 个特征,如表1所示.其中41个特征指的是流量输入本身,最后两个是标签(正常或攻击)和分数(流量输入本身的严重性).
数据集下载地址: NLS-KDD
该数据集中包括了4种不同类型的攻击:拒绝服务(Denial of service,DoS)、探测(probe)、用户到根(U2R) 和远程到本地(R2L).同时每种攻击又包含了多种子类型,具体如表2所示。
数据集中数据分布情况如表3所示。
数据预处理
数据归一化及标签编码
由上面的数据集描述可知,NLS-KDD数据集中有三个非数值型的特征,分别是协议类型、服务和标志.但是由于本文所使用的深度学习模型BiDLSTM和LSTM只能处理数值型数据,因此在进行模型训练之前必须进行数据预处理:将非数值型数据转化为数值型数据.特征缩放可以确保数据集处于标准化形式,本文使用了sklearn库进行数据归一化,使用 Min–Max 缩放将每个特征的值缩放到 (0, 1) 范围内。
最小-最大特征缩放的表达式如下:
z
′
=
X
−
X
m
i
n
X
m
a
x
−
X
m
i
n
z^{'} =\frac{X-X_{min}}{X_{max}-X_{min}}
z′=Xmax−XminX−Xmin
实现代码:
from sklearn import preprocessing
import numpy as np
# 原始数据X\_train
df = pd.read_csv(filename, header=None)
X_train = df.iloc[:, :df.shape[1] - 1] # pandas中的iloc切片是完全基于位置的索引
labels = df.iloc[:, df.shape[1] - 1:]
# 初始化数据预处理器,本例中为最小最大值缩放
scaler = MinMaxScaler().fit(X_train)
X_train= scaler.transform(X_train)
数据增强
由于数据集中存在样本不平衡问题,本系统使用了SMOTE过采样技术处理数据。
实现代码:
test_data_filename = "/nls-kdd/data