各种模型为用于入侵检测的 KDDcup 99 数据集提供了 99% 的准确度,我是否遗漏了某种数据泄漏?

数据挖掘 机器学习 异常检测 初学者
2022-02-22 09:53:53

对这里的这一切都很陌生的学生。我目前正在使用 KDDcup 99 数据使用各种 ML 模型(和 ANN)进行入侵检测。我的问题是我经常得到 99% 的准确性。目前我主要关注二进制分类(正常与攻击)我发现了我的数据预处理方法中的问题,在修复它们之后,我对输入数据的有效性更有信心,但我仍然得到了 99%不再信任。(特别是因为我刚刚使用具有所有默认参数的 SVM 获得了 99% 的准确率)。

我的数据应该在 2 个类之间平衡,所以我假设如果机器没有学习,那么它的准确率会达到 50% 左右。我觉得我在这里的某个地方犯了一个错误,或者我只是低估了这些 ML 算法的力量?

这是我的预处理步骤:

1-从该数据中删除重复项(大约 75% 的数据集是重复项)

2-使用随机抽样通过删除“正常”事件来平衡巨大偏差的数据。(此步骤后50%正常50%攻击)

3-Drop 1 具有 0 方差的特征

4-Shuffle 数据然后拆分 70/30 训练/测试

5-One 使用 CountVectorizer 对包含字符串(ex protocol type = [icmp, tcp.udp])的训练数据中的输入特征进行热编码,或者将此数据转换为简单的整数虚拟变量。

使用 StandardScaler 对训练集中的数字连续数据列进行 6-Z-score 标准化

7-将这些训练有素的归一化/编码器方法应用于测试集

我的猜测是存在一些数据泄漏,或者其中一个特征与分类直接/几乎 1 对 1 对应。

昨晚我正在试验一些改变,看看是否有什么会降低准确性。使用 KNN,我检查了每个特征作为唯一的输入。由于数据集是平衡的,您应该期望每个单独的特征有 50% 的准确度。大多数功能在单独检查时确实得到了 50% 的分数,但其中两个脱颖而出。当唯一的输入是“标志”特征时,模型得分为 95%,而当唯一的特征是“服务”特征时,得分为 93%。这是否意味着应该删除这些数据?

我也知道这个数据集存在缺陷。也许 99% 是可能的,因为这个数据集不是实际网络流量的准确表示,而更像是一个“玩具”数据集?

编辑:我想知道该模型是否能够实际达到 99%,因为该数据本质上是有缺陷的(请参见下面的引用)。我不确定如何根据给定的特征计算 TTL,但如果模型发现它可以解释 99% 的二进制情况。就多类而言,这可能也适用于区分正常/攻击尝试,然后剩余的特征帮助模型从那里找出它是什么类型的攻击。

“2003 年,Mahoney 和 Chan 构建了一个简单的入侵检测系统,并针对 DARPA tcpdump 数据运行它。他们发现了许多违规行为,包括——由于数据的生成方式——所有恶意数据包的 TTL 为 126或 253,而几乎所有良性数据包的 TTL 为 127 或 254。”

1个回答

您的方法存在一个严重问题:在训练集和测试集之间拆分之前不应重新采样数据。模型应始终根据数据的“真实”分布进行评估。

因此,您目前获得的高性能并不真正相关,但我们仍然可以尝试诊断它。请注意,平衡数据上的高精度实际上可能是正确的。但也有可能重复数据删除没有捕捉到所有可能的重复情况(特别是难以捕捉到接近重复的情况),从而导致测试集中的数据泄漏。

某些特定功能的作用以及是否包含它们取决于任务的定义:

  • 如果它们可以“在生产中”获得,无论这对任务意味着什么,都没有理由放弃一个好的指标。
  • 如果在预期的生产环境中无法获得它们,那么包含它们显然是错误的。

换句话说,一个特性不应该被丢弃,因为它是一个很好的指标。但是,如果它对模型使用场景没有意义,则应将其删除。

此外,使用重采样也不是一个好主意,围绕 DSSE 有各种问题,但这不是这里的主题。