论文复现1

前言

复现论文,初步了解机器学习,以及一些常见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%。

实验流程

  1. 首先是数据处理

    • 读取csv文件中的数据

    • 为了让模型能够更好地进行拟合(模型容易处理数字型数据),将数据的分类特征转化为二进制表示特征。处理方式是将分类特征先转为数字,然后再用0,1来表示这些数字。

    • 最后用生成的84个属性来替换一开始用文字表示的3个属性字段。(flag,protocol_type,service)

      1
      2
      3
      4
      df_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
      5
      print(newdf.shape)
      print(newdf_test.shape)

      (125973, 123)
      (22544, 123)
  2. 特征扩展

    • 将处理好的数据分成标签和标签对应的数据两部分
    • 对应数据标准化(不是特别理解为啥要这么做)
      1
      2
      3
      X_U2R = U2R_df.drop('label',1)
      scaler4 = preprocessing.StandardScaler().fit(X_U2R)
      X_U2R.std(axis=0);
  3. 特征提取

    • 这里是这篇文章的重点,文中用了ANOVA F-test算法做特征评分,为后面特征按评分排序做准备。
    • 使用RFE挑选出需要的特征(这里不明白评分13个特征,再选13个特征有何意义)
  4. 使用classifyer训练模型

    这里我尝试了XGBClassifier和决策树,不带任何调参的XGB不仅慢而且准确率不高。

    1
    2
    clf=new xxxClassifier()
    clf.fix(labels,data)
  5. 评估
    混淆矩阵,精确度等等

    • 评估标准

      1. 准确性 Accuracy,判断成功的概率

      2. 精确性 precision,判断为真的中有多少确实是真的

      3. 召回率 recall,确实是真的部分有多少比例是确实被判断出来了

      4. F1值 F1-score 综合考虑 精确度和召回率 2precisionrecall / (precision + recall)

    • 混淆矩阵的四个角

      1. TP TN
      2. FP(假判定真),FN(真判定假)
    • k-fold cross-validation

      将数据集随机分为k份,该份为测试集,其余的部分为训练集,记录错误概率,重复该过程k次,每次采用不同的集合验证,取误差最小的那个模型

    • 结果

      1. 10 cv (决策树分类器)

        • Dos 0.99697 (+/- 0.00265)

        • Probe 0.99151 (+/- 0.00595)

        • R2L 0.97451 (+/- 0.00906)

        • U2R Accuracy: 0.99622 (+/- 0.00378)

      2. 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),然后再对特征进行处理,可以进行选择,挑选出比较重要的特征,然后再选择一个比较合适的分类器进行建模训练,然后就是根据结果修改参数,直到找到满意的模型。