Tensorflow 从机器学习看混淆矩阵的价值
我使用confusion_matrix()来评估经过训练以检测DDoS攻击的模型。 混淆矩阵的结果与我的测试数据集如下所示。 我认为,如果False neg值正确检测到非DDoS的攻击,则该值不应为0 下面是我实现ML模型的代码。你能给我一个建议,让模型正确地检查良性攻击吗Tensorflow 从机器学习看混淆矩阵的价值,tensorflow,machine-learning,keras,Tensorflow,Machine Learning,Keras,我使用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(De
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%的正常流量信息。尽管这些问题实际上无法得到任何程度的肯定回答,但您的代码确实存在一些严重问题 首先,你应该不要规范你的标签
y_train
;这是一个二进制分类问题,标签应该精确地0/1
删除以下行:
normalized_y = preprocessing.normalize(y_train)
y_pred = preprocessing.normalize(y_pred)
将标签更改为整数(非浮点数),即:
您的模型适合:
hist = model.fit(normalized_x, y_train, epochs=3, batch_size=128)
第二次,虽然您使用标准化的x
进行训练,但随后您使用x\u训练
请求预测,这同样是错误的;你的预测应该是:
y_pred = model.predict(normalized_x)
第三,默认情况下不应使用辍学,但前提是我们有过度拟合的迹象——但要做到这一点,我们的模型首先必须能够开始学习一些东西,这里的情况并非如此注释掉所有退出层,只有在过度拟合的情况下才开始将它们放回模型中
最后,您应该从Adam的默认设置开始,这通常(而且据说)是开箱即用的,即:
optimizer=Adam()
当然,你应该考虑运行这个模型多于<代码> EPOCHS=3 < /代码> ./P>
optimizer=Adam()