我使用confusion_matrix()评估了经过训练可以检测DDoS攻击的模型。 混淆矩阵的结果与我的测试数据集类似。 我相信,如果False neg值正确检测到不是DDoS的攻击,则不应为0。
下面是我实现ML模型的代码。您能给我一个建议,让模型正确检查良性攻击吗?
model.add(Dense(units=64, activation='relu', input_dim=7)) # Input Layer
model.add(Dropout(0.5))
model.add(Dense(units=128, activation='relu')) # hidden Layer
model.add(Dropout(0.2))
model.add(Dense(units=64, activation='relu')) # hidden Layer
model.add(Dropout(0.2))
model.add(Dense(units=1, activation='sigmoid')) # Last Layer for output
model.compile(loss='binary_crossentropy',
optimizer=Adam(learning_rate=0.0001),
metrics=['accuracy'])
CSV_FILE = "ddos.csv"
df = pd.read_csv(CSV_FILE)
df.loc[(df.Label == "ddos"), "Label"] = 1.0
df.loc[(df.Label == "Benign"), "Label"] = 0.0
# Data set
x_train = np.array(df[["Flow Duration", "Tot Fwd Pkts", "TotLen Fwd Pkts",
"Flow IAT Mean","Flow IAT Std" ,"Flow IAT Max", "Flow IAT Min"]])
x_train = x_train.astype(float)
normalized_x = preprocessing.normalize(x_train)
y_train = np.array(df[["Label"]])
y_train = np.array(y_train, dtype = 'float')
normalized_y = preprocessing.normalize(y_train)
hist = model.fit(normalized_x, normalized_y, epochs=3, batch_size=128)
y_pred = model.predict(x_train)
y_pred = preprocessing.normalize(y_pred)
cf_matrix = confusion_matrix(y_test, np.rint(y_pred))
请注意,我的数据集是不不平衡的,也就是说,它具有50%的DDoS和50%的正常流量信息。
答案 0 :(得分:0)
尽管实际上无法肯定地回答此类问题,但是您的代码确实存在一些严重问题。
首先,您应该不标准化标签y_train
;这是一个二进制分类问题,标签应精确地为0/1
。 删除以下几行:
normalized_y = preprocessing.normalize(y_train)
y_pred = preprocessing.normalize(y_pred)
将标签更改为整数(而不是浮点数),即:
df.loc[(df.Label == "ddos"), "Label"] = 1
df.loc[(df.Label == "Benign"), "Label"] = 0
您的模型适合:
hist = model.fit(normalized_x, y_train, epochs=3, batch_size=128)
第二,尽管您使用normalized_x
进行训练,但随后又使用x_train
请求了预测,这又是错误的;您的预测应该是:
y_pred = model.predict(normalized_x)
第三,默认情况下不应该使用辍学,但前提是我们有过度拟合的迹象-这样做,我们的模型必须首先能够开始学习一些东西,而不是案例在这里。 注释掉所有丢失的图层,并仅在过度拟合的情况下才将它们放回模型中。
最后,您应该从默认的Adam设置开始,该默认设置通常(据报道)开箱即用,即:
optimizer=Adam()
当然,您应该考虑运行模型超过epochs=3
。