Intrusion-Detection-CIC-IDS2017
项目概述
这份文件是一个关于入侵检测系统(Intrusion Detection System, IDS)的研究项目,使用了CIC-IDS2017数据集来开发和评估不同的机器学习模型。其主要目标是通过分析网络流量数据,检测并分类网络中的正常流量和异常流量(如各种网络攻击)。
数据集与扫描技术
数据集来源
使用的是CIC-IDS2017数据集,包含超过280万条网络流量记录,涵盖正常流量和7种攻击场景(如暴力破解、DDoS攻击、Web攻击等)。数据集高度不平衡,正常流量占多数。数据预处理
数据清洗:去重、处理缺失值和无穷值(用中位数填充)。
数据降维:使用PCA(主成分分析)减少特征维度,同时保留大部分信息。
数据平衡:通过SMOTE技术对少数类别进行过采样,创建平衡的数据集用于模型训练。
数据预处理总结
在本次入侵检测系统项目中,数据预处理是整个分析流程的基础,其目的是将原始数据集转换为适合机器学习模型训练的格式。数据预处理的步骤包括数据清洗、处理缺失值、去除重复值、处理无穷值、数据降维、数据标准化和平衡数据集。以下是详细的技术和功能介绍:
1. 数据清洗
数据清洗是数据预处理的第一步,目的是去除数据中的噪声和错误,确保数据的质量。
去除重复值
数据集中存在大量重复的网络流量记录(共308,381条重复记录)。这些重复值可能会引入偏差,影响模型的训练效果。因此,我们使用了drop_duplicates()
方法删除了所有重复的行,确保每条记录都是唯一的。处理无穷值
数据中的某些特征(如“Flow Bytes/s”和“Flow Packets/s”)存在无穷值(inf
)。这些无穷值可能是由于数据采集或记录过程中的异常导致的。我们首先将这些无穷值替换为NaN
(非数字值),然后统一处理缺失值。处理缺失值
数据集中存在少量缺失值(约0.06%)。对于“Flow Bytes/s”和“Flow Packets/s”这两个特征,我们选择用中位数填充缺失值。中位数是一种稳健的统计量,不会受到极端值的影响,因此比均值更适合用于填充缺失值。通过这种方式,我们既保留了数据的完整性,又避免了引入新的偏差。
# 去除重复值
data.drop_duplicates(inplace=True)
# 检查无穷值并替换为NaN
data.replace([np.inf, -np.inf], np.nan, inplace=True)
# 填充缺失值(使用中位数)
median_values = data.median()
data.fillna(median_values, inplace=True)
2. 数据降维
数据降维的目的是减少特征的数量,从而降低模型的复杂度,提高训练效率,同时避免过拟合-。
主成分分析(PCA)
由于数据集包含78个特征,直接训练模型可能会面临高维度带来的挑战。我们使用了PCA技术,将原始特征转换为一组不相关的主成分。PCA通过保留数据的主要方差,能够在减少特征数量的同时保留大部分信息。在实现过程中,我们首先对数据进行了标准化处理(使用StandardScaler
),然后应用了IncrementalPCA
,这是一种适合大规模数据集的PCA变体。最终,我们将特征数量减少到原特征数量的一半,同时保留了约95%的信息。
3. 数据标准化
数据标准化是将不同特征的数值范围调整到相同的尺度,以便模型能够更有效地学习。
StandardScaler
在应用PCA之前,我们使用了StandardScaler
对数据进行标准化处理。StandardScaler
将每个特征的均值调整为0,标准差调整为1。这种标准化方法使得不同特征的数值范围一致,避免了某些特征在梯度下降过程中占据主导地位,从而提高了模型的收敛速度和性能。
4. 平衡数据集
数据集的高度不平衡(正常流量占多数,攻击流量占少数)可能导致模型偏向多数类,从而降低对少数类的检测能力。为了克服这一问题,我们使用了过采样技术。
SMOTE(Synthetic Minority Over-sampling Technique)
SMOTE是一种常用的过采样方法,通过在少数类样本之间插入新的合成样本来增加少数类的数量。在实现过程中,我们首先从少数类中随机选择样本,然后通过插值生成新的合成样本,直到少数类的数量与多数类相当。通过这种方式,我们创建了一个平衡的数据集,使得模型能够更公平地学习不同类别的特征。
5. 数据类型优化
为了提高数据处理的效率并减少内存占用,我们对数据类型进行了优化。
数据类型转换
在数据集中,某些特征的数值范围较小,但默认使用了较大的数据类型(如float64
或int64
)。我们通过分析每个特征的最小值和最大值,将其转换为更小的数据类型(如float32
或int32
)。这一过程称为“降采样”。通过这种方式,我们将数据集的内存占用减少了约47.5%,从而避免了因数据量过大导致的内存崩溃问题。
6. 特征选择
在数据预处理的最后阶段,我们对特征进行了进一步筛选,去除了那些对模型训练没有帮助的特征。
去除单一值特征
数据集中存在一些特征在整个数据集中只有一个唯一值。这些特征的方差为零,对模型的训练没有任何帮助。因此,我们通过计算每个特征的唯一值数量,删除了那些唯一值数量为1的特征。这一过程显著减少了特征的数量,同时提高了模型的训练效率。
总结
通过上述数据预处理步骤,我们成功地将原始数据集转换为适合机器学习模型训练的格式。具体来说,我们:
清洗数据:去除了重复值、处理了无穷值和缺失值,确保数据的质量。
降维:通过PCA减少了特征数量,同时保留了大部分信息。
标准化:通过
StandardScaler
调整了特征的数值范围,提高了模型的训练效率。平衡数据集:通过SMOTE技术解决了数据不平衡问题,提高了模型对少数类的检测能力。
优化数据类型:通过降采样减少了内存占用,避免了因数据量过大导致的内存问题。
特征选择:删除了单一值特征,进一步减少了特征数量,提高了模型的训练效率。
这些数据预处理步骤为后续的模型训练和评估奠定了坚实的基础,确保了整个项目能够顺利进行。
实现的功能
数据探索与可视化
绘制特征的相关性矩阵、分布图、箱线图等,分析特征之间的关系和数据分布。
识别并处理数据中的异常值(如离群点)。
机器学习模型开发
二分类模型:使用Logistic Regression和Support Vector Machine(SVM)区分正常流量和异常流量。
多分类模型:使用Random Forest、Decision Tree和K Nearest Neighbors(KNN)识别具体的攻击类型。
模型评估
使用准确率、召回率、F1分数等指标评估模型性能。
绘制混淆矩阵、ROC曲线和Precision-Recall曲线,比较不同模型的表现。
学习要点
数据处理技巧
学习如何处理大规模数据集,包括去重、填充缺失值、降维等。
理解数据不平衡问题的处理方法(如SMOTE)。
机器学习模型应用
掌握Logistic Regression、SVM、Random Forest、Decision Tree和KNN等常见算法的应用场景和调参方法。
学习如何通过交叉验证评估模型性能,避免过拟合。
数据分析与可视化
学习使用Python的Seaborn、Matplotlib等库进行数据可视化。
理解特征相关性分析和离群点检测的重要性。
模型比较与选择
学习如何根据模型的性能指标选择最适合的模型。
探索不同模型在二分类和多分类任务中的表现差异。
未来工作
模型优化:进一步调整模型参数,尝试更复杂的特征工程。
集成学习:结合KNN和Random Forest等模型,通过集成学习方法提高检测系统的准确性和鲁棒性。
实时检测:探索如何将模型应用于实时网络流量检测,提高系统的实用性。
总结
这个项目展示了如何从数据预处理到模型开发和评估的完整流程,为入侵检测系统的研究提供了实用的参考。通过这个项目,我们可以学习到数据分析、机器学习模型应用和性能评估等多个方面的知识,为未来的研究和实践打下坚实基础。