基于机器学习的网络流量异常检测平台
基于机器学习的网络流量异常检测平台
目录
项目概述
项目简介
本项目是一个基于机器学习的网络流量异常检测平台,旨在通过分析网络流量的统计特征,自动识别并分类多种网络攻击行为。系统采用随机森林(Random Forest)算法,能够实时、准确地识别15种不同类型的网络流量,包括正常流量和14种恶意攻击流量。
核心功能
- 实时流量检测:支持单条流量的实时检测和分析
- 批量文件检测:支持CSV格式的批量流量文件检测
- 实时监控模拟:模拟真实网络环境下的流量监控与自动阻断
- 数据分析:提供探索性数据分析(EDA)功能
- 模型管理:展示模型性能指标和特征重要性
技术特点
- 高准确率:基于随机森林算法,识别准确率 > 99.96%
- 实时性:毫秒级推理响应
- 多维度分析:基于20个关键流量特征进行综合研判
- 用户友好:基于Streamlit的现代化Web界面
数据集介绍
数据集来源
本项目使用 CIC-IDS-2017 数据集,这是由加拿大网络安全研究所(Canadian Institute for Cybersecurity)发布的网络入侵检测数据集。该数据集包含了真实网络环境下的正常流量和多种攻击流量,是网络安全研究领域的标准数据集。
数据集组成
数据集包含8个CSV文件,总计约283万条流量记录,每条记录包含79个特征:
-
Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv
- 包含DDoS攻击流量
- 用于训练模型识别分布式拒绝服务攻击
-
Friday-WorkingHours-Afternoon-PortScan.pcap_ISCX.csv
- 包含端口扫描攻击流量
- 用于训练模型识别端口扫描行为
-
Friday-WorkingHours-Morning.pcap_ISCX.csv
- 包含正常工作日早晨的混合流量
-
Monday-WorkingHours.pcap_ISCX.csv
- 包含周一工作日的正常和异常流量
-
Thursday-WorkingHours-Afternoon-Infilteration.pcap_ISCX.csv
- 包含渗透攻击流量
- 用于训练模型识别网络渗透行为
-
Thursday-WorkingHours-Morning-WebAttacks.pcap_ISCX.csv
- 包含Web攻击流量(Brute Force、XSS、SQL Injection)
- 用于训练模型识别Web应用攻击
-
Tuesday-WorkingHours.pcap_ISCX.csv
- 包含周二工作日的混合流量
-
Wednesday-workingHours.pcap_ICSX.csv
- 包含周三工作日的混合流量
数据统计
- 总记录数:2,830,743 条
- 特征维度:79 个特征
- 类别数量:15 种(1种正常 + 14种攻击)
标签分布
| 标签类别 | 数量 | 占比 |
|---|---|---|
| BENIGN (正常) | 2,271,320 | 80.3% |
| DoS Hulk | 230,124 | 8.1% |
| PortScan | 158,804 | 5.6% |
| DDoS | 128,025 | 4.5% |
| DoS GoldenEye | 10,293 | 0.4% |
| FTP-Patator | 7,935 | 0.3% |
| SSH-Patator | 5,897 | 0.2% |
| DoS slowloris | 5,796 | 0.2% |
| DoS Slowhttptest | 5,499 | 0.2% |
| Bot | 1,956 | 0.1% |
| Web Attack - Brute Force | 1,507 | 0.05% |
| Web Attack - XSS | 652 | 0.02% |
| Infiltration | 36 | <0.01% |
| Web Attack - Sql Injection | 21 | <0.01% |
| Heartbleed | 11 | <0.01% |
数据特征说明
数据集包含以下类型的特征:
-
基础流特征
- 源IP、目标IP、源端口、目标端口
- 协议类型(TCP、UDP等)
- 流持续时间
-
数据包统计特征
- 前向/后向数据包数量
- 数据包长度统计(均值、标准差、最大值、最小值)
- 数据包到达时间间隔(IAT)
-
字节统计特征
- 前向/后向字节总数
- 子流字节统计
- 数据包大小分布
-
时间特征
- 流持续时间
- 数据包间隔时间
- 流活跃时间
-
标志位特征
- TCP标志位统计
- 连接状态信息
算法原理与实现
整体流程

图1:多模型训练流程图
该图展示了从数据预处理到模型训练的完整流程:
- 数据加载:从多个CSV文件加载数据并合并
- 数据清洗:处理缺失值和异常值
- 特征选择:基于随机森林的特征重要性评估
- 模型训练:训练多个模型(逻辑回归、决策树、随机森林)
- 模型评估:使用多种指标评估模型性能
- 模型保存:保存最佳模型和特征列表
1. 数据预处理
1.1 数据加载
# 从指定目录加载所有CSV文件
all_files = glob.glob(os.path.join(dataset_path, "*.csv"))
df_list = []
for filename in all_files:
df_temp = pd.read_csv(filename, index_col=None, header=0)
df_list.append(df_temp)
df = pd.concat(df_list, axis=0, ignore_index=True)
实现思路:
- 使用
glob模块匹配所有CSV文件 - 逐个读取文件并存储到列表中
- 使用
pd.concat合并所有数据框 - 去除列名两端的空格,确保数据一致性
1.2 数据清洗
# 处理无穷大和缺失值
df.replace([np.inf, -np.inf], np.nan, inplace=True)
df.dropna(inplace=True)
实现思路:
- 将无穷大值(
np.inf、-np.inf)替换为NaN - 删除包含
NaN的行 - 清洗后数据量:2,827,876 条(删除了2,867条无效数据)
1.3 标签编码
# 使用LabelEncoder进行多分类编码
le = LabelEncoder()
df['Label_Encoded'] = le.fit_transform(df['Label'])
实现思路:
- 使用
LabelEncoder将字符串标签转换为数值标签 - 保存标签映射关系,便于后续预测结果的解码
- 创建二分类标签(0:正常,1:恶意)用于可视化
2. 数据可视化与分析

图2:类别分布图
该图展示了数据集中正常流量和恶意流量的数量对比,以及Top 10攻击类型的分布情况。从图中可以看出:
- 正常流量占主导:正常流量(BENIGN)数量远超恶意流量
- 攻击类型多样:包含DoS、PortScan、DDoS等多种攻击类型
- 数据不平衡:某些攻击类型(如Heartbleed、SQL Injection)样本极少
实现思路:
- 使用
seaborn的countplot绘制类别分布 - 分别展示二分类分布和多分类分布
- 使用不同颜色方案区分正常和恶意流量

图3:特征相关性热力图
该图展示了Top 15高方差特征之间的相关性。热力图中:
- 红色区域:表示正相关(相关系数接近1)
- 蓝色区域:表示负相关(相关系数接近-1)
- 白色区域:表示相关性较弱(相关系数接近0)
实现思路:
- 计算数值型特征的方差
- 选择方差最大的前15个特征
- 计算特征间的皮尔逊相关系数
- 使用
seaborn.heatmap绘制相关性矩阵
技术原理:
- 相关性分析:使用皮尔逊相关系数衡量两个特征之间的线性关系
- 方差选择:高方差特征通常包含更多信息,对分类更有帮助
3. 特征选择

图4:特征重要性排名图
该图展示了基于随机森林算法计算出的Top 20特征重要性。从图中可以看出:
- Label_Binary:重要性最高(0.1963),这是二分类标签
- Packet Length Variance:数据包长度方差,重要性0.0525
- Bwd Packet Length Std:后向数据包长度标准差,重要性0.0483
- Packet Length Std:数据包长度标准差,重要性0.0405
实现思路:
# 使用随机森林计算特征重要性
rf_selector = RandomForestClassifier(n_estimators=50, random_state=42)
rf_selector.fit(X_sample, y_sample)
importances = rf_selector.feature_importances_
技术原理:
- 随机森林特征重要性:基于基尼不纯度或信息增益计算
- 特征选择策略:选择重要性排名前20的特征
- 降维效果:从79维降至20维,减少计算量并防止过拟合
Top 20特征列表:
- Label_Binary (0.1963)
- Packet Length Variance (0.0525)
- Bwd Packet Length Std (0.0483)
- Packet Length Std (0.0405)
- Total Length of Fwd Packets (0.0356)
- Average Packet Size (0.0325)
- Bwd Packet Length Mean (0.0299)
- Subflow Fwd Bytes (0.0259)
- Destination Port (0.0256)
- Packet Length Mean (0.0251)
- Fwd Packet Length Mean (0.0247)
- Bwd Packet Length Max (0.0215)
- Avg Bwd Segment Size (0.0207)
- Fwd Packet Length Max (0.0201)
- Subflow Bwd Bytes (0.0192)
- Fwd IAT Mean (0.0189)
- Flow IAT Max (0.0184)
- Total Length of Bwd Packets (0.0179)
- Max Packet Length (0.0168)
- Bwd Packets/s (0.0153)
4. 模型选择与训练
4.1 模型选择
系统对比了三种机器学习模型:
-
逻辑回归 (Logistic Regression)
- 原理:使用逻辑函数(sigmoid)将线性回归的输出映射到0-1之间
- 优点:模型简单,训练速度快,可解释性强
- 缺点:只能学习线性关系,对非线性模式识别能力弱
- 适用场景:作为基准模型,用于对比
-
决策树 (Decision Tree)
- 原理:通过递归分割数据,构建树状结构进行分类
- 优点:易于理解和解释,能处理非线性关系
- 缺点:容易过拟合,对数据变化敏感
- 适用场景:需要可解释性的场景
-
随机森林 (Random Forest)
- 原理:集成多个决策树,通过投票机制做出最终预测
- 优点:准确率高,抗过拟合能力强,能处理高维数据
- 缺点:模型复杂度高,训练时间较长
- 适用场景:对准确率要求高的场景(本项目选择)
4.2 训练过程
# 划分训练集和测试集 (70% 训练, 30% 测试)
X_train, X_test, y_train, y_test = train_test_split(
X_selected, y, test_size=0.3, random_state=42, stratify=y
)
# 定义模型
models = {
"Logistic Regression": LogisticRegression(...),
"Decision Tree": DecisionTreeClassifier(...),
"Random Forest": RandomForestClassifier(n_estimators=100, ...)
}
# 训练模型
for name, model in models.items():
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
实现细节:
- 数据划分:使用
train_test_split按7:3比例划分 - 分层采样:使用
stratify=y确保训练集和测试集的类别分布一致 - 随机种子:设置
random_state=42保证结果可复现
模型训练与评估
1. 模型性能对比

图5:不同模型的性能指标对比图
该图对比了三种模型在准确率、F1分数、精确率和召回率四个指标上的表现:
| 模型 | 准确率 | F1 Score | Precision | Recall |
|---|---|---|---|---|
| Logistic Regression | 84.40% | 0.8097 | 0.7800 | 84.40% |
| Decision Tree | 99.96% | 0.9996 | 0.9996 | 99.96% |
| Random Forest | 99.96% | 0.9996 | 0.9996 | 99.96% |
分析:
- 随机森林表现最佳:在所有指标上都达到了99.96%的高准确率
- 逻辑回归表现较差:由于只能学习线性关系,准确率仅为84.40%
- 决策树和随机森林相近:但随机森林在泛化能力上更优
技术原理:
- 准确率 (Accuracy):正确预测的样本数占总样本数的比例
- F1 Score:精确率和召回率的调和平均数,平衡了两种指标
- 精确率 (Precision):预测为正例的样本中,真正为正例的比例
- 召回率 (Recall):真正为正例的样本中,被正确预测为正例的比例
2. 混淆矩阵分析

图6:随机森林模型混淆矩阵
该图展示了随机森林模型在测试集上的混淆矩阵。混淆矩阵是一个15×15的矩阵,其中:
- 对角线元素:表示正确分类的样本数
- 非对角线元素:表示错误分类的样本数
- 颜色深度:表示样本数量,颜色越深表示数量越多
分析结果:
- BENIGN类别:681,396个样本全部正确分类(准确率100%)
- DDoS攻击:38,408个样本全部正确分类(准确率100%)
- PortScan攻击:47,641个样本全部正确分类(准确率100%)
- Web Attack - SQL Injection:6个样本中只有2个被正确分类(准确率33%)
- Web Attack - XSS:196个样本中只有71个被正确分类(准确率36%)
问题分析:
- 样本不平衡:Web Attack类型的样本数量极少(SQL Injection仅21个,XSS仅652个)
- 特征相似性:某些Web攻击类型的特征可能与正常流量相似,难以区分
改进建议:
- 使用SMOTE等过采样技术增加少数类样本
- 使用类别权重平衡不同类别的重要性
- 收集更多Web攻击类型的样本
3. 分类报告
precision recall f1-score support
BENIGN 1.00 1.00 1.00 681396
Bot 1.00 1.00 1.00 587
DDoS 1.00 1.00 1.00 38408
DoS GoldenEye 1.00 0.99 0.99 3088
DoS Hulk 1.00 1.00 1.00 69037
DoS Slowhttptest 1.00 0.99 1.00 1650
DoS slowloris 1.00 1.00 1.00 1739
FTP-Patator 1.00 1.00 1.00 2380
Heartbleed 1.00 1.00 1.00 3
Infiltration 1.00 0.91 0.95 11
PortScan 1.00 1.00 1.00 47641
SSH-Patator 1.00 1.00 1.00 1769
Web Attack Brute Force 0.73 0.74 0.73 452
Web Attack Sql Injection 0.67 0.33 0.44 6
Web Attack XSS 0.38 0.36 0.37 196
accuracy 1.00 848363
macro avg 0.92 0.89 0.90 848363
weighted avg 1.00 1.00 1.00 848363
关键指标:
- 整体准确率:99.96%
- 加权平均F1:1.00(考虑类别不平衡)
- 宏平均F1:0.90(不考虑类别不平衡)
4. 模型保存
# 保存模型和特征
joblib.dump(best_model, 'best_malicious_traffic_model.pkl')
joblib.dump(list(top_features), 'selected_features.pkl')
joblib.dump(label_mapping, 'label_mapping.pkl')
保存内容:
- 模型文件:训练好的随机森林模型
- 特征列表:选定的20个特征名称
- 标签映射:数值标签到字符串标签的映射关系
系统架构与实现
系统架构
系统采用前后端分离的架构:
┌─────────────────┐
│ Streamlit UI │ ← 用户界面层
└────────┬────────┘
│
┌────────▼────────┐
│ Python Backend │ ← 业务逻辑层
└────────┬────────┘
│
┌────────▼────────┐
│ ML Model (PKL) │ ← 模型层
└─────────────────┘
核心模块
1. 资源加载模块
@st.cache_resource
def load_resources():
model = joblib.load(MODEL_PATH)
features = joblib.load(FEATURES_PATH)
label_mapping = joblib.load(LABEL_MAPPING_PATH)
return model, features, label_mapping, None
实现特点:
- 使用
@st.cache_resource装饰器缓存资源,避免重复加载 - 异常处理:捕获加载错误并返回错误信息
- 单例模式:确保模型只加载一次
2. 预测模块
def predict_traffic(input_data):
input_df = pd.DataFrame([input_data])
prediction = model.predict(input_df)[0]
result_label = label_mapping.get(prediction, "Unknown")
return result_label
实现特点:
- 数据格式转换:将字典转换为DataFrame
- 特征对齐:确保输入特征与训练时一致
- 标签映射:将数值预测结果转换为可读标签
3. 批量处理模块
def batch_predict(df):
X_batch = df[features]
predictions = model.predict(X_batch)
results_labels = [label_mapping.get(p, "Unknown") for p in predictions]
return results_labels
实现特点:
- 批量预测:一次性处理多条记录
- 特征选择:只使用训练时选定的特征
- 结果映射:批量转换预测结果
技术实现细节
1. 数据预处理
# 处理缺失特征
if 'Label_Binary' in missing_cols:
df['Label_Binary'] = 0 # 默认设为正常
missing_cols.remove('Label_Binary')
实现思路:
- 检查上传文件是否包含所有必需特征
- 对于
Label_Binary特征,如果缺失则默认设为0(正常) - 对于其他缺失特征,提示用户补充
2. 实时模拟
# 模拟实时流量检测
while simulation_running:
# 随机选择场景(80%正常,20%恶意)
if random.random() < 0.8:
scenario_name = "正常流量 (BENIGN)"
else:
scenario_name = random.choice([...])
# 添加噪声使数据更真实
for k, v in base_data.items():
noise = random.uniform(0.9, 1.1)
input_data[k] = v * noise
# 预测并更新历史记录
prediction = model.predict(input_df)[0]
history.append({...})
实现思路:
- 使用随机数模拟真实网络环境(80%正常流量,20%恶意流量)
- 添加±10%的随机噪声,模拟真实流量的波动
- 维护历史记录,用于可视化展示
3. 数据可视化
# 特征对比分析
for feat in features:
norm_val = normal_sample.get(feat, 1.0)
curr_val = input_data[feat]
diff_pct = (curr_val - norm_val) / norm_val * 100
if abs(diff_pct) > 10:
comparison_data.append({...})
实现思路:
- 计算当前流量特征与正常流量均值的差异百分比
- 只显示差异超过10%的特征,避免信息过载
- 使用条形图直观展示特征偏差
数据库设计
虽然当前系统使用文件系统存储模型和特征,但为了支持生产环境的需求,我们设计了完整的数据库方案。数据库采用MySQL,用于存储检测记录、用户信息、系统日志等。
数据库概述
数据库名称:traffic_detection_db
字符集:utf8mb4
排序规则:utf8mb4_unicode_ci
表结构设计
1. 检测记录表 (detection_records)
存储每次流量检测的详细记录。
| 字段名 | 类型 | 长度 | 非空 | 唯一 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT | - | ✓ | ✓ | 主键,自增 |
| record_id | VARCHAR | 64 | ✓ | ✓ | 记录唯一标识(UUID) |
| source_ip | VARCHAR | 45 | ✗ | ✗ | 源IP地址(支持IPv6) |
| dest_ip | VARCHAR | 45 | ✗ | ✗ | 目标IP地址 |
| source_port | INT | - | ✗ | ✗ | 源端口 |
| dest_port | INT | - | ✗ | ✗ | 目标端口 |
| protocol | VARCHAR | 20 | ✗ | ✗ | 协议类型(TCP/UDP等) |
| predicted_label | VARCHAR | 50 | ✓ | ✗ | 预测的流量类型 |
| confidence | DECIMAL | 5,4 | ✗ | ✗ | 预测置信度(0-1) |
| is_malicious | TINYINT | 1 | ✓ | ✗ | 是否为恶意流量(0/1) |
| feature_data | JSON | - | ✗ | ✗ | 特征数据(JSON格式) |
| detection_time | DATETIME | - | ✓ | ✗ | 检测时间 |
| created_at | TIMESTAMP | - | ✓ | ✗ | 记录创建时间 |
| updated_at | TIMESTAMP | - | ✓ | ✗ | 记录更新时间 |
索引设计:
- 主键索引:
PRIMARY KEY (id) - 唯一索引:
UNIQUE KEY uk_record_id (record_id) - 普通索引:
KEY idx_detection_time (detection_time) - 普通索引:
KEY idx_is_malicious (is_malicious) - 普通索引:
KEY idx_source_ip (source_ip)
SQL创建语句:
CREATE TABLE `detection_records` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`record_id` VARCHAR(64) NOT NULL COMMENT '记录唯一标识',
`source_ip` VARCHAR(45) DEFAULT NULL COMMENT '源IP地址',
`dest_ip` VARCHAR(45) DEFAULT NULL COMMENT '目标IP地址',
`source_port` INT DEFAULT NULL COMMENT '源端口',
`dest_port` INT DEFAULT NULL COMMENT '目标端口',
`protocol` VARCHAR(20) DEFAULT NULL COMMENT '协议类型',
`predicted_label` VARCHAR(50) NOT NULL COMMENT '预测的流量类型',
`confidence` DECIMAL(5,4) DEFAULT NULL COMMENT '预测置信度',
`is_malicious` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否为恶意流量',
`feature_data` JSON DEFAULT NULL COMMENT '特征数据JSON',
`detection_time` DATETIME NOT NULL COMMENT '检测时间',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_record_id` (`record_id`),
KEY `idx_detection_time` (`detection_time`),
KEY `idx_is_malicious` (`is_malicious`),
KEY `idx_source_ip` (`source_ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='检测记录表';
2. 批量检测任务表 (batch_tasks)
存储批量检测任务的信息。
| 字段名 | 类型 | 长度 | 非空 | 唯一 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT | - | ✓ | ✓ | 主键,自增 |
| task_id | VARCHAR | 64 | ✓ | ✓ | 任务唯一标识 |
| file_name | VARCHAR | 255 | ✓ | ✗ | 上传的文件名 |
| file_path | VARCHAR | 500 | ✗ | ✗ | 文件存储路径 |
| total_records | INT | - | ✓ | ✗ | 总记录数 |
| processed_records | INT | - | ✓ | ✗ | 已处理记录数 |
| malicious_count | INT | - | ✓ | ✗ | 恶意流量数量 |
| benign_count | INT | - | ✓ | ✗ | 正常流量数量 |
| status | VARCHAR | 20 | ✓ | ✗ | 任务状态(pending/processing/completed/failed) |
| error_message | TEXT | - | ✗ | ✗ | 错误信息 |
| created_by | VARCHAR | 64 | ✗ | ✗ | 创建者 |
| created_at | TIMESTAMP | - | ✓ | ✗ | 创建时间 |
| updated_at | TIMESTAMP | - | ✓ | ✗ | 更新时间 |
| completed_at | DATETIME | - | ✗ | ✗ | 完成时间 |
索引设计:
- 主键索引:
PRIMARY KEY (id) - 唯一索引:
UNIQUE KEY uk_task_id (task_id) - 普通索引:
KEY idx_status (status) - 普通索引:
KEY idx_created_at (created_at)
SQL创建语句:
CREATE TABLE `batch_tasks` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`task_id` VARCHAR(64) NOT NULL COMMENT '任务唯一标识',
`file_name` VARCHAR(255) NOT NULL COMMENT '文件名',
`file_path` VARCHAR(500) DEFAULT NULL COMMENT '文件路径',
`total_records` INT NOT NULL DEFAULT '0' COMMENT '总记录数',
`processed_records` INT NOT NULL DEFAULT '0' COMMENT '已处理记录数',
`malicious_count` INT NOT NULL DEFAULT '0' COMMENT '恶意流量数量',
`benign_count` INT NOT NULL DEFAULT '0' COMMENT '正常流量数量',
`status` VARCHAR(20) NOT NULL DEFAULT 'pending' COMMENT '任务状态',
`error_message` TEXT DEFAULT NULL COMMENT '错误信息',
`created_by` VARCHAR(64) DEFAULT NULL COMMENT '创建者',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`completed_at` DATETIME DEFAULT NULL COMMENT '完成时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_id` (`task_id`),
KEY `idx_status` (`status`),
KEY `idx_created_at` (`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='批量检测任务表';
3. 攻击统计表 (attack_statistics)
按时间段统计各类攻击的数量和趋势。
| 字段名 | 类型 | 长度 | 非空 | 唯一 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT | - | ✓ | ✓ | 主键,自增 |
| stat_date | DATE | - | ✓ | ✗ | 统计日期 |
| stat_hour | TINYINT | - | ✗ | ✗ | 统计小时(0-23) |
| attack_type | VARCHAR | 50 | ✓ | ✗ | 攻击类型 |
| attack_count | INT | - | ✓ | ✗ | 攻击次数 |
| created_at | TIMESTAMP | - | ✓ | ✗ | 创建时间 |
| updated_at | TIMESTAMP | - | ✓ | ✗ | 更新时间 |
索引设计:
- 主键索引:
PRIMARY KEY (id) - 唯一索引:
UNIQUE KEY uk_stat (stat_date, stat_hour, attack_type) - 普通索引:
KEY idx_stat_date (stat_date)
SQL创建语句:
CREATE TABLE `attack_statistics` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`stat_date` DATE NOT NULL COMMENT '统计日期',
`stat_hour` TINYINT DEFAULT NULL COMMENT '统计小时',
`attack_type` VARCHAR(50) NOT NULL COMMENT '攻击类型',
`attack_count` INT NOT NULL DEFAULT '0' COMMENT '攻击次数',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_stat` (`stat_date`, `stat_hour`, `attack_type`),
KEY `idx_stat_date` (`stat_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='攻击统计表';
4. 系统日志表 (system_logs)
记录系统运行日志和错误信息。
| 字段名 | 类型 | 长度 | 非空 | 唯一 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT | - | ✓ | ✓ | 主键,自增 |
| log_level | VARCHAR | 20 | ✓ | ✗ | 日志级别(INFO/WARN/ERROR) |
| log_type | VARCHAR | 50 | ✓ | ✗ | 日志类型 |
| message | TEXT | - | ✓ | ✗ | 日志消息 |
| details | JSON | - | ✗ | ✗ | 详细信息(JSON格式) |
| user_id | VARCHAR | 64 | ✗ | ✗ | 用户ID |
| ip_address | VARCHAR | 45 | ✗ | ✗ | IP地址 |
| created_at | TIMESTAMP | - | ✓ | ✗ | 创建时间 |
索引设计:
- 主键索引:
PRIMARY KEY (id) - 普通索引:
KEY idx_log_level (log_level) - 普通索引:
KEY idx_created_at (created_at) - 普通索引:
KEY idx_log_type (log_type)
SQL创建语句:
CREATE TABLE `system_logs` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`log_level` VARCHAR(20) NOT NULL COMMENT '日志级别',
`log_type` VARCHAR(50) NOT NULL COMMENT '日志类型',
`message` TEXT NOT NULL COMMENT '日志消息',
`details` JSON DEFAULT NULL COMMENT '详细信息',
`user_id` VARCHAR(64) DEFAULT NULL COMMENT '用户ID',
`ip_address` VARCHAR(45) DEFAULT NULL COMMENT 'IP地址',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_log_level` (`log_level`),
KEY `idx_created_at` (`created_at`),
KEY `idx_log_type` (`log_type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统日志表';
5. 模型版本表 (model_versions)
记录模型版本信息和性能指标。
| 字段名 | 类型 | 长度 | 非空 | 唯一 | 说明 |
|---|---|---|---|---|---|
| id | BIGINT | - | ✓ | ✓ | 主键,自增 |
| version | VARCHAR | 20 | ✓ | ✓ | 模型版本号 |
| model_path | VARCHAR | 500 | ✓ | ✗ | 模型文件路径 |
| accuracy | DECIMAL | 5,4 | ✓ | ✗ | 准确率 |
| f1_score | DECIMAL | 5,4 | ✓ | ✗ | F1分数 |
| precision | DECIMAL | 5,4 | ✓ | ✗ | 精确率 |
| recall | DECIMAL | 5,4 | ✓ | ✗ | 召回率 |
| feature_count | INT | - | ✓ | ✗ | 特征数量 |
| training_samples | INT | - | ✓ | ✗ | 训练样本数 |
| is_active | TINYINT | 1 | ✓ | ✗ | 是否激活(0/1) |
| description | TEXT | - | ✗ | ✗ | 版本描述 |
| created_at | TIMESTAMP | - | ✓ | ✗ | 创建时间 |
索引设计:
- 主键索引:
PRIMARY KEY (id) - 唯一索引:
UNIQUE KEY uk_version (version) - 普通索引:
KEY idx_is_active (is_active)
SQL创建语句:
CREATE TABLE `model_versions` (
`id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`version` VARCHAR(20) NOT NULL COMMENT '模型版本号',
`model_path` VARCHAR(500) NOT NULL COMMENT '模型文件路径',
`accuracy` DECIMAL(5,4) NOT NULL COMMENT '准确率',
`f1_score` DECIMAL(5,4) NOT NULL COMMENT 'F1分数',
`precision` DECIMAL(5,4) NOT NULL COMMENT '精确率',
`recall` DECIMAL(5,4) NOT NULL COMMENT '召回率',
`feature_count` INT NOT NULL COMMENT '特征数量',
`training_samples` INT NOT NULL COMMENT '训练样本数',
`is_active` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否激活',
`description` TEXT DEFAULT NULL COMMENT '版本描述',
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_version` (`version`),
KEY `idx_is_active` (`is_active`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='模型版本表';
数据库关系图
detection_records (检测记录)
│
├── 1:N ──→ batch_tasks (批量任务)
│
└── 1:N ──→ attack_statistics (攻击统计)
model_versions (模型版本)
│
└── 1:N ──→ detection_records (检测记录)
system_logs (系统日志)
└── (独立表,记录系统运行日志)
数据库优化建议
- 分区策略:对
detection_records表按时间分区,提高查询效率 - 归档策略:定期归档历史数据,保持表大小合理
- 读写分离:使用主从复制,提高查询性能
- 缓存策略:对热点数据使用Redis缓存
系统目录结构
program/
├── algorithm/ # 算法模块
│ ├── __pycache__/ # Python缓存目录
│ ├── algorithm.ipynb # Jupyter Notebook(算法开发)
│ ├── streamlit_app.py # Streamlit Web应用主程序
│ ├── best_malicious_traffic_model.pkl # 训练好的模型文件
│ ├── selected_features.pkl # 选定的特征列表
│ ├── label_mapping.pkl # 标签映射关系
│ ├── generate_sample_csvs.py # 生成示例CSV文件脚本
│ ├── run_dashboard.bat # 启动脚本(Windows)
│ ├── dataset/ # 数据集目录
│ │ ├── Friday-WorkingHours-Afternoon-DDos.pcap_ISCX.csv
│ │ ├── Friday-WorkingHours-Afternoon-PortScan.pcap_ISCX.csv
│ │ ├── Friday-WorkingHours-Morning.pcap_ISCX.csv
│ │ ├── Monday-WorkingHours.pcap_ISCX.csv
│ │ ├── Thursday-WorkingHours-Afternoon-Infilteration.pcap_ISCX.csv
│ │ ├── Thursday-WorkingHours-Morning-WebAttacks.pcap_ISCX.csv
│ │ ├── Tuesday-WorkingHours.pcap_ISCX.csv
│ │ └── Wednesday-workingHours.pcap_ISCX.csv
│ └── examples/ # 示例数据目录
│ ├── sample_normal.csv # 正常流量示例
│ ├── sample_attack_portscan.csv # 端口扫描攻击示例
│ └── sample_mixed.csv # 混合流量示例
│
├── explaination/ # 文档和说明目录
│ ├── 详解.md # 本文档
│ ├── images/ # 图片资源目录
│ │ ├── algorithm/ # 算法相关图片
│ │ │ ├── 不同模型的性能指标对比.png
│ │ │ ├── 多模型训练.png
│ │ │ ├── 混淆矩阵.png
│ │ │ ├── 特征重要性.png
│ │ │ ├── 相关性热力图.png
│ │ │ └── 类别分布.png
│ │ └── system/ # 系统界面相关图片
│ │ ├── 系统概览.png
│ │ ├── 单条流量检测.png
│ │ ├── 实时流量监控模拟.png
│ │ ├── 批量文件检测.png
│ │ ├── 数据分析1.png
│ │ ├── 数据分析2.png
│ │ ├── 数据分析3.png
│ │ └── 模型分析.png
│ └── WD053.mp4 # 系统演示视频
│
└── algorithm.zip # 算法模块压缩包
目录说明
algorithm/ 目录
-
algorithm.ipynb:Jupyter Notebook文件,包含完整的算法开发流程
- 数据预处理
- 特征选择
- 模型训练
- 模型评估
- 结果可视化
-
streamlit_app.py:Streamlit Web应用主程序
- 实现所有前端界面
- 处理用户交互
- 调用模型进行预测
- 数据可视化
-
模型文件(.pkl):
best_malicious_traffic_model.pkl:训练好的随机森林模型selected_features.pkl:选定的20个特征名称列表label_mapping.pkl:数值标签到字符串标签的映射字典
-
dataset/:原始数据集目录
- 包含8个CSV文件,总计约283万条记录
- 每个文件对应不同的攻击场景或时间段
-
examples/:示例数据目录
- 用于系统演示和测试
- 包含正常流量、攻击流量和混合流量的示例
explaination/ 目录
- 详解.md:本文档,详细介绍项目各个方面
- images/:图片资源目录
algorithm/:算法开发过程中的可视化图表system/:系统界面的截图
- WD053.mp4:系统演示视频
界面功能详解
1. 系统概览

图7:系统概览界面
该界面是系统的首页,展示了系统的基本信息和核心功能。
功能说明:
- 系统简介:介绍系统的基本功能和特点
- 支持识别的攻击类型:列出系统能够识别的15种流量类别
- 核心优势:展示系统的技术优势(高准确率、实时性、多维度分析)
- 系统状态:显示模型加载状态、特征维度、类别数量等信息
界面元素:
- 左侧:系统介绍和功能说明
- 右侧:系统状态卡片(模型状态、特征数量、类别数量)
技术实现:
if page == "系统概览":
st.title("🛡️ 基于机器学习的恶意流量自动识别系统")
# 显示系统介绍
st.markdown("### 系统简介")
# 显示系统状态
st.success("✅ 模型已加载")
st.info(f"🔢 特征维度: {len(features)}")
2. 单条流量检测

图8:单条流量检测界面
该界面支持用户输入流量特征进行实时检测。
功能说明:
- 示例场景选择:提供5种预设场景(正常流量、PortScan、Bot、Web Attack、DoS Slowloris)
- 特征输入:支持手动输入20个流量特征值
- 实时检测:点击"开始检测"按钮进行预测
- 结果展示:
- 检测结果(正常/恶意)
- 威胁类型(如果是恶意流量)
- 置信度
- 特征对比分析图
界面元素:
- 顶部:示例场景下拉选择框
- 中间:特征输入表单(3列布局)
- 底部:检测结果展示区域
技术实现:
# 示例数据自动填充
if selected_sample != "自定义输入":
defaults = SAMPLE_DATA[selected_sample]
# 特征输入表单
for i, feature in enumerate(features):
col = cols[i % 3]
input_data[feature] = col.number_input(feature, value=default_val)
# 预测和结果展示
prediction = model.predict(input_df)[0]
result_label = label_mapping.get(prediction, "Unknown")
特征对比分析:
- 计算当前流量特征与正常流量均值的差异百分比
- 只显示差异超过10%的特征
- 使用条形图直观展示特征偏差
3. 实时流量监控模拟

图9:实时流量监控模拟界面
该界面模拟真实网络环境下的流量监控过程。
功能说明:
- 开始/停止监控:控制模拟的开始和停止
- 实时状态显示:
- 当前状态(安全/威胁)
- 累计威胁数量
- 监控时长
- 实时图表:显示威胁等级随时间的变化
- 检测日志:显示最近20条检测记录
界面元素:
- 顶部:控制按钮(开始/停止)
- 中间:状态指标卡片和实时图表
- 底部:检测日志表格
技术实现:
# 模拟循环
while simulation_running:
# 随机选择场景(80%正常,20%恶意)
if random.random() < 0.8:
scenario_name = "正常流量 (BENIGN)"
else:
scenario_name = random.choice([...])
# 添加噪声
for k, v in base_data.items():
noise = random.uniform(0.9, 1.1)
input_data[k] = v * noise
# 预测并更新历史
prediction = model.predict(input_df)[0]
history.append({...})
模拟策略:
- 流量分布:80%正常流量,20%恶意流量(模拟真实环境)
- 噪声添加:±10%随机噪声,模拟真实流量的波动
- 刷新频率:每秒更新一次
4. 批量文件检测

图10:批量文件检测界面
该界面支持上传CSV文件进行批量检测。
功能说明:
- 文件上传:支持上传CSV格式的流量数据文件
- 文件验证:检查文件是否包含所有必需特征
- 批量扫描:对文件中的所有记录进行检测
- 结果展示:
- 扫描统计(各类别数量分布)
- 详细结果表格
- 下载检测报告
界面元素:
- 顶部:文件上传组件
- 中间:扫描统计图表
- 底部:详细结果表格和下载按钮
技术实现:
# 文件上传
uploaded_file = st.file_uploader("上传CSV文件", type=["csv"])
# 读取和验证
df = pd.read_csv(uploaded_file)
missing_cols = [col for col in features if col not in df.columns]
# 批量预测
predictions = model.predict(X_batch)
results_labels = [label_mapping.get(p, "Unknown") for p in predictions]
# 结果展示和下载
st.bar_chart(stats)
csv = df.to_csv(index=False).encode('utf-8')
st.download_button("下载检测报告", csv, "detection_report.csv")
处理流程:
- 用户上传CSV文件
- 系统读取文件并验证特征完整性
- 对于缺失的
Label_Binary特征,默认设为0(正常) - 批量预测所有记录
- 生成统计报告和详细结果
- 提供CSV格式的下载
5. 数据分析

图11:数据分析界面 - 数据概览

图12:数据分析界面 - 类别分布

图13:数据分析界面 - 特征相关性
该界面提供探索性数据分析(EDA)功能。
功能说明:
- 数据概览:
- 数据前5行预览
- 数据统计描述(均值、标准差、最值等)
- 缺失值检查
- 类别分布:
- 类别数量统计
- 饼图展示类别占比
- 特征相关性:
- 特征相关性热力图
- 支持选择特征查看分布直方图
界面元素:
- 数据概览区域:表格和统计信息
- 类别分布区域:统计表和饼图
- 特征相关性区域:热力图和直方图
技术实现:
# 数据概览
st.write(df.head())
st.write(df.describe())
# 类别分布
label_col = st.selectbox("选择标签列", df.columns)
st.write(df[label_col].value_counts())
df[label_col].value_counts().plot.pie(autopct='%1.1f%%')
# 特征相关性
numeric_df = df.select_dtypes(include=[np.number])
sns.heatmap(numeric_df.corr(), annot=False, cmap='coolwarm')
分析功能:
- 自动识别标签列:根据列名自动识别可能的标签列
- 智能特征选择:如果特征数量过多,仅展示前20个特征的相关性
- 交互式可视化:用户可以选择不同的特征进行深入分析
6. 模型信息

图14:模型分析界面
该界面展示模型的详细信息。
功能说明:
- 性能指标:显示准确率、F1分数、精确率、召回率
- 特征重要性:展示Top 20特征的重要性排名
- 模型参数:显示模型的详细参数配置
- 特征列表:列出所有使用的特征
- 类别映射:显示数值标签到字符串标签的映射关系
界面元素:
- 性能指标卡片:4个关键指标
- 特征重要性图表:横向条形图
- 模型参数代码块:可复制的参数配置
- 特征列表和类别映射:可展开的详细信息
技术实现:
# 性能指标
col1.metric("准确率 (Accuracy)", "99.96%")
col2.metric("F1 Score", "0.9996")
# 特征重要性
if hasattr(model, 'feature_importances_'):
importances = model.feature_importances_
indices = np.argsort(importances)[::-1]
# 绘制条形图
# 模型参数
st.code(str(model), language="python")
展示内容:
- 硬编码指标:基于notebook训练结果的性能指标
- 动态特征重要性:从模型对象中提取特征重要性
- 完整特征列表:展示所有20个选定特征
- 标签映射:JSON格式的类别映射关系
技术栈详解
1. 机器学习框架
1.1 Scikit-learn
版本:最新稳定版
用途:
- 数据预处理:
LabelEncoder、StandardScaler - 特征选择:
SelectKBest、基于模型的特征重要性 - 模型训练:
RandomForestClassifier、DecisionTreeClassifier、LogisticRegression - 模型评估:
accuracy_score、f1_score、confusion_matrix、classification_report - 数据划分:
train_test_split
技术原理:
-
随机森林:集成学习算法,通过构建多个决策树并投票做出最终预测
- Bootstrap采样:每个树使用不同的训练子集
- 特征随机选择:每个节点分裂时随机选择特征子集
- 投票机制:所有树的预测结果进行投票
-
特征重要性:基于基尼不纯度或信息增益计算
- 基尼不纯度:衡量数据集的混乱程度
- 信息增益:衡量特征对分类的贡献
1.2 Joblib
版本:最新稳定版
用途:
- 模型序列化:保存和加载训练好的模型
- 特征列表保存:保存选定的特征列表
- 标签映射保存:保存标签编码映射关系
技术原理:
- Pickle协议:使用Python的pickle协议进行序列化
- 压缩存储:支持压缩存储,减小文件大小
- 快速加载:使用内存映射加速大文件加载
2. Web框架
2.1 Streamlit
版本:最新稳定版
用途:
- Web界面开发:快速构建交互式Web应用
- 数据可视化:集成matplotlib和seaborn进行图表展示
- 文件上传:支持CSV文件上传和处理
- 实时更新:支持实时数据更新和图表刷新
技术原理:
- 声明式编程:通过简单的Python代码声明UI组件
- 自动重载:文件修改后自动重载应用
- 状态管理:使用
st.session_state管理应用状态 - 缓存机制:使用
@st.cache_resource缓存资源,避免重复加载
核心组件:
st.title()、st.header():标题组件st.selectbox()、st.number_input():输入组件st.button()、st.form():交互组件st.dataframe()、st.table():数据展示组件st.pyplot()、st.line_chart():图表组件
3. 数据处理
3.1 Pandas
版本:最新稳定版
用途:
- 数据加载:读取CSV文件
- 数据清洗:处理缺失值、异常值
- 数据合并:合并多个数据文件
- 数据转换:特征工程和数据格式转换
- 数据分析:统计描述和探索性分析
技术原理:
- DataFrame:二维表格数据结构,类似Excel表格
- 向量化操作:使用NumPy数组进行高效计算
- 索引机制:支持多级索引和快速查找
3.2 NumPy
版本:最新稳定版
用途:
- 数值计算:高效的数组运算
- 数学函数:统计函数、数学函数
- 数据类型处理:处理无穷大、NaN等特殊值
技术原理:
- C语言实现:底层使用C语言实现,性能优异
- 向量化计算:避免Python循环,提高计算速度
- 内存布局:连续内存布局,提高缓存命中率
4. 数据可视化
4.1 Matplotlib
版本:最新稳定版
用途:
- 基础绘图:绘制各种类型的图表
- 图表定制:自定义图表样式、颜色、标签
- 中文支持:配置中文字体显示
技术原理:
- 面向对象API:使用
Figure和Axes对象进行绘图 - 后端渲染:支持多种后端(Tkinter、Qt、Web等)
4.2 Seaborn
版本:最新稳定版
用途:
- 统计可视化:绘制统计图表(热力图、分布图等)
- 美观样式:提供美观的默认样式
- 高级图表:支持复杂的多变量可视化
技术原理:
- 基于Matplotlib:在Matplotlib基础上封装
- 统计功能:集成统计功能,自动计算统计量
5. 其他技术
5.1 Python标准库
- glob:文件路径匹配
- os:操作系统接口
- time:时间处理
- random:随机数生成
- platform:平台信息获取
5.2 Jupyter Notebook
用途:
- 算法开发:交互式开发和调试
- 数据探索:逐步探索数据特征
- 结果可视化:实时查看图表结果
- 文档记录:Markdown和代码混合,便于记录思路
算法图表详解
1. 多模型训练流程图

图15:多模型训练流程图
该图展示了从数据预处理到模型训练的完整流程。
流程说明:
-
数据加载阶段
- 从8个CSV文件加载数据
- 合并所有数据文件
- 总数据量:2,830,743条记录
-
数据清洗阶段
- 处理无穷大值(
np.inf、-np.inf) - 删除包含缺失值的行
- 清洗后数据量:2,827,876条
- 处理无穷大值(
-
标签编码阶段
- 使用
LabelEncoder将字符串标签转换为数值标签 - 创建二分类标签(0:正常,1:恶意)
- 保存标签映射关系
- 使用
-
特征选择阶段
- 使用随机森林计算特征重要性
- 选择Top 20特征
- 从79维降至20维
-
数据划分阶段
- 按7:3比例划分训练集和测试集
- 使用分层采样保证类别分布一致
-
模型训练阶段
- 训练逻辑回归模型
- 训练决策树模型
- 训练随机森林模型
-
模型评估阶段
- 计算准确率、F1分数、精确率、召回率
- 生成混淆矩阵
- 对比不同模型的性能
-
模型保存阶段
- 保存最佳模型(随机森林)
- 保存特征列表
- 保存标签映射
技术要点:
- 数据采样:如果数据量超过10万,采样10%用于特征选择,加快计算速度
- 分层采样:使用
stratify参数保证训练集和测试集的类别分布一致 - 随机种子:设置
random_state=42保证结果可复现
2. 类别分布图

图16:类别分布图
该图展示了数据集中正常流量和恶意流量的数量对比,以及Top 10攻击类型的分布。
左图:二分类分布
- 正常流量(0):数量约227万,占主导地位
- 恶意流量(1):数量约56万,占少数
- 数据不平衡:正常流量数量是恶意流量的4倍
右图:多分类分布(Top 10)
- BENIGN:正常流量,数量最多
- DoS Hulk:DoS攻击的一种,数量第二
- PortScan:端口扫描攻击,数量第三
- DDoS:分布式拒绝服务攻击
- 其他攻击类型数量相对较少
技术分析:
- 类别不平衡问题:正常流量占80.3%,恶意流量占19.7%
- 少数类问题:某些攻击类型(如Heartbleed、SQL Injection)样本极少
- 处理策略:
- 使用分层采样保证训练集和测试集的类别分布一致
- 使用加权损失函数平衡不同类别的重要性
- 对于极少数类,可以考虑过采样技术(如SMOTE)
3. 相关性热力图

图17:特征相关性热力图
该图展示了Top 15高方差特征之间的相关性。
颜色说明:
- 红色区域:正相关(相关系数接近1)
- 蓝色区域:负相关(相关系数接近-1)
- 白色区域:相关性较弱(相关系数接近0)
关键发现:
- 高度相关特征:某些特征之间存在强相关性(如数据包长度相关的特征)
- 特征冗余:高度相关的特征可能包含重复信息
- 特征选择意义:通过特征选择可以减少冗余,提高模型效率
技术原理:
-
皮尔逊相关系数:衡量两个特征之间的线性关系
- 取值范围:[-1, 1]
- 1:完全正相关
- -1:完全负相关
- 0:无线性关系
-
方差选择:选择方差最大的特征,因为高方差特征通常包含更多信息
应用价值:
- 特征工程:识别冗余特征,进行特征降维
- 模型优化:减少特征数量,提高模型训练速度
- 可解释性:理解特征之间的关系
4. 特征重要性图

图18:特征重要性排名图
该图展示了基于随机森林算法计算出的Top 20特征重要性。
重要性排名:
- Label_Binary (0.1963):二分类标签,重要性最高(注意:这是数据泄露特征,实际应用中不应使用)
- Packet Length Variance (0.0525):数据包长度方差,反映数据包大小的波动
- Bwd Packet Length Std (0.0483):后向数据包长度标准差
- Packet Length Std (0.0405):数据包长度标准差
- Total Length of Fwd Packets (0.0356):前向数据包总长度
技术原理:
-
基尼不纯度:衡量数据集的混乱程度
- 值越小,数据集越纯净
- 特征分裂后,基尼不纯度降低越多,特征越重要
-
信息增益:衡量特征对分类的贡献
- 信息增益 = 分裂前熵 - 分裂后熵
- 信息增益越大,特征越重要
特征解释:
- 数据包长度相关特征:攻击流量和正常流量的数据包大小分布不同
- 端口相关特征:不同攻击类型通常针对特定端口
- 时间间隔特征:攻击流量的时间模式与正常流量不同
应用价值:
- 特征选择:选择重要性高的特征,提高模型效率
- 特征工程:重点关注重要性高的特征,进行深入分析
- 可解释性:理解哪些特征对分类最重要
5. 模型性能对比图

图19:不同模型的性能指标对比图
该图对比了三种模型在四个指标上的表现。
性能对比:
| 模型 | 准确率 | F1 Score | Precision | Recall |
|---|---|---|---|---|
| Logistic Regression | 84.40% | 0.8097 | 0.7800 | 84.40% |
| Decision Tree | 99.96% | 0.9996 | 0.9996 | 99.96% |
| Random Forest | 99.96% | 0.9996 | 0.9996 | 99.96% |
分析:
- 随机森林表现最佳:在所有指标上都达到了99.96%的高准确率
- 逻辑回归表现较差:由于只能学习线性关系,准确率仅为84.40%
- 决策树和随机森林相近:但随机森林在泛化能力上更优
技术原理:
-
逻辑回归:线性模型,只能学习线性关系
- 优点:模型简单,训练速度快
- 缺点:对非线性模式识别能力弱
-
决策树:非线性模型,能学习复杂的决策规则
- 优点:易于理解,能处理非线性关系
- 缺点:容易过拟合
-
随机森林:集成多个决策树,通过投票做出最终预测
- 优点:准确率高,抗过拟合能力强
- 缺点:模型复杂度高,训练时间较长
选择理由:
- 高准确率:随机森林在测试集上达到99.96%的准确率
- 泛化能力:通过集成多个树,减少过拟合风险
- 特征重要性:能够提供特征重要性信息
6. 混淆矩阵图

图20:随机森林模型混淆矩阵
该图展示了随机森林模型在测试集上的混淆矩阵。
矩阵说明:
- 行:真实类别
- 列:预测类别
- 对角线元素:正确分类的样本数
- 非对角线元素:错误分类的样本数
- 颜色深度:样本数量,颜色越深表示数量越多
关键发现:
- BENIGN类别:681,396个样本全部正确分类(准确率100%)
- DDoS攻击:38,408个样本全部正确分类(准确率100%)
- PortScan攻击:47,641个样本全部正确分类(准确率100%)
- Web Attack - SQL Injection:6个样本中只有2个被正确分类(准确率33%)
- Web Attack - XSS:196个样本中只有71个被正确分类(准确率36%)
问题分析:
-
样本不平衡:Web Attack类型的样本数量极少
- SQL Injection:仅21个训练样本,6个测试样本
- XSS:仅652个训练样本,196个测试样本
-
特征相似性:某些Web攻击类型的特征可能与正常流量相似,难以区分
改进建议:
- 数据增强:使用SMOTE等过采样技术增加少数类样本
- 类别权重:在训练时给少数类更高的权重
- 收集更多数据:收集更多Web攻击类型的样本
- 特征工程:针对Web攻击类型设计专门的特征
系统界面图表详解
1. 系统概览界面

图21:系统概览界面
该界面是系统的首页,展示了系统的基本信息和核心功能。
界面布局:
-
左侧区域:系统介绍和功能说明
- 系统简介
- 支持识别的攻击类型列表
- 核心优势说明
-
右侧区域:系统状态卡片
- 模型加载状态:✅ 模型已加载
- 特征维度:20个特征
- 类别数量:15种流量类型
- 系统状态:📊 状态: 就绪
功能说明:
-
系统简介:介绍系统的基本功能和特点
-
攻击类型:列出系统能够识别的15种流量类别
- 正常流量(BENIGN)
- DDoS攻击
- PortScan(端口扫描)
- Web Attack(Web攻击)
- Bot(僵尸网络)
- 以及其他多种威胁
-
核心优势:
- 高准确率:> 99%
- 实时性:毫秒级推理响应
- 多维度分析:基于20+个关键流量特征
技术实现:
- 使用Streamlit的
st.columns()实现左右分栏布局 - 使用
st.markdown()显示格式化的文本 - 使用
st.success()、st.info()、st.warning()显示状态信息
2. 单条流量检测界面

图22:单条流量检测界面
该界面支持用户输入流量特征进行实时检测。
界面布局:
-
顶部:示例场景下拉选择框
- 自定义输入
- 正常流量 (BENIGN)
- 攻击流量 - PortScan
- 攻击流量 - Bot
- 攻击流量 - Web Attack (Brute Force)
- 攻击流量 - DoS Slowloris
-
中间:特征输入表单(3列布局)
- 20个特征输入框
- 每个特征支持数值输入
- 选择示例场景后自动填充
-
底部:检测结果展示区域
- 检测结果(正常/恶意)
- 威胁类型和置信度
- 特征对比分析图
功能特点:
- 示例场景:提供5种预设场景,方便用户快速测试
- 自动填充:选择示例场景后自动填充特征值
- 实时检测:点击"开始检测"按钮立即进行预测
- 结果可视化:使用图表展示特征对比分析
检测结果展示:
-
正常流量:
- 显示绿色安全图标
- 显示"🟢 正常流量 (BENIGN)"
- 显示"✅ 安全评估: 通过"
-
恶意流量:
- 显示红色警告图标
- 显示"🔴 发现威胁: [攻击类型]"
- 显示"⚠️ 威胁评估: 高危"
- 显示置信度
- 提供处理建议
特征对比分析:
- 计算当前流量特征与正常流量均值的差异百分比
- 只显示差异超过10%的特征
- 使用条形图直观展示特征偏差
- 红色表示高于正常值,绿色表示低于正常值
3. 实时流量监控模拟界面

图23:实时流量监控模拟界面
该界面模拟真实网络环境下的流量监控过程。
界面布局:
-
顶部:控制按钮
- ▶️ 开始监控
- ⏹️ 停止监控
-
中间:状态指标卡片
- 当前状态:安全/威胁
- 累计威胁数量
- 监控时长(ticks)
-
图表区域:实时威胁等级折线图
- X轴:时间点(索引)
- Y轴:威胁等级(0:安全,1:威胁)
-
底部:检测日志表格
- 时间
- 标签(流量类型)
- 状态(Safe/Threat)
功能特点:
- 实时模拟:每秒更新一次,模拟真实网络环境
- 流量分布:80%正常流量,20%恶意流量
- 噪声添加:±10%随机噪声,模拟真实流量的波动
- 历史记录:保留最近20条检测记录
模拟策略:
-
随机场景选择:
- 80%概率选择正常流量
- 20%概率随机选择一种攻击类型
-
噪声添加:
- 对每个特征值添加±10%的随机噪声
- 使模拟数据更接近真实环境
-
实时更新:
- 每秒进行一次检测
- 更新状态指标和图表
- 添加新的检测记录到日志
应用场景:
- 系统演示:向用户展示系统的实时检测能力
- 性能测试:测试系统在高频检测下的性能
- 教学培训:帮助用户理解系统的检测流程
4. 批量文件检测界面

图24:批量文件检测界面
该界面支持上传CSV文件进行批量检测。
界面布局:
-
顶部:文件上传组件
- 支持CSV格式文件
- 显示文件加载状态
-
中间:扫描统计图表
- 各类别数量分布条形图
- 统计信息(总记录数、恶意数量、正常数量)
-
底部:详细结果表格
- 原始数据列
- 预测标签列
- 是否恶意列
-
下载按钮:下载检测报告(CSV格式)
功能特点:
- 文件验证:检查文件是否包含所有必需特征
- 缺失特征处理:对于缺失的
Label_Binary特征,默认设为0(正常) - 批量预测:一次性处理所有记录
- 结果导出:支持下载CSV格式的检测报告
处理流程:
- 文件上传:用户上传CSV文件
- 文件读取:使用
pd.read_csv()读取文件 - 特征验证:检查是否包含所有必需特征
- 缺失特征处理:对于缺失的特征进行默认值填充
- 批量预测:使用模型对所有记录进行预测
- 结果展示:显示统计图表和详细结果
- 结果导出:提供CSV格式的下载
统计信息:
- 总记录数:文件中的总记录数
- 恶意数量:预测为恶意流量的数量
- 正常数量:预测为正常流量的数量
- 各类别分布:各类别(BENIGN、DDoS、PortScan等)的数量
5. 数据分析界面

图25:数据分析界面 - 数据概览
该界面提供数据概览功能,包括:
- 数据预览:显示前5行数据
- 统计描述:显示均值、标准差、最值等统计信息
- 缺失值检查:检查数据中是否存在缺失值

图26:数据分析界面 - 类别分布
该界面提供类别分布分析功能,包括:
- 类别统计:显示各类别的数量
- 饼图展示:使用饼图直观展示类别占比
- 标签列选择:支持用户选择不同的标签列

图27:数据分析界面 - 特征相关性
该界面提供特征相关性分析功能,包括:
- 相关性热力图:展示特征之间的相关性
- 特征分布直方图:支持选择特征查看分布
- 智能特征选择:如果特征数量过多,仅展示前20个特征
功能说明:
-
数据概览:
- 数据形状(行数、列数)
- 前5行数据预览
- 统计描述(均值、标准差、最值、分位数等)
- 缺失值检查
-
类别分布:
- 自动识别标签列(根据列名包含’label’或’class’)
- 类别数量统计
- 饼图展示类别占比
-
特征相关性:
- 计算数值型特征之间的皮尔逊相关系数
- 使用热力图展示相关性矩阵
- 支持选择特征查看分布直方图
技术实现:
- 自动识别标签列:根据列名自动识别可能的标签列
- 智能特征选择:如果特征数量超过20个,仅展示前20个特征的相关性
- 交互式可视化:用户可以选择不同的特征进行深入分析
6. 模型分析界面

图28:模型分析界面
该界面展示模型的详细信息。
界面布局:
-
性能指标卡片:4个关键指标
- 准确率 (Accuracy):99.96%
- F1 Score:0.9996
- Precision:0.9996
- Recall:0.9996
-
特征重要性图表:横向条形图
- 展示Top 20特征的重要性
- 特征名称和重要性得分
-
模型参数代码块:可复制的参数配置
- 显示模型的完整参数配置
- 支持复制代码
-
特征列表:可展开的详细信息
- 列出所有20个选定特征
-
类别映射:JSON格式的映射关系
- 数值标签到字符串标签的映射
功能说明:
- 性能指标:基于notebook训练结果的硬编码指标
- 特征重要性:从模型对象中动态提取特征重要性
- 模型参数:显示模型的详细参数配置
- 特征列表:展示所有使用的特征
- 类别映射:显示数值标签到字符串标签的映射关系
技术实现:
- 动态特征重要性:使用
model.feature_importances_提取特征重要性 - 可视化:使用
seaborn.barplot()绘制横向条形图 - 代码展示:使用
st.code()显示可复制的代码
总结
项目亮点
- 高准确率:基于随机森林算法,识别准确率达到99.96%
- 实时检测:支持单条流量的实时检测,响应时间毫秒级
- 批量处理:支持CSV文件的批量检测,提高处理效率
- 用户友好:基于Streamlit的现代化Web界面,操作简单直观
- 功能完整:从数据预处理到模型部署的完整流程
技术优势
- 特征选择:从79维降至20维,减少计算量并防止过拟合
- 模型集成:使用随机森林集成多个决策树,提高准确率和泛化能力
- 数据可视化:丰富的图表展示,便于理解数据特征和模型性能
- 可扩展性:模块化设计,易于扩展新功能
应用场景
- 网络安全监控:实时监控网络流量,及时发现攻击行为
- 入侵检测系统:作为IDS的核心组件,自动识别恶意流量
- 安全审计:对历史流量数据进行批量分析,发现潜在威胁
- 教学培训:用于网络安全教学,帮助学生理解流量分析原理
未来改进方向
- 数据增强:使用SMOTE等过采样技术处理类别不平衡问题
- 模型优化:尝试深度学习模型(如LSTM、CNN)提高准确率
- 实时部署:集成到真实的网络环境中,实现真正的实时检测
- 数据库集成:使用数据库存储检测记录,支持历史查询和统计分析
- 告警系统:集成告警功能,发现威胁时自动发送通知
- 可视化增强:添加更多可视化图表,如攻击趋势图、地理分布图等
参考文献
- CIC-IDS-2017 Dataset: https://www.unb.ca/cic/datasets/ids-2017.html
- Scikit-learn Documentation: https://scikit-learn.org/
- Streamlit Documentation: https://docs.streamlit.io/
- Random Forest Algorithm: Breiman, L. (2001). “Random Forests”. Machine Learning, 45(1), 5-32.
更多推荐
所有评论(0)