前言

UNSW-NB15数据集进行最终的实验,如果效果还可以的话就把该实验结果作为最终的实验结果使用。前面的CIC-IDS2017数据集已经能达到最终实验结果的要求了,现在就只差UNSW-NB15了,等做完这个实验如果能产出好结果,就直接开始写论文,争取在今年寒假放假之前完成论文初稿。

实验结果

无attack_cat列

去掉attack_cat列的实验结果如下

实验参数 评估指标 混淆矩阵
AE+DNN
基准模型
阈值0.5
准确率: 0.8388
精确率: 0.7772
召回率: 0.9913
F1 分数: 0.8713
误报率 (FAR): 0.3481
[[24121 12879]
[ 395 44937]]
同上,重复实验 准确率: 0.8550
精确率: 0.8030
召回率: 0.9762
F1 分数: 0.8812
误报率 (FAR): 0.2934
[[26144 10856]
[ 1081 44251]]
同上,重复实验 准确率: 0.8374
精确率: 0.7764
召回率: 0.9897
F1 分数: 0.8702
误报率 (FAR): 0.3491
[[24083 12917]
[ 468 44864]]
阈值改为0.9,其他不变 准确率: 0.9088
精确率: 0.9644
召回率: 0.8664
F1 分数: 0.9128
误报率 (FAR): 0.0392
[[35550 1450]
[ 6058 39274]]
同上,重复实验 准确率: 0.8967
精确率: 0.9831
召回率: 0.8265
F1 分数: 0.8980
误报率 (FAR): 0.0175
[[36354 646]
[ 7863 37469]]
同上,重复实验 准确率: 0.9024
精确率: 0.9858
召回率: 0.8348
F1 分数: 0.9040
误报率 (FAR): 0.0148
[[36453 547]
[ 7487 37845]]
阈值改为0.7,其他不变 准确率: 0.9049
精确率: 0.9099
召回率: 0.9183
F1 分数: 0.9141
误报率 (FAR): 0.1114
[[32877 4123]
[ 3704 41628]]
同上,重复实验 准确率: 0.9046
精确率: 0.9032
召回率: 0.9261
F1 分数: 0.9145
误报率 (FAR): 0.1216
[[32501 4499]
[ 3352 41980]]
同上,重复实验 准确率: 0.9008
精确率: 0.9011
召回率: 0.9209
F1 分数: 0.9109
误报率 (FAR): 0.1239
[[32417 4583]
[ 3584 41748]]
阈值改为0.8,其他不变 准确率: 0.8951
精确率: 0.8777
召回率: 0.9406
F1 分数: 0.9081
误报率 (FAR): 0.1606
[[31058 5942]
[ 2693 42639]]
同上,重复实验 准确率: 0.8984
精确率: 0.9056
召回率: 0.9104
F1 分数: 0.9080
误报率 (FAR): 0.1163
[[32697 4303]
[ 4062 41270]]
同上,重复实验 准确率: 0.8995
精确率: 0.8899
召回率: 0.9328
F1 分数: 0.9108
误报率 (FAR): 0.1414
[[31770 5230]
[ 3048 42284]]
阈值改为0.6 准确率: 0.8877
精确率: 0.8648
召回率: 0.9436
F1 分数: 0.9025
误报率 (FAR): 0.1808
[[30310 6690]
[ 2557 42775]]
同行,重复实验 准确率: 0.8943
精确率: 0.8840
召回率: 0.9302
F1 分数: 0.9065
误报率 (FAR): 0.1496
[[31464 5536]
[ 3163 42169]]
同上,重复实验 准确率: 0.8864
精确率: 0.8570
召回率: 0.9526
F1 分数: 0.9023
误报率 (FAR): 0.1948
[[29793 7207]
[ 2147 43185]]
阈值改为0.5,训练150轮 准确率: 0.8587
精确率: 0.8148
召回率: 0.9620
F1 分数: 0.8823
误报率 (FAR): 0.2679
混淆矩阵:
[[27089 9911]
[ 1721 43611]]
阈值0.5,训练200轮 准确率: 0.8526
精确率: 0.8035
召回率: 0.9693
F1 分数: 0.8787
误报率 (FAR): 0.2905
[[26253 10747]
[ 1390 43942]]

无attack_cat列实验结果总结

如果删掉数据集中的attack_cat列,最终的实验结果如上表所示,阈值从0.5~0.9都打不到很好的效果,准确率最好的也就是阈值0.9的90.88%,F1-Score只有91%,远远达不到其他论文动不动就是95%以上的评估指标,但是如果不去掉attack_cat列的话,所有评估指标都是99.90%以上的,接近100%了,四个指标都是99.99%实在是太夸张了,参考的论文最终结果也只是99%出头,如何降低添加上attack_cat列的指标是一个问题,要降低一个百分点,在98%~99%的范围

参考论文实验结果

保留attack_cat列

保留attack_cat列的实验结果如下

实验参数 评估参数 混淆矩阵
AE训练100轮,
batch_size=128
AE输出维度为15
DNN训练200轮
batch_size=128
阈值为0.5
准确率: 0.9996
精确率: 0.9998
召回率: 0.9996
F1 分数: 0.9997
误报率 (FAR): 0.0003
[[36989 11]
[ 19 45313]]
重复试验,把DNN轮次改为30 准确率: 0.9994
精确率: 0.9996
召回率: 0.9994
F1 分数: 0.9995
误报率 (FAR): 0.0005
[[36980 20]
[ 29 45303]]
同上,重复试验 准确率: 0.9995
精确率: 0.9994
召回率: 0.9997
F1 分数: 0.9996
误报率 (FAR): 0.0007
[[36974 26]
[ 12 45320]]
修改attack_cat列对应的标签顺序
把normal->worms:0 –> 9
改成normal->worms:9 –> 0
准确率: 0.9963
精确率: 0.9977
召回率: 0.9955
F1 分数: 0.9966
误报率 (FAR): 0.0028
[[36898 102]
[ 205 45127]]
改一下batch_size=256,
其他同上
准确率: 0.9966
精确率: 0.9978
召回率: 0.9961
F1 分数: 0.9969
误报率 (FAR): 0.0027
[[36899 101]
[ 176 45156]]
改一下batch_size=512,
其他同上
准确率: 0.9948
精确率: 0.9919
召回率: 0.9988
F1 分数: 0.9953
误报率 (FAR): 0.0100
[[36630 370]
[ 56 45276]]
改一下batch_size=1024,
其他同上
准确率: 0.9958
精确率: 0.9949
召回率: 0.9974
F1 分数: 0.9962
误报率 (FAR): 0.0062
[[36770 230]
[ 119 45213]]
重复上面实验 准确率: 0.9955
精确率: 0.9956
召回率: 0.9962
F1 分数: 0.9959
误报率 (FAR): 0.0054
[[36799 201]
[ 170 45162]]
改一下batch_size=2048,
其他同上
准确率: 0.9955
精确率: 0.9954
召回率: 0.9965
F1 分数: 0.9959
误报率 (FAR): 0.0056
[[36791 209]
[ 159 45173]]
同上,重复实验 准确率: 0.9951
精确率: 0.9947
召回率: 0.9963
F1 分数: 0.9955
误报率 (FAR): 0.0065
[[36760 240]
[ 166 45166]]
训练200轮,其余同上 准确率: 0.9975
精确率: 0.9988
召回率: 0.9967
F1 分数: 0.9977
误报率 (FAR): 0.0015
[[36944 56]
[ 149 45183]]
训练50轮,其余同上,atch_size=2048 准确率: 0.9962
精确率: 0.9977
召回率: 0.9954
F1 分数: 0.9966
误报率 (FAR): 0.0028
[[36897 103]
[ 209 45123]]
DNN训练5轮,atch_size=2048,其余同上 准确率: 0.9885
精确率: 0.9836
召回率: 0.9958
F1 分数: 0.9896
误报率 (FAR): 0.0204
[[36245 755]
[ 190 45142]]
同上,重复实验 准确率: 0.9861
精确率: 0.9780
召回率: 0.9973
F1 分数: 0.9875
误报率 (FAR): 0.0275
[[35981 1019]
[ 123 45209]]
同上,重复试验,5轮,2048=batch_size 准确率: 0.9882
精确率: 0.9832
召回率: 0.9956
F1 分数: 0.9894
误报率 (FAR): 0.0208
[[36230 770]
[ 200 45132]]
训练30轮
epochs=30, batch_size=2048
这个结果就很不错
准确率: 0.9924
精确率: 0.9880
召回率: 0.9983
F1 分数: 0.9931
误报率 (FAR): 0.0149
[[36450 550]
[ 75 45257]]
同上,重复实验 准确率: 0.9925
精确率: 0.9881
召回率: 0.9985
F1 分数: 0.9933
误报率 (FAR): 0.0148
[[36454 546]
[ 69 45263]]
同上,重复试验 准确率: 0.9925
精确率: 0.9881
召回率: 0.9985
F1 分数: 0.9933
误报率 (FAR): 0.0148
[[36454 546]
[ 69 45263]]
同上
这个结果也挺均衡,假阴性和假阳性都是
200多
准确率: 0.9943
精确率: 0.9950
召回率: 0.9947
F1 分数: 0.9948
误报率 (FAR): 0.0062
[[36772 228]
[ 239 45093]]

AE+DNN保留attack_cat列实验结果总结

降低评估指标,可以尝试以下几种方法:

  • 提高DNN模型的batch_size,之前的参数很小,都是128,256之类的,直接感到2048之类的特大值,可以降低1%的评估指标
  • 降低DNN模型的训练轮次epochs,之前99%都是用的20~30轮,降到5~10轮也能降低一些评估指标
  • 调整attack_cat列的字符值与数值之间的映射关系,原本是把Normal映射为0,其他类似按样本数量从大到小进行排列分从对应数字1~9,那个时候各种指标都是99.9%以上,但是现在Normal类型不对应0,对应其他数字,也能稍微降低一些评估指标

GSmote+AE+DNN

现在在AE+DNN的模型上加上GSmote,实验结果如下表所示

保留attack_cat列,实验结果如下:

实验参数 评估参数 混淆矩阵
AE结构不变,
输出维度为15
DNN4层,阈值0.5
训练20次,
batch_size=128
准确率 (Accuracy): 0.9389
精确率 (Precision): 0.9016
召回率 (Recall): 0.9979
误报率 (False Alarm Rate): 0.1334
[[32065 4935]
[ 95 45237]]
同上,重复实验 准确率 (Accuracy): 0.8999
精确率 (Precision): 0.8472
召回率 (Recall): 0.9983
误报率 (False Alarm Rate): 0.2206
[[28837 8163]
[ 79 45253]]
同上,重复实验 准确率 (Accuracy): 0.9721
精确率 (Precision): 0.9594
召回率 (Recall): 0.9912
误报率 (False Alarm Rate): 0.0513
[[35101 1899]
[ 400 44932]]
同上,重复实验
还是看概率,
结果时好时坏
准确率 (Accuracy): 0.9670
精确率 (Precision): 0.9457
召回率 (Recall): 0.9973
误报率 (False Alarm Rate): 0.0702
[[34402 2598]
[ 123 45209]]
去掉attack_cat列 准确率 (Accuracy): 0.8571
精确率 (Precision): 0.8031
召回率 (Recall): 0.9811
误报率 (False Alarm Rate): 0.2948
[[26094 10906]
[ 857 44475]]
同上,重复实验 准确率 (Accuracy): 0.8420
精确率 (Precision): 0.7818
召回率 (Recall): 0.9892
误报率 (False Alarm Rate): 0.3382
[[24485 12515]
[ 490 44842]]
AE输出维度为40
DNN训练50轮
DNN四层结构
batch_size为128
准确率 (Accuracy): 0.9887
精确率 (Precision): 0.9887
召回率 (Recall): 0.9908
F1 值 (F1-score): 0.9897
误报率: 0.0139
[[36486 514]
[ 419 44913]]
同上,重复实验 准确率 (Accuracy): 0.9763
精确率 (Precision): 0.9620
召回率 (Recall): 0.9964
F1 值 (F1-score): 0.9789
误报率 : 0.0483
[[35214 1786]
[ 165 45167]]
同上,重复实验 准确率 (Accuracy): 0.9734
精确率 (Precision): 0.9559
召回率 (Recall): 0.9977
F1 值 (F1-score): 0.9763
误报率 (False Alarm Rate): 0.0564
[[34913 2087]
[ 105 45227]]
DNN训练100轮
其他不变
准确率 (Accuracy): 0.9856
精确率 (Precision): 0.9886
召回率 (Recall): 0.9852
F1 值 (F1-score): 0.9869
误报率 (False Alarm Rate): 0.0139
[[36484 516]
[ 669 44663]]
同上 准确率 (Accuracy): 0.9864
精确率 (Precision): 0.9778
召回率 (Recall): 0.9980
F1 值 (F1-score): 0.9878
误报率 (False Alarm Rate): 0.0278
[[35971 1029]
[ 92 45240]]
同上,
始终不能突破到99%
准确率 (Accuracy): 0.9819
精确率 (Precision): 0.9919
召回率 (Recall): 0.9751
F1 值 (F1-score): 0.9834
误报率 (False Alarm Rate): 0.0098
[[36639 361]
[ 1131 44201]]
同上,重复实验 准确率 (Accuracy): 0.9657
精确率 (Precision): 0.9476
召回率 (Recall): 0.9927
F1 值 (F1-score): 0.9696
误报率 (False Alarm Rate): 0.0673
[[34510 2490]
[ 331 45001]]
AE输出维度=30
DNN训练30轮
准确率 (Accuracy): 0.9962
精确率 (Precision): 0.9963
召回率 (Recall): 0.9968
F1 值 (F1-score): 0.9965
误报率 (False Alarm Rate): 0.0046
[[36831 169]
[ 146 45186]]
同上,重复实验 准确率 (Accuracy): 0.9859
精确率 (Precision): 0.9766
召回率 (Recall): 0.9982
F1 值 (F1-score): 0.9873
误报率 (False Alarm Rate): 0.0292
[[35918 1082]
[ 80 45252]]
同上,重复实验 准确率 (Accuracy): 0.9961
精确率 (Precision): 0.9982
召回率 (Recall): 0.9947
F1 值 (F1-score): 0.9964
误报率 (False Alarm Rate): 0.0022
[[36917 83]
[ 241 45091]]
AE输出维度为45,已保存模型 准确率 (Accuracy): 0.9902
精确率 (Precision): 0.9901
召回率 (Recall): 0.9922
F1 值 (F1-score): 0.9912
误报率 (False Alarm Rate): 0.0121
[[36551 449]
[ 354 44978]]
同上,重复实验 准确率 (Accuracy): 0.9916
精确率 (Precision): 0.9885
召回率 (Recall): 0.9964
F1 值 (F1-score): 0.9924
误报率 (False Alarm Rate): 0.0142
[[36476 524]
[ 165 45167]]
AE输出25,训练50轮
DNN训练50轮
阈值0.8
准确率 (Accuracy): 0.9845
精确率 (Precision): 0.9836
召回率 (Recall): 0.9884
F1 值 (F1-score): 0.9860
误报率 (False Alarm Rate): 0.0202
[[36251 749]
[ 524 44808]]

GSmote+AE+DNN实验结果总结

如果保留attack_cat列,实验结果还是不错的,上述实验中评估指标只有96%左右,后续可以通过优化AE模型或者优化DNN模型来提高评估指标;如果去掉了attack_cat列,那评估指标的结果就比较惨淡了,只有85%左右,远远达不到文章要求,所以最终还是决定保留attack_cat列,虽然这样做不太正确,但是不要让结果影响论文~

GSmote平衡训练集注意事项

之前在CIC-IDS2017中使用GSmote时,因为这个数据集的最后一列是字符型的数据,全是记载着各种攻击类型,例如[‘BENIGN’、’DoS Hulk’、’PortScan’、’DDoS’、’FTP-Patator’ ……],这就是这个数据集的标签。在平衡完数据集之后有一个map_labels步骤,就是把BENIGN转化为0,其他所有攻击类型转化为1,再把原来字符型的标签列全部用0和1替换掉原来的内容,最后面才进行DNN训练和分类。

在UNSW-NB15数据集中,attack_cat 列记载样本属于哪种攻击类型,label列才是真正的标签列,该列只包含0和1。而我需要根据attack_cat 列来生成特定类型的攻击样本数据,这时候直接套用之前的GSmote平衡步骤就会出错,因为GSmote中要求y_resampled是真正的标签,但在UNSW中attack_cat 不是标签列,而是副标签,所以有点麻烦。

1
X_resampled, y_resampled = gsmote.fit_resample(X, Y)