温馨提示:文末有 CSDN 平台官方提供的学长 Wechat / QQ 名片 :)

1. 项目简介

网络流量分类或网络流量异常检测,采用基于聚类的机器学习算法,实现异常检测与分类,即划分为正常流量和异常流量。 数据集来源自 KDD CUP,该数据集是从一个模拟的美国空军局域网上采集来的 9 个星期的网络连接数据, 分成具有标识的训练数据和未加标识的测试数据。测试数据和训练数据有着不同的概率分布, 测试数据包含了一些未出现在训练数据中的攻击类型, 这使得入侵检测更具有现实性。本项目利用 pandas + Matplotlib + seaborn + sklearn 对网络流量数据进行统计分析,并构建聚类算法实现对流量的分类建模。

2. 功能组成

基于聚类方法的网络流量分类的主要功能包括:

3. 工具包导入和数据读取

import warnings
warnings.filterwarnings('ignore')
import os
import gc
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib as mpl
import matplotlib.pyplot as plt
from IPython.display import display
np.random.seed(7)
plt.style.use('seaborn')
from tqdm import tqdm
import requests
from bs4 import BeautifulSoup
import json
import time

利用 pandas 完成数据集的读取,并将 attack_ type 进行类型转换:

data_df = pd.read_csv('data/kddcup.data_10_percent', sep=',', error_bad_lines=False, header=None)def transform_target(attack_type):attack_type = attack_type[:-1]if attack_type == 'normal':return attack_typeelif attack_type not in {'smurf', 'neptune'}:return 'attack'else:return 'None'data_df['attack_type'] = data_df['attack_type'].map(transform_target)
data_df = data_df[data_df['attack_type'] != 'None']
duration protocol_type service flag src_bytes dst_bytes land wrong_fragment urgent hot ... dst_host_srv_count dst_host_same_srv_rate dst_host_diff_srv_rate dst_host_same_src_port_rate dst_host_srv_diff_host_rate dst_host_serror_rate dst_host_srv_serror_rate dst_host_rerror_rate dst_host_srv_rerror_rate attack_type
34669 0 tcp http SF 276 2729 0 0 0 0 ... 255 1.00 0.00 0.25 0.01 0.0 0.0 0.0 0.0 normal
146619 2472 udp other SF 147 105 0 0 0 0 ... 1 0.00 0.87 0.98 0.00 0.0 0.0 0.0 0.0 normal
29842 0 tcp http SF 219 1434 0 0 0 0 ... 255 1.00 0.00 0.00 0.00 0.0 0.0 0.0 0.0 normal
136719 0 tcp http SF 327 274 0 0 0 0 ... 224 0.88 0.02 0.00 0.00 0.0 0.0 0.0 0.0 normal
23970 0 tcp http SF 217 626 0 0 0 0 ... 255 1.00 0.00 0.00 0.00 0.0 0.0 0.0 0.0 normal

4. 数据探索式可视化分析

由于数据集太大,我们根据数据类型将数据集分为三部分(object、integer、float)并进行分析。在41个固定的特征属性中,9个特征属性为离散型,其他均为连续型。通过对41个固定特征属性的分析,比较能体现出状态变化的是前31个特征属性,其中9个离散型,22个连续型。因此对连接记录的分析处理是针对该31个特征属性。接下来将这31个特征属性进行总结分析。

4.1 攻击类型 attack_type

可以看出,有97277个正常样本,8752个攻击样本,占8.2%,标注样本极不平衡,攻击类型的样本太少,为验证聚类模型的效果,考虑将其合并为一种其他攻击类型。

4.2 连续记录的时间长度 duration

4.3 协议类型 protocol_type

4.4 目的端的服务类型 service

 4.5 连接是错误或正常状态 flag

4.6 源端发送到目的端的字节数的字节数 src_bytes

 4.7 访问系统敏感文件和目录的次数 hot

5. 特征工程

5.1 类别特征编码

特征工程之前,先查看各列或特征在数据集中的不同值的个数,以梳理哪些是数值类型哪些是类别类型的特征。

# 查看各列或特征在数据集中的不同值的个数
for column in data_df.columns:print(len(set(data_df[column])), ':', column)

聚类算法中要使用计算距离的方法对数据进行聚类, 而连接记录的固定特征属性中有两种类型的数值: 离散型和连续型。 对于连续型特征属性, 各属性的度量方法不一样。

针对类别型特征,进行 LabelEncoder 编码:

from sklearn import preprocessingle = preprocessing.LabelEncoder()# 字符串类型的特征进行 LabelEncode 编码
data_df['protocol_type'] = le.fit_transform(data_df['protocol_type'])
data_df['service'] = le.fit_transform(data_df['service'])
data_df['flag'] = le.fit_transform(data_df['flag'])data_df['attack_type'] = data_df['attack_type'].map(lambda x: int(x == 'attack'))target = data_df['attack_type']
del data_df['attack_type']

5.2 特征归一化处理

数据的量纲不同,数量级差别很大,经过标准化处理后,原始数据转化为无量纲化指标测评值,各指标值处于同一数量级别,可进行综合测评分析。

如果直接用原始指标值进行分析,就会突出数值较高的指标在综合分析中的作用,相对削弱数值水平较低指标的作用。

# 最大值-最小值归一化
scaler = preprocessing.MinMaxScaler()data_df = scaler.fit_transform(data_df)

5.3 TSNE 降维可视化

plt.figure(figsize=(20, 8))
plt.scatter(data[target == 1][:, 0], data[target == 1][:, 1], label='1: attack', color='red')
plt.scatter(data[target == 0][:, 0], data[target == 0][:, 1], label='0: normal')
plt.legend()
plt.show()

6. KMeans 无监督聚类模型实现异常检测

6.1 数据集拆分

from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score# 划分测试集
train_x, test_x, train_y, test_y, tsne_train, tsne_test = train_test_split(data_df, target.values, data, test_size=0.1, random_state=42)
print('训练集:{}, 测试集: {}'.format(train_x.shape[0], test_x.shape[0]))
训练集:4819, 测试集: 536

6.2 KMeans 聚类模型

from sklearn.cluster import KMeans# 创建 KMeans 模型
kmeans_model = KMeans(n_clusters=2, random_state=42)# 训练 kmeans 模型
kmeans_model.fit(train_x)# 训练集预测
pred_trains = kmeans_model.predict(train_x)# 测试集预测
pred_tests = kmeans_model.predict(test_x)print('训练集正确率:{:f},精确率:{:f},召回率:{:f},F1-Score:{:f}'.format(accuracy_score(pred_trains, train_y),precision_score(pred_trains, train_y),recall_score(pred_trains, train_y),f1_score(pred_trains, train_y))
)
print('测试集正确率:{:f},精确率:{:f},召回率:{:f},F1-Score:{:f}'.format(accuracy_score(pred_tests, test_y),precision_score(pred_tests, test_y),recall_score(pred_tests, test_y),f1_score(pred_tests, test_y))
)
训练集正确率:0.818220,精确率:0.539043,召回率:0.235943,F1-Score:0.328221
测试集正确率:0.847015,精确率:0.714286,召回率:0.339806,F1-Score:0.460526

测试集预测结果绘图: 

红色的为预测错误的样本,灰色的Wie预测正确的样本,可以看出,单纯的 KMeans 模型的测试集 F1-Score 只有 0.334297,模型存在提升空间!

6.3 模型优化

本项目基于随机森林算法进行特征选择:

......train_probs = clf.predict_proba(train_x)
test_probs = clf.predict_proba(test_x)train_probs = np.reshape(train_probs[:, 0], (train_probs.shape[0], 1))
test_probs = np.reshape(test_probs[:, 0], (test_probs.shape[0], 1))feature_importances = pd.DataFrame({'features': feature_names, 'important': clf.feature_importances_})feature_importances.sort_values(by='important', ascending=False)# 去掉特征主要程度低的特征
good_features = feature_importances['features'].values[:10]

特征筛选后,重新训练 kmeans 聚类算法:

print('训练集正确率:{:f},精确率:{:f},召回率:{:f},F1-Score:{:f}'.format(accuracy_score(pred_trains, train_y),precision_score(pred_trains, train_y),recall_score(pred_trains, train_y),f1_score(pred_trains, train_y))
)
print('测试集正确率:{:f},精确率:{:f},召回率:{:f},F1-Score:{:f}'.format(accuracy_score(pred_tests, test_y),precision_score(pred_tests, test_y),recall_score(pred_tests, test_y),f1_score(pred_tests, test_y))
)
训练集正确率:0.925711,精确率:0.765743,召回率:0.534271,F1-Score:0.629400
测试集正确率:0.917910,精确率:0.591837,召回率:0.547170,F1-Score:0.568627

        可以看出,经过特征选择后,测试集的预测 F1-Score 从 0.460526 提升到 0.568627,同时由于特征维度的降低,运行速度也加快!

7. 结论

网络流量分类或网络流量异常检测,采用基于聚类的机器学习算法,实现异常检测与分类,即划分为正常流量和异常流量。 本项目利用 pandas + Matplotlib + seaborn + sklearn 对网络流量数据进行统计分析,并构建聚类算法实现对流量的分类建模。

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。

技术交流认准下方 CSDN 官方提供的学长 Wechat / QQ 名片 :)

 精彩专栏推荐订阅:

1. Python 毕设精品实战案例
2. 自然语言处理 NLP 精品实战案例
3. 计算机视觉 CV 精品实战案例

基于KMeans聚类算法的网络流量分类预测相关推荐

  1. 基于Kmeans聚类算法的图像分割(色彩分割)实战

    基于Kmeans聚类算法的图像分割(色彩分割)实战 图像分割是将一幅图像分割成多个像素区域的任务.属于同一对象类型的所有像素都被分配到同一类别下.图像分类是给一副完整的图像一个类别,目标检测是检测到图 ...

  2. 基于K-means聚类算法进行客户人群分析

    摘要:在本案例中,我们使用人工智能技术的聚类算法去分析超市购物中心客户的一些基本数据,把客户分成不同的群体,供营销团队参考并相应地制定营销策略. 本文分享自华为云社区<基于K-means聚类算法 ...

  3. python音频聚类_用K-means聚类算法实现音调的分类与可视化

    本文由 伯乐在线 - ggspeed 翻译,耶鲁怕冷 校稿.未经许可,禁止转载! 英文出处:jared polivka.欢迎加入翻译组. 利用 K-means 聚类算法来聚类和可视化音调 Galvan ...

  4. 基于K-Means聚类算法的主颜色提取

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 01.简介 本期我们将一起实现基于K-Means聚类算法的主色提取 ...

  5. 【matlab】机器学习与人工智能期末课设,基于 K-means 聚类算法的图像区域分割系统

    基于 K-means 聚类算法的图像区域分割系统主要由两部分组成,分别是登录界面和主界面.用户登录模块负责用户的登录功能,用户输入账号和密码正确后,进入主界面,失败则跳出弹窗,提示用户登录失败.这是用 ...

  6. 基于K-Means聚类算法对NBA球员数据的聚类分析

      聚类分析的研究成果主要集中在基于距离(或者称为基于相似度)的聚类方法,用距离来作为相似性度量的优点是十分直观,从我们对物体的识别角度来分析,同类的数据样本是相互靠近的,不同类样本应该相聚较远.K- ...

  7. m基于K-means聚类算法和神经网络的模糊控制器设计matlab仿真

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 聚类就是按照某个特定标准把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同 ...

  8. 实战案例!基于 K-Means 聚类算法的客户精准营销模型

    客群细分对于企业了解目标受众非常重要.根据受众群体的不同,我们可以给采取不同的营销策略.目前有许多无监督的机器学习算法可以帮助公司识别他们的用户群并创建消费群体. 在本文中,我将分享一种目前比较流行的 ...

  9. 【图像分割】基于 K-means 聚类算法实现图像区域分割matlab代码

    1 简介 对图像进行颜色区域分割.将图像转换到CIE L*a*b颜色空间,用K均值聚类分析算法对描述颜色的a*和b*通道进行聚类分析;通过提取各个颜色区域独立成为单色的新图像,对图像进行分割处理.实验 ...

最新文章

  1. “中台不就是微服务吗?有啥区别?”
  2. java ajax无刷分页_asp.net+ajax+json来实现无刷新分页功能
  3. 【转载保存】ExecutorService中submit和execute的区别
  4. thinkphp6 redis并发解决处理方案
  5. 卢伟冰晒红米Note 7Pro拍月亮样张 有无外设差别巨大
  6. BJOI2018 简要题解
  7. pandas表字段为空用其余表替换
  8. TensorFlow游乐场及神经网络简介
  9. 8 -- 深入使用Spring -- 2... Spring的“零配置”支持
  10. YUI-compressor 在Linux下安装和使用
  11. Ubuntu 配置 SFTP 服务器
  12. apk反编译教程(2022win11亲测)
  13. 《凤凰项目:一个IT运维的传奇故事》的读后感
  14. 【DNN】——多尺度注意力
  15. python pyinstaller使用方法_【python快手菜】pyinstaller使用指南
  16. 020.3.25普及C组 母鸡下蛋(hen)【纪中】【模拟】
  17. Spring初窥门径
  18. 浏览器无法上网解决方案
  19. 09-kafka分区数的设置
  20. ansible防火墙firewalld设置

热门文章

  1. Python学习——import用法
  2. 泡泡机器人SLAM公开课链接(实时更新中)
  3. 计算机cpu风扇的结构,“电脑专家”教你如何拆cpu风扇【图文教程】
  4. ricequant量化跟别的量化平台有什么不同?
  5. python如何使用sdk_如何使用SDK开发一个博客
  6. python:实现DBSCAN聚类算法(附完整源码)
  7. VS2019使用教程(使用VS2019编写C语言程序)
  8. 鼎捷软件数字中国建设成果展亮相,赋能工业数字化转型
  9. c++设计模式之单例模式
  10. ASP.NET新闻发布网站