2025 ISCC 数据安全赛题记录
2025 ISCC 数据安全赛题记录
赛题一 基于网络流量的恶意攻击检测
Prethinking
一年级上的课程选了网络系统安全,小组汇报的内容便做过这个课题。拿到数据集也发现和当时做的差不多。
于是最开始的思路便是按照之前的做法尝试,因为当时汇报要求五分钟内,所以其实做的很浅,这次也算又重新回顾了一遍。
前置技能:
- python基础。
- conda以及jupyter notebook的使用。
- pandas、sklearn、numpy等库的使用。
- pytorch使用。
Data processing
数据集是一个流量记录,不同于pcap的原始流量内容,这是从原始流量提取出40+个特征后的表格内容。
特征可以分为以下几类:
- 序列数据:
id
,仅作标识数据使用,训练的时候要注意去掉。 - 数值数据:数值型的数据,例如流量大小、传输速率和其他一些离散型标识等都在其中。
- 字符串数据:协议名称等。
- 标签数据:
attack_cat
,标识代表的是什么攻击。
- 序列数据:
显然,这些数据是不能直接使用的,需要进行预处理和清洗。
Data cleaning
主要考虑以下几个方面:
- 缺失项:可能存在缺失值,需要进行填充或删除,一般不会很多,删除就行。
- 异常项:nan, inf等数据,同上处理。
- 重复项:去重。
Data encoding
- 这部分的功能是将数据处理成能够进行机器学习的数据内容。
字符串处理:字符串不能直接给模型使用,我们需要将字符串转化为数字。一般来说有两种常见方法:
One-hot编码:将字符串转化为二进制向量,每个位置代表一种字符串。
有多少种字符串向量就有多长,所以适用于字符串种类不多的情况。
Label编码:将字符串转化为数字,每个字符串对应一个数字。
按照字符串种类从0到N给每种字符串一个编号。
看起来似乎Label编码无脑最简单,但是要注意Label编码可能会引入原本不存在的数据关系,例如模型可能会学习到编号的大小关系,而这是不存在的。
数值处理:将数据全部转换为数值后也不能直接输入给模型,因为每种数值的分布不一致,例如流量大小的范围可能是是0到1000,而传输速率的范围是0到1000000,这就会导致模型无法正确学习。
所以我们要使用归一化的方式将数据缩放到一个范围内。
- 0-1归一化:将数据缩放到0到1之间,也叫min-max归一化。
- Z-score归一化:将数据缩放到均值为0,方差为1的分布中,也叫标准归一化。
Data generation
有时候我们会将数据从原始数据变换成其他类型方便模型学习(例如题目给出的表格就是从原始流量数据到特征表格的转换)。
对于表格中的数据我们可以看成是一种序列数据,此时可以给一些序列网络模型进行训练。
除此之外,我们可以将其转换为图片数据,方便图像领域模型进行训练。
我这里尝试了两种转换方式
- 格拉姆角场(GAF)和连续小波变换(CWT)。链接[1]
不过后面发现效果不是很好而且很耗时,后续没有继续往这块走。
Methodology
- 到这里就要考虑使用什么方法来解决这个问题了,我这里尝试了以下几种方法。
传统机器学习方法:
KNN,SVM,DT,RF,XGBoost,LightGBM等都试了一遍,效果最好的是XGBoost,能达到
0.6x
的F1值。深度学习方法:
- 数据转图片+(ResNet, OneHot向量嵌入):效果一般,0.5左右。
- 序列数据+(1D CNN, LSTM):效果一般,0.5左右。
- 序列数据+(ANN):效果较差,0.4左右。
- 序列数据+(1D CNN,BiLSTM):这是目前效果比较的好的结果,0.7左右。
目前最好的结果便是1D CNN+BiLSTM,也是复现的一篇论文中的方法[2]。
训练的话主要都是用监督训练的方式,也尝试过半监督,但效果不太好,后续技巧一节再介绍这里的尝试。
Tricks
之前汇报使用的是CIC-IDS2017数据集,和这个类似,所以按照网上关于这个数据集的代码论文做了些尝试,效果都不太好。主要原因是CIC-ID2017有80+个特征,而这个数据集只有40+个特征,所以差别还是挺大的。
后续搜索才发现,这个数据集来自UNSW-NB15数据集,特征维度以及标签种类完全一致,我猜测题目是在原数据集上做了一些采样+噪声偏移得到的。
数据增强:
因为给的数据量不是很多,但是和UNSW-NB15数据集一致,我尝试使用UNSW-NB15数据训练然后测试在题目训练集数据上的效果,发现精度非常高,说明题目数据和UNSW-NB15数据集的分布一致。
所以我们可以直接将UNSW-NB15数据添加到本题的数据集,这样数据一下子就多了30w。
在此之前,我还尝试过使用SMOTE进行数据增强(自动增加小样本数据数量),但是效果不是很好。
半监督:
应对无标签数据时半监督是一种常见的方式,简单来说就是先训练一个模型,对无标签数据进行预测,然后通过置信度将一部分数据加入到有标签数据中,继续训练模型。
我试了XGBoost模型上使用半监督方法,能涨0.01左右的F1值,还可以,目前还没在最好的模型上尝试。不过这个方法可以用上。
模型融合:
我们可以把原有的一个多分类问题转化为多个分类问题,比如先训练一个模型,将数据分类成正常数据和异常数据,再训练一个模型从异常数据中分类具体分类。
这样可以更加细化模型学习的特征,算是一种手动注意力机制。
我试了后能涨0.02左右的F1值,挺好的。
学习率:
学习率动态下降,这个算是常见训练技巧,资料很多就不展开了。
特征工程:
原有数据40+,但是有些特征并不是越多越好,反而可能会影响模型精度,这也是注意力机制爆火的原因。
我最开始试了PCA的方式,效果不太好,后面发现一篇论文[3]用了卡方分布提取特征,效果还不错。
数据不平衡:
这个也算是常见技巧,例如使用FocalLoss等。
还有就是因为这是比赛题目,注意你划分了数据集的时候的验证集别浪费了,最后也加入到训练集再训练一会,或者交叉训练都是可以的,前面划分数据集是为了能够看到模型训练效果,但最后别浪费这些数据。
相关公开的代码,在Kaggle、Github以及GoogleScholar上搜索UNSW-NB15都能找到。