实验项目名称:入侵检测

一、实验目的

对数据集进行数据处理,使用信息增益方法来选取特征,产生训练集和测试集,并对数据进行归一化,构建模型,并对模型进行训练,得到函数的系数。构建分类器,最大化分类正确率,用准确率(Accuracy),精确率(Precision)和召回率(Recall)与F1 score来衡量分类器性能,完成入侵流量检测分类任务,区分正常访问/非正常访问的网络包记录。

二、实验设备(环境)

Python3.7

三、实验内容与步骤

  • 检测源代码,调试输出F1 score

首先将网站的二分类代码复制到编译器中,把程序所需要的第三方库下载好。包括如下图 1-1、1-2 所示。其中的 sklearn 直接下载是会报错的,需要下载 scikit-learn。

还需将标准数据集放入和代码相同的目录下。然后输出实验结果F1 score即可,如图1-3所示。

  • 把信息增益程序作为特征选择模块,再次调试程序,输出F1 score

首先将如图2-1所示代码替换为信息增益程序,让信息增益程序作为特征选择模块。

信息增益需要把X_train替换为train_data,X_test替换为test_data,传原始数据才能计算增益。

对41个增益进行排序,使用np.argsort排序函数对信息增益进行降序排序,得到对应索引,选取K个信息增益最大的特征。

选取K为2,输出的第4个特征的增益是最大的,其次是第2个特征的增益。

产生训练集和测试集:

一开始遇到了如图所示的错误,输入的特征变量和目标变量的样本数量不一致,发现是在处理信息增益时,x_test = pd.DataFrame(test_data, columns=x)这句代码中的test_data写成了train_data。

进行归一化:

归一化的作用是,不同数据或不同的评价指标的范围会有所不同,这种情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行归一化,将需要处理的数据通过某种算法限制在需要的一定范围之内。

最后将x_train, x_test的值返回到主函数中:

将主函数中原先的特征选取部分进行修改,留下y_train和y_test,其余屏蔽掉。

主函数中对Feature_select函数的调用:

建立模型并训练模型,输出F1 score:

(三)同时输出准确率(Accuracy),精确率(Precision),召回率(Recall)与F1 score

先将所需要的库加载好:

建立模型并训练模型,训练二次函数的系数,准确率(Accuracy),精确率(Precision),召回率(Recall)的相应函数的参数要准确。

四、实验结果与数据处理

任务一实验结果:

任务二实验结果:

K为5

K为20

选取的K值不同时,所得到的F1 score也不同。

任务三实验结果:

K为2

读取数据,放进tran_data和test_data里,删除有缺失值的行。

五、实验分析与总结

本次实验主要任务就是对数据进行处理。流程为:对数据集进行数据处理,使用信息增益方法来选取特征,产生训练集和测试集,并对数据进行归一化,构建模型,并对模型进行训练,得到函数的系数。构建分类器,最大化分类正确率,用准确率(Accuracy),精确率(Precision)和召回率(Recall)与F1 score来衡量分类器性能,完成入侵流量检测分类任务,区分正常访问/非正常访问的网络包记录。

遇到的一些问题有:第三方库的下载,获取信息增益的索引,降序排序,将K值传入函数中,对三个分类指标函数的使用。

由于没有接触过机器学习相关的知识,一开始会很难理解其中的原理,但是听了几遍老师的讲解之后,明白了一些,信息增益只是特征选取的一种方法,本身没有对数据进行处理,不同的特征选取方法,所用的数据是不同的,比如信息增益是要用原始数据。而对数据进行归一化是因为不同数据的范围不同,为了得到最重要的评价指标,所以要归一化,限制数据在一定范围内。