机器学习之KNN检测恶意流量

2023-11-11

背景

任何智能活动的都可以称为人工智能,而机器学习(Machine Learning)属于人工智能的一个分支,深度学习(Deep Learning)则是机器学习的分支。近年来,随着基础设施的完善,海量大数据的积累,机器学习方法理论越来越成熟,算力的大幅度提升,互联网企业也越来越愿意增大在AI领域的投入,AI的优势在于处理海量数据提取捕获其中有用信息上发挥着非常重要的作用,如OCR领域图片鉴黄、自然语言处理方面的恶意言论捕获、风控领域画像、推荐系统等。

机器学习之KNN检测恶意流量_Java

概念
在这里插入图片描述

目的
通过机器学习的方式识别恶意流量

特征工程
使用sklearn的TFIDF、2ngram进行分词

什么是TF-IDF

TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。

词频(TF) = 某个词在文章中的出现次数

逆文档频率(IDF) = log(语料库的文档总数/包含该词的文档总数+1)

公式:TF-IDF = TF * IDF

举例:假设一篇文章中由1万个词组成,其中“跨站脚本”,“web”,“安全”,“攻击”几个词各出现100次,那么他们对应的词频TF就是 TF = 100/10000 = 0.01。

语料库中一共有1000篇文章,其中包含“跨站脚本”的有9篇,包含“web”的有89篇,包含“安全”的有399篇,包含“攻击”的有499篇,那他们对应的TDF如下,由TFIDF值可知这篇文章重点应该是在讲“跨站脚本”
在这里插入图片描述

流程
数据集正例样本10万,数据集负例样本5万,由于初始负例样本不足,可以在特征工程阶段将负例样本*2扩大负例样本的数据集数量,但效果不会很明显,一般在深度学习的时候特征样本不足我会这样做数据扩展。

对数据做一些基础的特征工程对连续的数字或单独的数字都转化为’8’,将quries里的https|http转化成同一个特征量等等

label 0 标记正例样本,label 1 标记负例样本

class LR(object):
def init(self):

self.goodX = self.DecodeQuery(“./goodX.txt”)
self.badX = self.DecodeQuery(“./badqX.txt”)
self.goodY = [0] * len(self.goodX)
self.badY = [1] * len(self.badX)
self.vectorizer = TfidfVectorizer(ngram_range=(1, 3))
self.X = self.vectorizer.fit_transform(self.goodX + self.badX)

1.def DecodeQuery(self, fileName):    data = [x.strip() for x in open(fileName, "r").readlines()]    query_list = []    for item in data:        item = item.lower()        if len(item) > 50 or len(item) < 5:            continue                h = HTMLParser()        item = h.unescape(item)        item = parse.unquote(item)        item, number = re.subn(r'\d+', "8", item)        item, number = re.subn(r'(http|https)://[a-zA-Z0-9\.@&/#!#\?:]+', "http://u", item)        query_list.append(item)    return list(set(query_list))

模型训练与预测

train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签,其中test_size是代表要划分出多少的数据做为测试集,random_state是种子,也就是说当random_state不为0时,每次train_test_split生成的数据集是一致的,以便与我们在初期阶段保持数据集一致进行调试。

模型使用KNN(K-Nearest neigbour,KNN)Cover和Hart在1968年提出了最初的邻近算法。所谓KNN,就是K个最近邻居的意思。说的是每个样本都可以用它最接近的k个邻居来代表。属于一种有监督的分类(Classification)算法,同时属于懒惰学习(lazy learning)即KNN没有显式的学习过程,也就是没有训练数据的阶段,所以也代表了该阶段的时间开销为零,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。
机器学习之KNN检测恶意流量_Java_02

KNN三要素

1.K值的选择:对于K值的选择,如果K值较小表示使用较小邻域中的样本进行预测,训练误差会减少,但是模型会变得复杂,容易过拟合。

2.距离的度量:一般使用欧几里得距离

3.决策规则:分类模型中使用多数表决的方式或者加权表决(距离与权重成反比);在回归模型中,使用平均值法

KNN的优化

当如果有大量的数据输入的时候为了加快检索,引入了优化算法,相当于是使用了特殊的结构来保存数据,以减少数据的检索次数。

KNN的使用

def TrainModel(self):

    X_train, X_test, y_train, y_test = train_test_split(self.X, self.goodY + self.badY, test_size=0.2, random_state=16)

    knn = neibours.KNeiborsClassifier(n_neibours=5)

    knn.fit(X_train, y_train)

    joblib.dump(knn, "knn.pickle")

在做模型训练的时候,尤其是在训练集上做交叉验证,通常想要将模型保存下来,然后放到独立的测试集上测试,scikit-learn已经有了模型持久化的操作,存储模型(持久化)一般就两种方式一种是joblib和pickle

倒入模块 from sklearn.externals import joblib

保存模型 joblib.dump(model,’filename.pkl’)

读取模型 joblib.load(modelName)

def Predicts(self, modelName, fileName):

    knn = joblib.load(modelName)

    input_x = self.DecodeQuery(fileName)

    X_predict = self.vectorizer.transform(input_x)

    res = knn.predict(X_predict)

    res_list = []        for url , y in zip(input_x, res):

        label = '正常请求' if y == 0 else '恶意请求'

        print(label , url )

最终预测结果

这里算法笔者用的KNN,但KNN属于懒惰算法,最大但缺点之一在于在数据量庞大的时候运算会非常的慢,另外一个会受离群点的影响,这个knn的例子只适合做试验讲解,因为KNN具有良好的可解释性上

1.恶意请求 /cgi-home/ion-p?page=../../../../../etc/passwd

2.恶意请求 <svg><script xlink:href=data:,alert(8) />

3.恶意请求 /./\/././\/././\/././\/././\/././\/././\/./{file}

4.正常请求 /scripts_photositeprinting/正常请求 /main.php?stuff="&ver&rem\xa8

总结

机器学习比较痛苦的是调参数、做特征工程,本文没有特意去做特征工程使用了ngram分词实现的特征,调参的话懒人可以通过GridSearch和RandomizedSearchCV进行搜索

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习之KNN检测恶意流量 的相关文章

  • 从Python中的对象列表中提取属性列表

    我有一个uniformpython 中的对象列表 class myClass object def init self attr self attr attr self other None objs myClass i for i in
  • Pandas groupby 和描述标志 AttributeError

    我有一堆数据存储在vals 指数是单调的 但不连续 我试图对数据的直方图进行一些分析 因此我创建了以下结构 hist pd DataFrame vals hist bins pd cut vals 100 这是从实验仪器中获取的数据 我知道
  • del 在 Python 中什么时候有用?

    我实在想不出为什么 Python 需要del关键字 大多数语言似乎没有类似的关键字 例如 我们可以分配一个变量 而不是删除一个变量None到它 当从字典中删除时 del可以添加方法 有理由保留吗del在Python中 还是Python前垃圾
  • 使用seaborn,我如何在散点图上画一条我选择的线?

    我希望能够在seaborn 生成的图中画出一条符合我规范的线 我选择的图是 JointGrid 但任何散点图都可以 我怀疑seaborn可能不容易做到这一点 以下是绘制数据的代码 来自 Iris 数据集的花瓣长度和花瓣宽度的数据帧 impo
  • AttributeError:“函数”对象没有属性“编译”

    我一直面临这个属性错误 有什么想法可以解决它吗 def model input shape model keras Sequential model add keras layers LSTM 64 input shape 1 9 retu
  • AMLS 实验运行停留在“正在运行”状态

    我运行了 Azure 机器学习服务实验 并使用 Jupyter Notebook 记录了神经网络损失 日志记录工作正常 神经网络训练也按预期完成 但实验一直停留在运行状态 关闭计算资源不会关闭实验运行 我无法从实验面板取消它 此外 运行没有
  • 如何在不使用pygame的情况下检测按键事件和按键按住事件

    我目前正在寻找一个能够检测 监视键盘的库 我的目的是检测何时按下某个键 以及当它发生时应该发生一些事情 大多数 SO 帖子建议使用 pygame 但我发现它有点太多了 涉及一个像这样的库来完成这个简单的任务 我也尝试过pynput 这导致只
  • Keras ImageDataGenerator 验证分割未从打乱的数据集中选择

    如何将图像数据集随机拆分为训练数据集和验证数据集 更具体地说 validation splitKeras 中的论证ImageDataGenerator函数不是随机地将我的图像分割为训练和验证 而是从未洗牌的数据集中分割验证样本 当指定val
  • 如何从数据存储区刷新 NDB 实体?

    我希望能够在我的代码调用的测试中断言Model put 对于已修改的实体 不幸的是 似乎正在进行一些缓存 例如以下代码 from google appengine ext import ndb class MyModel ndb Model
  • 如何有效地找到两个轮廓集之间的所有交点

    我想知道找到两组轮廓线之间所有交点 舍入误差 的最佳方法 哪种方法最好 这是示例 import matplotlib pyplot as plt import numpy as np x np linspace 1 1 500 X Y np
  • 如何使用 BeautifulSoup 排除表中的某些行?

    我已经从表格中获得了所需的数据 但不想要各个玩家统计数据之间的缩写 Rk Pos Name 等 如何在保留所需数据的同时排除这些数据 包含缩写的行被归类为 thead 但我不知道如何使用该信息来跳过它 我知道玩家的数据都被压缩在一起 但现在
  • 从 paramiko 获取 PID

    我找不到一个简单的答案 我正在使用 paramiko 远程登录并执行多个进程 我需要每个进程的 PID 以便稍后检查它们 paramiko 中似乎没有函数来获取执行命令的 PID 所以我尝试使用以下命令 stdin stdout stder
  • python中matlab find函数的替换

    我正在尝试寻找合适的python函数来替代matlabfind在我的脚本和一些谷歌搜索中我看到np where 大多数时候都能解决目的 但在双重条件的情况下 我有不同的输出 有人可以告诉我这种方法有什么问题以及如何继续吗 示例代码和差异如下
  • 如何在Python中按天对时间序列数据求和? resample.sum() 没有效果

    我是Python新手 如何根据日期求和数据并绘制结果 我有一个 Series 对象 其数据如下 2017 11 03 07 30 00 NaN 2017 11 03 09 18 00 NaN 2017 11 03 10 00 00 NaN
  • 无法通过蓝牙读取心率服务

    我希望创建一个简单的 python 脚本 通过蓝牙从 Polar 传感器读取心率数据 我已经阅读了很多其他帖子 但找不到我能够成功执行的简单内容 我有 Polar 可穿戴设备的设备 MAC 地址 我知道我想要读取的值的服务 UUID HR
  • Python Selenium 将内容添加到 pandas 数据帧

    我正在尝试循环list用于抓取内容的邮政编码this url http kadastralekaart com 但我面临着错误 例如TimeoutException and StaleElementReferenceException 我该
  • PySpark:根据与另一列中的字符串匹配的字典值创建新列

    我有一个数据框 A 如下所示 ID SOME CODE TITLE 1 024df3 Large garden in New York New York 2 0ffw34 Small house in dark Detroit Michig
  • 二进制补码扩展 python?

    我想知道是否有一种方法可以像在 Python 中的 C C 中一样使用标准库 最好在位数组上 进行二进制补码符号扩展 C C Example program include
  • 如何在(最好是纯)Python 中解码 QR 码图像?

    TL DR 我需要一种使用 最好是纯 Python 从图像文件中解码 QR 码的方法 我有一个带有 QR 码的 jpg 文件 我想使用 Python 对其进行解码 我发现有几个库声称可以做到这一点 PyQRCode 网站在这里 http p
  • 检查Python multiprocessing.Connection 的实例吗?

    Connection对象是在打开时创建的multiprocessing Pipe 然而 尚不清楚如何检查一个对象是否是一个实例Connection 在Python3 3 4 3 3 3 2 中 检测Connection我可以 from mu

随机推荐

  • HTML5全栈工程师好就业吗

    2017突然流行起来的一个新职位 全栈工程师 大概在很多人眼里 全栈工程师是一个全能人才 事实的确如此 以web前端为主 需求 后台 前台 用户 设计等内容为辅 全栈工程师拥有更广阔的视野和更广泛的学识 全栈工程师可以从更高的角度去看待问题
  • 基于FPGA的卷积神经网络实现(一)简介

    目录 简介 框架 资源分配 1 资源分配 2 数据量化 1 数据量化 2 数据读写 卷积模块 池化 全连接与输出 事先声明 仅用于记录和讨论 有任何问题欢迎批评指正 只是觉得菜的大佬们请绕路 就不用在这里说大实话了 因为本身就是一个粗糙的d
  • 2021-11-16尤破金11.16黄金原油今日行情涨跌趋势分析及周二多空操作建议布局

    黄金最新行情分析 黄金消息面解析 周一现货黄金持稳于1863附近 上周五金价探底回升并实现七连涨 受到美国消费信心大幅下滑和美元走软的支撑 自11月以来 金价已上涨高达110美元 这得益于对通胀的担忧加深 以及主要央行保证将暂时把利率保持在
  • jsp页面获取参数的方法(url解析、el表达式赋值、session取值)【原创】

    最近使用myEclispse做网站 使用jsp js css做页面 网站中常用到从列表进入详情页面的跳转 下面对详情页面的值填充方式做一个简单总结 1 url中使用 request获取参数 jsp上方添加type参数
  • 23个CVPR 2020收录的新数据集,都在这里了!

    编辑 Amusi Date 2020 06 20 来源 CVer微信公众号 链接 23个CVPR 2020收录的新数据集 都在这里了 前言 Amusi 之前整理了1467篇CVPR 2020所有论文PDF下载资源 以及300篇 CVPR 2
  • HBuilder html 乱码解决,java eclipse等应当同理

    1 网上下载了一套html代码 出现乱码 一般就是编码格式问题 2 解决方式 更改编码 3 剪切所有内容 然后右下角修改编码为utf 8 4 再粘贴内容 5 访问页面
  • (必行方案)PPT快捷键复制一次粘贴两次问题

    问题 复制的时候复制一次 粘贴的时候在Word Excel都正常但是PPT里面不正常 只有使用PPT的时候出现粘贴两次的问题 Word和Excel中Ctrl C后Ctrl V粘贴一次 没有问题 PPT中Ctrl V时粘贴2次 而用右键粘贴方
  • 系数矩阵与系统稳定性的关系

    对连续时间线性定常控制系统而言 系统内部渐近稳定的充分必要条件是其系数矩阵A的特征值都在复平面的左半开平面内 对连续时间线性定常控制系统而言 系统输入 输出稳定的充分必要条件是其特征方程的根 传递函数的极点 全都在复平面的左半平面内 离散时
  • Linux的简单介绍

    LINUX操作系统是一种免费使用和自由传播的类UNIX操作系统 其内核由林纳斯 托瓦兹于1991年10月5日首次发布 是一个基于POSIX的多用户 多任务 支持多线程和多CPU的操作系统 它能运行主要的Unix工具软件 应用程序和网络协议
  • 03-03 周五 镜像安装sshd和jupyter以及修改密码

    03 03 周五 镜像安装sshd和jupyter以及修改密码 时间 版本 修改人 描述 2023年3月3日15 34 49 V0 1 宋全恒 新建文档 简介 由于在镜像中需要进行jupyter和sshd的安装 并且需要进行密码的修改 因此
  • 在 Windows 10下安装Flutter+Dart+Android Studio 配置Flutter开发环境

    在 Windows 10下安装Flutter Dart Android Studio 配置Flutter开发环境 文章首发地址 配置环境变量 由于部分网站被墙的原因 我们需要先配置Flutter国内镜像地址 这两个地址是由Flutter官方
  • html css开关按钮样式,纯CSS实现开关按钮

    上面这种开关按钮在现代网页UI设计中经常出现 代替了以前丑陋的checkbox 在很多UI框架中如elementUI都有组件可以直接使用 但是画出这样一个开关是十分简单的 不需要借助JS代码就可以实现 核心思路就是将原有input框进行隐藏
  • github响应时间过长且修改hosts无效【解决办法】

    打开ipaddress com 分别键入 github global ssl fastly net 和 github com 查询到对应的IP地址 打开hosts文件 并新增 hosts文件地址 win下 C Windows System3
  • 我提交的第一个Flink commit - Flink 闭包检查

    为什么闭包 Flink中算子都是通过序列化分发到各节点上 所以要确保算子对象是可以被序列化的 算子的成员变量 代码中的匿名内部类都是检查的范围 闭包检查入库 被调用的入口是 StreamExecutionEnvironment clean
  • Typora 常用快捷键

    文章目录 Typora 常用快捷键 一 菜单栏 二 文件 三 编辑 四 段落 五 格式 六 视图 七 设置颜色 Typora 常用快捷键 一 菜单栏 文件 alt F 编辑 alt E 段落 alt P 格式 alt O 视图 alt V
  • cahtgpt有哪些优势

    ChatGPT丨小智ai丨chatgpt丨人工智能丨OpenAI丨聊天机器人丨AI语音助手丨GPT 3 5丨开源AI平台 ChatGPT是一种基于深度学习技术的自然语言处理模型 它可以自主地从大量的文本数据中学习和理解自然语言 从而实现自然
  • hbuildx中使用真机调试

    前言 使用真机调试的原因是我开发uni app项目 调试一直是在浏览器中选择手机模式进行调试的 但是打包安装到手机以后 发现很多样式变化很大 完全不符合预期 这时我知道浏览器是不能完全匹配手机的效果的 模拟器 于是我开始找模拟器 市面上模拟
  • Dictionary字典类使用范例

    原文发布时间为 2009 11 04 来源于本人的百度文章 由搬家工具导入 using System using System Web UI WebControls using System Collections Generic publ
  • Qt

    参考博客 QThread必须要了解的几个函数 https blog csdn net t46414704152abc article details 52155777 设计思路 读文件生成sql语句写入内存为一个线程 返回sql语句给主线程
  • 机器学习之KNN检测恶意流量

    背景 任何智能活动的都可以称为人工智能 而机器学习 Machine Learning 属于人工智能的一个分支 深度学习 Deep Learning 则是机器学习的分支 近年来 随着基础设施的完善 海量大数据的积累 机器学习方法理论越来越成熟