CIC-IDS2017数据集训练和测试

蓝亚之舟
蓝亚之舟
蓝亚之舟
57
文章
17
评论
2021年4月19日18:30:14
评论
15,0393 1793字阅读5分58秒

1、数据集预处理

1.1 整合数据并剔除脏数据

CIC-IDS2017数据集训练和测试

如上图所示,整个数据集是分开的,想要训练,必须要整合在一起,同时在数据集中存在 Nan 和 Infiniti 脏数据(只有第 15 列和第 16 列存在)需要剔除:

CIC-IDS2017数据集训练和测试

具体代码如下:

将合并文件保存为 total.csv,省去每次训练都要重复操作的步骤

1.2 分析数据

在 panda 库中,dataframe 类型有一个很好用的函数 value_counts,可以用来统计标签数量,加载 total.csv 得到 raw_data,运行下面代码:

打印结果如下:

CIC-IDS2017数据集训练和测试

由上图可以看到,整个数据集相当不平衡,正常数据非常大,而攻击流量却相当少,可以说整个数据集是相当不平衡的,怎么解决这个问题,下一节来说一说。

1.3 平衡数据集

针对这种情况,一般而言,是要扩充小的攻击数据集,其扩充方法有很多:

  • 从数据源头采集更多数据
  • 复制原有数据并加上随机噪声
  • 重采样
  • 根据当前数据集估计数据分布参数,使用该分布产生更多数据等

上面的方法都不太好整:

  • 数据源头不用想了;
  • 复制数据加上加上随机噪声,需要对于数据本身比较理解,否则容易出现问题;
  • 重采样,因为数据量很少,想要达到平衡必须百倍扩充数据,重采样只适用于扩充量不大的情况(个人见解)
  • 根据分布产生更多数据,因为数据太少了(只有几十个),而且特征太多,估计出来的分布会十分不准确,而由此分布产生的数据则更加不准确了。

由于上述方法不好整,我只好用一个不算方法的方法去做:复制粘贴,将每个数据集扩充到 5000 条以上(其实本质上类似于重采样),具体代码如下:

再来看一下数据集的统计情况:

CIC-IDS2017数据集训练和测试

将这个数据集命名为 total_expend.csv,等使用的时候,我们仔细分析一下两个数据集对于模型训练到底有什么区别。

2、使用 sklearn 进行训练和测试

sklearn 分类算法有很多,这里以决策树为例。

2.1 数据处理

直接上代码吧:

上述大概流程可以分为:

  • 加载数据
  • 分析数据
  • 非数值型数据转换数值数据
  • 分离特征和标签
  • 数据标准化\归一化\正则化
  • 将这个数据集切分为训练集合测试集

2.2 训练和测试

在 sklearn 中,训练模型和预测模型几乎是一个模板,想要换算法,只需要将上面的算法行替换即可,也就是:

其他都可以不变,来看一下预测结果:

CIC-IDS2017数据集训练和测试

预测准确率为 99.56,算是很高了。

2.3 测试 total.csv 和 total_expend.csv 的区别

上面一节采用的数据集是 total.csv,也就是数据不平衡的数据集,但是从结果来看,其准确率很高,达到了 99.56%,然而,评价一个模型,准确率只是一个指标而已,我们来打印一下其混淆矩阵:

CIC-IDS2017数据集训练和测试

由上图可以看到,存在很多类别被误分的,但是为什么其准确率依然这么高呢?

这是因为数据不平衡,total.csv 数据集中,正常数据(也就是标签为 begin)的数据太多了,占据了几乎 99%的比例,只要它预测正确,那么整个数据集的准确率就会很高,至于其他标签的准确率哪怕再低,也不会有多大影响。

再来看看如果使用 total_expend.csv 数据集,先看准确率:

CIC-IDS2017数据集训练和测试

99.70%的准确率也很高,再看混淆矩阵打印:

CIC-IDS2017数据集训练和测试

可以看到,相比上面的,要好了很多,大部分类别都预测正确了(当然,这个也可能是因为类别标签大都重复造成的。)

绘制混淆矩阵代码:

2.4 调参

调参,就我所知有两种,一种是通过绘制学习曲线来调节某个超参数——横坐标为参数,纵坐标为准确度或者其他模型度量;另外一种是通过网格搜索交叉验证来调节多个超参数(本质是组合参数,然后循环验证)

2.4.1 绘制学习曲线调节决策树最优深度

参数那么多,如何确定最优的参数呢?针对一个参数调节的时候,可以画出学习曲线——横坐标为参数,纵坐标为准确度:

2.4.2 网格搜索寻找最优参数组合

继续阅读
蓝亚之舟

发表评论