前言
复现论文,初步了解机器学习,以及一些常见Python包的用法。
NSL-KDD数据集介绍
NSL-KDD是一个网络流量数据集,经常用于IDS(入侵检测系统)模型的训练。
NSL-KDD主要有以下几个子集:KDDTest+, KDDTest-21, KDDTrain+, KDDTrain+_20Percent, KDDTest-21 和 KDDTrain+_20Percent。
其中KDDTrain+和KDDTest+是完整的数据集,而KDDTest-21是去除score 21数据的测试数据集。
NSL-KDD中的数据总共包括了43个特征,其中41个和流量数据本身有关,剩下的两个一个是标签,标记流量类型(普通或者攻击),还有评分。
NSL-KDD数据中的攻击类型总共有4类,Dos(拒绝服务),Probe(探针),U2R(普通用户越权行为),R2L(远程请求本地)。其中以Dos攻击的流量居多,而U2R和R2L非常少。
详细的特征描述可以参考这篇文章:
https://docs.google.com/spreadsheets/d/1oAx320Vo9Z6HrBrL6BcfLH6sh2zIk9EKCv2OlaMGmwY/edit?usp=sharing
论文复现
论文介绍
A Subset Feature Elimination Mechanism for Intrusion Detection System
这是一篇实验性质的文章,文章最大的贡献是改进了训练算法采用了RFE来减少不重要的特征,通过以NSL-KDD数据集为样本的训练,最后将恶意流量识别的准确率从98%提高到了99%。
实验流程
首先是数据处理
读取csv文件中的数据
为了让模型能够更好地进行拟合(模型容易处理数字型数据),将数据的分类特征转化为二进制表示特征。处理方式是将分类特征先转为数字,然后再用0,1来表示这些数字。
最后用生成的84个属性来替换一开始用文字表示的3个属性字段。(flag,protocol_type,service)
1
2
3
4df_categorical_values_enc=df_categorical_values.apply(LabelEncoder().fit_transform)
enc = OneHotEncoder()
df_categorical_values_encenc = enc.fit_transform(df_categorical_values_enc)1
2
3
4
5print(newdf.shape)
print(newdf_test.shape)
(125973, 123)
(22544, 123)
特征扩展
- 将处理好的数据分成标签和标签对应的数据两部分
- 对应数据标准化(不是特别理解为啥要这么做)
1
2
3X_U2R = U2R_df.drop('label',1)
scaler4 = preprocessing.StandardScaler().fit(X_U2R)
X_U2R.std(axis=0);
特征提取
- 这里是这篇文章的重点,文中用了ANOVA F-test算法做特征评分,为后面特征按评分排序做准备。
- 使用RFE挑选出需要的特征(这里不明白评分13个特征,再选13个特征有何意义)
使用classifyer训练模型
这里我尝试了XGBClassifier和决策树,不带任何调参的XGB不仅慢而且准确率不高。
1
2clf=new xxxClassifier()
clf.fix(labels,data)评估
混淆矩阵,精确度等等评估标准
准确性 Accuracy,判断成功的概率
精确性 precision,判断为真的中有多少确实是真的
召回率 recall,确实是真的部分有多少比例是确实被判断出来了
F1值 F1-score 综合考虑 精确度和召回率 2precisionrecall / (precision + recall)
混淆矩阵的四个角
- TP TN
- FP(假判定真),FN(真判定假)
k-fold cross-validation
将数据集随机分为k份,该份为测试集,其余的部分为训练集,记录错误概率,重复该过程k次,每次采用不同的集合验证,取误差最小的那个模型
结果
10 cv (决策树分类器)
Dos 0.99697 (+/- 0.00265)
Probe 0.99151 (+/- 0.00595)
R2L 0.97451 (+/- 0.00906)
U2R Accuracy: 0.99622 (+/- 0.00378)
10 cv(xboost分类器)
Dos 0.99563 (+/- 0.00404)
Probe 0.98978 (+/- 0.00644)
L2U 0.97237 (+/- 0.01112)
U2R 0.99611 (+/- 0.00271)
总结
总得来说这篇文章做得比较急,而且之前完全没有了解过机器学习,还是有很多要改进的地方,比如可以试试多个classifier,试试集成学习,自己尝试修改参数等等。
感觉下来做这样一个实验主要是这样一个流程:首先将数据处理成模型容易跑的格式,(one-Hot encode),然后再对特征进行处理,可以进行选择,挑选出比较重要的特征,然后再选择一个比较合适的分类器进行建模训练,然后就是根据结果修改参数,直到找到满意的模型。