网络入侵检测算法实现改进 数据集有nsl kdd kddcup99 cicddos2017 算法可机器学习的诸多算法,支持向量机,随机森林,决策树还有集成学习,有各种评价指标和混淆矩阵

数据这玩意儿得先洗干净才能下锅炒菜。咱们拿NSL-KDD开刀,这数据集虽然有点年头了,但拿来练手正好。用pandas打开文件时可能会遇到字段名丢失的坑,记得手动补上41个特征列名,最后一个标上label标签。类别型特征protocol_type这种必须得用独热编码伺候,不然模型会直接懵圈。

from sklearn.preprocessing import OneHotEncoder
protocol_encoder = OneHotEncoder(sparse=False)
service_encoder = OneHotEncoder(handle_unknown='ignore')

X_train[['protocol_type']] = protocol_encoder.fit_transform(X_train[['protocol_type']])
X_test[['protocol_type']] = protocol_encoder.transform(X_test[['protocol_type']])

随机森林是个不错的开局选择,天生抗噪能力强。注意样本不均衡问题,CICDDoS2017里DDoS攻击样本可能占七成以上。这时候class_weight='balanced'参数能救命,相当于给少数类加buff。特征重要性排个序,说不定能发现duration时间字段在DDoS检测中毛用没有,直接可以踢出特征集。

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=150, 
                           class_weight='balanced',
                           max_depth=12)
rf.fit(X_train, y_train)

支持向量机玩核技巧要小心,遇到百万级数据直接跪。用线性核配SGD优化才是实战姿势,记得把数据标准化,不然不同量纲的特征会让距离计算翻车。KDDCup99里的land攻击样本少得可怜,这时候SVM的决策边界调整就像走钢丝,gamma参数调大0.01都可能让F1值崩盘。

网络入侵检测算法实现改进 数据集有nsl kdd kddcup99 cicddos2017 算法可机器学习的诸多算法,支持向量机,随机森林,决策树还有集成学习,有各种评价指标和混淆矩阵

混淆矩阵别光看准确率这个渣男指标,DDoS检测真正要看的是召回率。用seaborn画个热力图,正常流量误报成攻击的格子要是泛红,赶紧回去调整阈值。集成学习搞投票机制时,决策树和KNN这类差异性大的模型组合效果更佳,比全用树模型全家桶强。

from sklearn.metrics import confusion_matrix
import seaborn as sns

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues')

最后祭出Stacking大杀器,用随机森林和XGBoost当基模型,逻辑回归做元模型。注意level-1的特征要包含原始数据,别只用基模型的预测概率,这样元模型才有更多信息量。在CICDDoS2017上这么玩,检测率能比单模型提升至少5个百分点,代价是训练时间多喝两杯咖啡的功夫。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐