基于联邦学习的入侵检测系统
·
设计一个基于联邦学习的入侵检测系统,结合使用 NSL-KDD 数据集,并应用 联邦学习(Federated Learning)框架来构建模型。联邦学习是一种去中心化的机器学习方式,能够在多方数据之间进行训练,而无需将数据集中存储和共享。
项目概述
项目名称:基于联邦学习的入侵检测系统
目标:通过联邦学习对NSL-KDD数据集进行训练,检测网络入侵。
技术栈:
- 编程语言:Python 3.x
- 联邦学习框架:PySyft(基于PyTorch)
- 深度学习框架:PyTorch
- 数据集:NSL-KDD
- 模型:神经网络模型(MLP)
项目结构
federated_intrusion_detection/ ├── app.py # 联邦学习主程序 ├── dataset.py # 数据集加载与预处理 ├── model.py # 神经网络模型 ├── train.py # 联邦学习训练脚本 ├── requirements.txt # 项目依赖 ├── config.py # 配置文件 ├── results/ # 存储训练结果 ├── templates/ # Web模板文件 │ └── index.html # 训练结果展示 └── static/ # 静态文件(CSS、JS等)
1. requirements.txt 文件
Flask==2.2.5 torch==1.13.1 torchvision==0.14.1 pySyft==0.6.0 scikit-learn==1.0.2 pandas==1.4.2 numpy==1.21.4 requests==2.26.0
2. config.py 文件
配置文件,包含联邦学习的参数、数据集路径等。
import os # 配置路径 DATASET_PATH = os.path.join(os.getcwd(), 'NSL-KDD') # 联邦学习参数 BATCH_SIZE = 32 EPOCHS = 5 LEARNING_RATE = 1e-4 DEVICE = 'cuda' if torch.cuda.is_available() else 'cpu' MODEL_SAVE_PATH = os.path.join(os.getcwd(), 'model.pth')
3. dataset.py 文件
加载和预处理 NSL-KDD 数据集。NSL-KDD数据集用于入侵检测系统的训练,包含正常流量和不同类型的网络攻击。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
import torch
from torch.utils.data import Dataset, DataLoader
import numpy as np
class NslKddDataset(Dataset):
def __init__(self, file_path):
data = pd.read_csv(file_path)
self.X = data.iloc[:, :-1].values # 特征列
self.y = data.iloc[:, -1].values # 标签列
# 转换标签为整数
le = LabelEncoder()
self.y = le.fit_transform(self.y)
# 转换为PyTorch张量
self.X = torch.tensor(self.X, dtype=torch.float32)
self.y = torch.tensor(self.y, dtype=torch.long)
def __len__(self):
return len(self.X)
def __getitem__(self, idx):
return self.X[idx], self.y[idx]
def get_data_loaders(file_path, batch_size=32):
dataset = NslKddDataset(file_path)
train_data, val_data = train_test_split(dataset, test_size=0.2, random_state=42)
train_loader = DataLoader(train_data, batch_size=batch_size, shuffle=True)
val_loader = DataLoader(val_data, batch_size=batch_size, shuffle=False)
return train_loader, val_loader
NslKddDataset:加载和预处理NSL-KDD数据集,将特征和标签转换为PyTorch张量。get_data_loaders:将数据集分为训练集和验证集,并返回DataLoader。
4. model.py 文件
构建神经网络模型(MLP)。这是一个用于分类任务的简单神经网络。
import torch
import torch.nn as nn
class MLPModel(nn.Module):
def __init__(self, input_size, hidden_size=64, output_size=2):
super(MLPModel, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.fc3 = nn.Linear(hidden_size, output_size)
self.relu = nn.ReLU()
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.fc3(x)
return x
- MLPModel:一个简单的多层感知机(MLP)模型,适用于入侵检测任务。
5. train.py 文件
在本地训练每个客户端的模型,并通过联邦学习汇总权重。
import torch
from torch import nn, optim
from model import MLPModel
from dataset import get_data_loaders
import syft as sy
from config import DEVICE, BATCH_SIZE, EPOCHS, LEARNING_RATE
def train_federated_model():
# 初始化联邦学习的虚拟工作者
hook = sy.TorchHook(torch)
workers = [sy.VirtualWorker(hook, id=f"worker_{i}") for i in range(3)] # 模拟三个客户端
# 加载数据
train_loader, val_loader = get_data_loaders('NSL-KDD/KDDTrain+.csv', BATCH_SIZE)
# 构建模型
input_size = train_loader.dataset.X.shape[1]
model = MLPModel(input_size).to(DEVICE)
# 模拟将模型分发到各个工作节点
model.send(workers[0])
# 定义优化器和损失函数
optimizer = optim.Adam(model.parameters(), lr=LEARNING_RATE)
criterion = nn.CrossEntropyLoss()
for epoch in range(EPOCHS):
model.train()
for data, target in train_loader:
data, target = data.to(DEVICE), target.to(DEVICE)
# 将数据发送到worker
data = data.send(workers[0])
target = target.send(workers[0])
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
print(f"Epoch {epoch+1}/{EPOCHS} finished.")
# 通过联邦平均聚合模型参数
model.get() # 拉取模型到主服务器
# 保存训练后的模型
torch.save(model.state_dict(), 'model.pth')
if __name__ == '__main__':
train_federated_model()
- train_federated_model:该函数模拟了一个包含多个客户端的联邦学习系统。每个客户端会在本地进行训练,并使用联邦平均(Federated Averaging)聚合模型权重。
6. app.py 文件
Flask应用程序,展示训练结果。
from flask import Flask, render_template, request
import torch
from model import MLPModel
from config import DEVICE
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/predict', methods=['POST'])
def predict():
# 输入特征
url = request.form['url']
# 模拟URL转换为特征(此处需根据实际情况调整)
features = [len(url), url.count('.'), url.count('/')] # 简单特征提取
# 加载模型
model = MLPModel(input_size=3)
model.load_state_dict(torch.load('model.pth'))
model.eval()
# 预测
features = torch.tensor(features, dtype=torch.float32).unsqueeze(0).to(DEVICE)
output = model(features)
_, predicted = torch.max(output, 1)
# 返回预测结果
result = 'Normal' if predicted.item() == 0 else 'Phishing'
return render_template('result.html', result=result)
if __name__ == '__main__':
app.run(debug=True)
- Flask Web服务:提供一个简单的Web界面,用户可以输入URL并显示预测结果。
7. templates/index.html
用户输入URL进行预测。
<!DOCTYPE html>
<html>
<head><title>Federated Intrusion Detection</title></head>
<body>
<h1>Federated Intrusion Detection System</h1>
<form action="/predict" method="POST">
Enter URL: <input type="text" name="url">
<input type="submit" value="Predict">
</form>
</body>
</html>
8. templates/result.html
显示预测结果。
<!DOCTYPE html>
<html>
<head><title>Prediction Result</title></head>
<body>
<h1>Prediction Result</h1>
<h2>{{ result }}</h2>
<a href="/">Try another URL</a>
</body>
</html>
如何运行
- 安装依赖:
pip install -r requirements.txt
- 训练模型: 运行
train.py脚本,进行模型训练。
python train.py
- 启动Flask应用:
python app.py
- 访问Web界面: 打开浏览器,访问
http://127.0.0.1:5000/,输入URL并查看预测结果。
总结
这是一种使用 联邦学习 来训练入侵检测模型的方法。通过使用 NSL-KDD 数据集训练模型,模拟多个客户端的训练过程,并将各自的模型更新通过联邦平均进行聚合。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)