从机器学习解释混淆矩阵的值

时间:2020-06-11 12:44:53

标签: tensorflow machine-learning keras

我使用confusion_matrix()评估了经过训练可以检测DDoS攻击的模型。 混淆矩阵的结果与我的测试数据集类似。 我相信,如果False neg值正确检测到不是DDoS的攻击,则不应为0。

enter image description here

下面是我实现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%的正常流量信息。

1 个答案:

答案 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

相关问题