GSmote+AE+DNN(UNSW-NB15)
前言
对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) |


