背景

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

概念

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

特征工程
使用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三要素

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/passwd2.恶意请求 <svg><script xlink:href=data:,alert(8) />3.恶意请求 /./\/././\/././\/././\/././\/././\/././\/./{file}4.正常请求 /scripts_photositeprinting/正常请求 /main.php?stuff="&ver&rem\xa8

总结

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

机器学习之KNN检测恶意流量相关推荐

  1. 深度学习之Keras检测恶意流量

    Keras介绍 Keras是由 Python 编写的神经网络库,专注于深度学习,运行在 TensorFlow 或 Theano 之上.TensorFlow和Theano是当前比较流行的两大深度学习库, ...

  2. web应用防火墙检测恶意流量的方法

    web应用防火墙检测异常或恶意流量主要是基于以下几个模型: 第一,如果WAF采用黑名单的做法,它只会阻止列表中包含已知攻击的请求.众所周知的攻击(例如SQL注入.拒绝服务和跨站脚本)通常包含容易检测的 ...

  3. 基于机器学习和背景流量数据的加密恶意流量检测

    文章目录 1 加密流量现状 1.1 加密流量检测的必要性 1.2 加密恶意流量的检测方法 2 加密流量特征分析 2.1 可观察的数据元统计特征 2.1.1 传统流数据 2.1.2 字节分布 2.1.3 ...

  4. 机器学习之恶意流量检测的特征工程

    背景 传统的机器学习除了使用Tfidf-ngram的方式外还有其他做特征工程方式,还可以通过定义不同维度的特征来做特征工程,这种特征工程方式需要安全工程师对每一种攻击有良好特征提取能力.这种方法举个例 ...

  5. 融合多头注意力机制的网络恶意流量检测

    摘要 [目的]现有的网络恶意流量检测方法依赖统计特征进行建模,忽略了网络流量本身所具备的时序特征,通过对时序特征的提取.学习.建模,可以进一步提高网络恶意流量检测精度.[方法]将网络流量以会话为基本单 ...

  6. 加密恶意流量检测思路分析

    文章目录 背景及现状 加密恶意流量特征分析 特征类别 特征提取 加密恶意流量检测流程 数据采集 特征工程 模型训练 参考资料 背景及现状 为了确保通信安全和隐私以及应对各种窃听和中间人攻击,HTTPS ...

  7. 利用机器学习方法检测识别TLS加密恶意流量

    摘要:本文总结提出了一种主流的机器学习加密流量分析的方法 如何在不侵犯个人隐私的前提下,在加密流量中检测恶意攻击行为,为了找到一种切实可行的"在加密流量中检测恶意攻击行为"的方法, ...

  8. Maltrail恶意流量检测系统

    Maltrail恶意流量检测系统 项目介绍 项目GitHub地址 项目架构 项目数据集 运行方式 订阅源扩展 数据采集模块提取 项目介绍 maltrail是一款轻量级的恶意流量检测系统,其工作原理是通 ...

  9. [当人工智能遇上安全] 6.基于机器学习的入侵检测和攻击识别——以KDD CUP99数据集为例

    您或许知道,作者后续分享网络安全的文章会越来越少.但如果您想学习人工智能和安全结合的应用,您就有福利了,作者将重新打造一个<当人工智能遇上安全>系列博客,详细介绍人工智能与安全相关的论文. ...

最新文章

  1. 表单提交、页面注册案例
  2. 智能连接:5G与人工智能、物联网等技术的超级融合
  3. Android Studio 1.1.0 导入eclipse android project
  4. C语言循环求出2的10次幂,C语言求2的100次幂的结果.doc
  5. 为什么delete表,还会占磁盘空间?
  6. double operator[](int i)_java中double类型精度丢失问题及解决方法
  7. 2.JVM和DVM之间的区别
  8. 爽到爆!阿里腾讯都在用的API管理神器,API文档、测试、Mock全搞定
  9. Eclipse自动生成作者、日期注释等功能设置
  10. 2019最新 Java商城秒杀系统的设计与实战视频教程(SpringBoot版)_1-4系统的整体演示...
  11. linux看注册的定时任务,Linux下定时任务的查看及取消
  12. Power Query M语言全部list函数,快速分类掌握
  13. python基础:基础语法
  14. 日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践
  15. 抖音巨量百应怎么发福袋?四川鹰迪
  16. bzoj1605 / P2905 [USACO08OPEN]农场危机Crisis on the Farm
  17. 收藏的JAVA面试题大全
  18. Matlab 中一些符号的含义
  19. 云电脑用什么连接键盘才能玩游戏
  20. 【隧道篇 / IPsec】(7.0) ❀ 03. 建立IPsec安全隧道后手动添加访问IP网段 ❀ FortiGate 防火墙

热门文章

  1. 电容充放电时间计算方法(指数衰减脉冲) 附C代码模拟实现
  2. 计算机组成原理带进位加运算,计算机组成原理实验运算器进位.doc
  3. 地址解析协议ARP工作过程
  4. android 编译步骤分析之envsetup.sh
  5. 新冠肺炎疫苗接种发生疑似预防接种异常反应和相关突发状况的处理
  6. java取石子_40.从某工地现场石子堆放区取石子5Kg,放入水中达到吸水饱和后,将表面擦干后称得质量为5.5 Kg,烘干后质量为4.7 Kg。该料场石子的吸水率为( )。...
  7. 2021云栖大会:阿里云自研技术大爆发,连发多款重磅产品
  8. 代码战争之围攻STONEHOLD
  9. VMware虚拟机配置
  10. 项目与文档【3001】PJM随谈-基于瀑布开发模型的项目管理