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

背景

任何智能活动的都可以称为人工智能,而机器学习(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进行搜索

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: B'educoder机器学习KNN算法'是指在机器学习中,使用KNN(K-最近邻)算法进行数据分类或回归的过程。它通过计算每个样本点与其最近的k个邻居之间的距离来分类或回归。该算法常用于给定一些已经被分类或回归的数据,以对新的、未知的数据进行分类或回归。 ### 回答2: KNN算法是机器学习中最常见的分类算法之一,属于无参数的非线性算法,也是解决分类问题的一种最简单有效的算法之一。KNN全称为K-Nearest Neighbor算法,它的主要思想是如果一个样本在特征空间中的k个最相似(即特征空间中最近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。 KNN算法的主要流程是先将数据集中所有实例按照特征向量之间的距离从小到大进行排序,然后选取相邻的K个样本,根据它们属于的类别计算出该样本的类别,即选取K个样本中出现最多的类别作为该样本的预测类别。通常情况下,K的选择是非常重要的,如果K太小会使得预测错误率变高,而K太大会使得不同的样本预测出的类别相同,从而无法实现分类。 KNN算法的应用非常广泛,包括文本分类、图像识别、推荐系统等领域。由于该算法的思路简单易懂且计算量相对较小,因此它在大数据时代依然被广泛应用。同时,在KNN算法的基础上也有很多改进算法被提出,如KD树、球树等,它们可以有效地提高KNN算法的运行效率和准确率。 在educoder机器学习的学习中,我们可以利用Python语言的scikit-learn库实现KNN算法。该库提供了KNeighborsClassifier类,它可以根据给定的数据集和K值训练KNN分类器,并用来预测新的样本。在使用scikit-learn库进行分类问题解决时,通常需要将数据进行归一化处理,以避免特征之间的差异对结果的影响。同时,还需要采用交叉验证等方法优化模型的参数和选择最优的K值,从而提高KNN算法的准确率和泛化能力。 总的来说,KNN算法是机器学习中一种简单有效的分类算法,它的应用非常广泛。在educoder机器学习的学习中,我们可以通过掌握KNN算法的基本原理和应用方法,来更好地应用这种算法解决实际的分类问题。 ### 回答3: KNN(K-Nearest Neighbor)算法是一种基本的分类和回归算法,经常被用于机器学习中。其基本思想是预测未知的样本所属类别或预测目标值,通过已知的样本集来找到与未知样本最近的K个样本(即K个最近邻)来进行预测。KNN算法的核心是距离度量和K值的选择。 在KNN算法的训练过程中,首先需要将所有样本的特征向量保存在内存里。对于一个未知的样本,计算其与内存中所有样本的距离,并选出离该样本最近的K个样本。可以使用欧式距离或曼哈顿距离来度量距离。在分类问题中,K个邻居样本中占比最大的那个类别即为预测结果;在回归问题中,K个邻居的目标值的平均值或加权平均值即为预测结果。 KNN算法的优点是简单有效,不需要训练过程,可以自适应地进行分类或回归。但也存在缺点,如不善处理多分类问题和高维数据,受样本分布的影响较大等。在实际应用中,可以采用交叉验证和特征选择等手段来解决一些问题。 在educoder机器学习KNN算法教学中,可以学习到该算法的具体实现和应用,如如何选择距离度量、K值的选择和分类与回归问题的应用。同时也可以通过练习和作业来加深对算法的理解和掌握。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小黑安全

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值