‘壹’ 基于机器学习的行人检测方法有哪些
行人检测方法太多。就现在来看的话,深度卷积神经网络绰绰有余了。
不用深度学习的话,直接生成Object Proposal(表征目标的大致位置),可以用Selective Search,bing或者Edgebox等,然后对proposal指向的图像区域放缩后用支持向量机来分类也行。
再不济的话连肤色检验这种笨方法也能有一定效果(不用寄予厚望)。
‘贰’ 如何检测未知异常行为
漏洞扫描有以下四种检测技术:
1.基于应用的检测技术。它采用被动的、非破坏性的办法检查应用软件包的设置,发现安全漏洞。
2.基于主机的检测技术。它采用被动的、非破坏性的办法对系统进行检测。通常,它涉及到系统的内核、文件的属性、操作系统的补丁等。这种技术还包括口令解密、把一些简单的口令剔除。因此,这种技术可以非常准确地定位系统的问题,发现系统的漏洞。它的缺点是与平台相关,升级复杂。
3.基于目标的漏洞检测技术。它采用被动的、非破坏性的办法检查系统属性和文件属性,如数据库、注册号等。通过消息文摘算法,对文件的加密数进行检验。这种技术的实现是运行在一个闭环上,不断地处理文件、系统目标、系统目标属性,然后产生检验数,把这些检验数同原来的检验数相比较。一旦发现改变就通知管理员。
4.基于网络的检测技术。它采用积极的、非破坏性的办法来检验系统是否有可能被攻击崩溃。它利用了一系列的脚本模拟对系统进行攻击的行为,然后对结果进行分析。它还针对已知的网络漏洞进行检验。网络检测技术常被用来进行穿透实验和安全审记。这种技术可以发现一系列平台的漏洞,也容易安装。但是,它可能会影响网络的性能。
网络漏洞扫描
在上述四种方式当中,网络漏洞扫描最为适合我们的Web信息系统的风险评估工作,其扫描原理和工作原理为:通过远程检测目标主机TCP/IP不同端口的服务,记录目标的回答。通过这种方法,可以搜集到很多目标主机的各种信息(例如:是否能用匿名登录,是否有可写的FTP目录,是否能用Telnet,httpd是否是用root在运行)。
在获得目标主机TCP/IP端口和其对应的网络访问服务的相关信息后,与网络漏洞扫描系统提供的漏洞库进行匹配,如果满足匹配条件,则视为漏洞存在。此外,通过模拟黑客的进攻手法,对目标主机系统进行攻击性的安全漏洞扫描,如测试弱势口令等,也是扫描模块的实现方法之一。如果模拟攻击成功,则视为漏洞存在。
在匹配原理上,网络漏洞扫描器采用的是基于规则的匹配技术,即根据安全专家对网络系统安全漏洞、黑客攻击案例的分析和系统管理员关于网络系统安全配置的实际经验,形成一套标准的系统漏洞库,然后再在此基础之上构成相应的匹配规则,由程序自动进行系统漏洞扫描的分析工作。
所谓基于规则是基于一套由专家经验事先定义的规则的匹配系统。例如,在对TCP80端口的扫描中,如果发现/cgi-bin/phf/cgi-bin/Count.cgi,根据专家经验以及CGI程序的共享性和标准化,可以推知该WWW服务存在两个CGI漏洞。同时应当说明的是,基于规则的匹配系统有其局限性,因为作为这类系统的基础的推理规则一般都是根据已知的安全漏洞进行安排和策划的,而对网络系统的很多危险的威胁是来自未知的安全漏洞,这一点和PC杀毒很相似。
这种漏洞扫描器是基于浏览器/服务器(B/S)结构。它的工作原理是:当用户通过控制平台发出了扫描命令之后,控制平台即向扫描模块发出相应的扫描请求,扫描模块在接到请求之后立即启动相应的子功能模块,对被扫描主机进行扫描。通过分析被扫描主机返回的信息进行判断,扫描模块将扫描结果返回给控制平台,再由控制平台最终呈现给用户。
另一种结构的扫描器是采用插件程序结构。可以针对某一具体漏洞,编写对应的外部测试脚本。通过调用服务检测插件,检测目标主机TCP/IP不同端口的服务,并将结果保存在信息库中,然后调用相应的插件程序,向远程主机发送构造好的数据,检测结果同样保存于信息库,以给其他的脚本运行提供所需的信息,这样可提高检测效率。如,在针对某FTP服务的攻击中,可以首先查看服务检测插件的返回结果,只有在确认目标主机服务器开启FTP服务时,对应的针对某FTP服务的攻击脚本才能被执行。采用这种插件结构的扫描器,可以让任何人构造自己的攻击测试脚本,而不用去了解太多扫描器的原理。这种扫描器也可以用做模拟黑客攻击的平台。采用这种结构的扫描器具有很强的生命力,如着名的Nessus就是采用这种结构。这种网络漏洞扫描器的结构如图2所示,它是基于客户端/服务器(C/S)结构,其中客户端主要设置服务器端的扫描参数及收集扫描信息。具体扫描工作由服务器来完成。
‘叁’ 1.什么是误用入侵检测
入侵检测(Intrusion Detection),顾名思义,就是对入侵行为的发觉。他通过对计算机网络或计算机系统中若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象。
入侵检测系统(intrusion detection system,简称“IDS”)是一种对网络传输进行即时监视,在发现可疑传输时发出警报或者采取主动反应措施的网络安全设备。它与其他网络安全设备的不同之处便在于,IDS是一种积极主动的安全防护技术。 IDS最早出现在1980年4月。 1980年代中期,IDS逐渐发展成为入侵检测专家系统(IDES)。 1990年,IDS分化为基于网络的IDS和基于主机的IDS。后又出现分布式IDS。目前,IDS发展迅速,已有人宣称IDS可以完全取代防火墙。
入侵检测系统检测方法
异常检测方法
在异常入侵检测系统中常常采用以下几种检测方法:
基于贝叶斯推理检测法:是通过在任何给定的时刻,测量变量值,推理判断系统是否发生入侵事件。基于特征选择检测法:指从一组度量中挑选出能检测入侵的度量,用它来对入侵行为进行预测或分类。基于贝叶斯网络检测法:用图形方式表示随机变量之间的关系。通过指定的与邻接节点相关一个小的概率集来计算随机变量的联接概率分布。按给定全部节点组合,所有根节点的先验概率和非根节点概率构成这个集。贝叶斯网络是一个有向图,弧表示父、子结点之间的依赖关系。当随机变量的值变为已知时,就允许将它吸收为证据,为其他的剩余随机变量条件值判断提供计算框架。
基于模式预测的检测法:事件序列不是随机发生的而是遵循某种可辨别的模式是基于模式预测的异常检测法的假设条件,其特点是事件序列及相互联系被考虑到了,只关心少数相关安全事件是该检测法的最大优点。
基于统计的异常检测法:是根据用户对象的活动为每个用户都建立一个特征轮廓表,通过对当前特征与以前已经建立的特征进行比较,来判断当前行为的异常性。用户特征轮廓表要根据审计记录情况不断更新,其保护去多衡量指标,这些指标值要根据经验值或一段时间内的统计而得到。
基于机器学习检测法:是根据离散数据临时序列学习获得网络、系统和个体的行为特征,并提出了一个实例学习法IBL,IBL是基于相似度,该方法通过新的序列相似度计算将原始数据(如离散事件流和无序的记录)转化成可度量的空间。然后,应用IBL学习技术和一种新的基于序列的分类方法,发现异常类型事件,从而检测入侵行为。其中,成员分类的概率由阈值的选取来决定。
数据挖掘检测法:数据挖掘的目的是要从海量的数据中提取出有用的数据信息。网络中会有大量的审计记录存在,审计记录大多都是以文件形式存放的。如果靠手工方法来发现记录中的异常现象是远远不够的,所以将数据挖掘技术应用于入侵检测中,可以从审计数据中提取有用的知识,然后用这些知识区检测异常入侵和已知的入侵。采用的方法有KDD算法,其优点是善于处理大量数据的能力与数据关联分析的能力,但是实时性较差。
基于应用模式的异常检测法:该方法是根据服务请求类型、服务请求长度、服务请求包大小分布计算网络服务的异常值。通过实时计算的异常值和所训练的阈值比较,从而发现异常行为。
基于文本分类的异常检测法:该方法是将系统产生的进程调用集合转换为“文档”。利用K邻聚类文本分类算法,计算文档的相似性。
误用检测方法
误用入侵检测系统中常用的检测方法有:
模式匹配法:是常常被用于入侵检测技术中。它是通过把收集到的信息与网络入侵和系统误用模式数据库中的已知信息进行比较,从而对违背安全策略的行为进行发现。模式匹配法可以显着地减少系统负担,有较高的检测率和准确率。
专家系统法:这个方法的思想是把安全专家的知识表示成规则知识库,再用推理算法检测入侵。主要是针对有特征的入侵行为。
基于状态转移分析的检测法:该方法的基本思想是将攻击看成一个连续的、分步骤的并且各个步骤之间有一定的关联的过程。在网络中发生入侵时及时阻断入侵行为,防止可能还会进一步发生的类似攻击行为。在状态转移分析方法中,一个渗透过程可以看作是由攻击者做出的一系列的行为而导致系统从某个初始状态变为最终某个被危害的状态。
‘肆’ 基于机器学习的区块链网络异常检测 作为一个小白,应该从那方面来进行了解那,麻烦大佬指点一下,谢谢
个人觉得区块链开发技术层面讲就没有靠谱之说,无非是你选择什么样的研发技术团,即使你选择了比较好的研发技术团,也未必能实现你所要求的区块链技术,不同行业和领域有不同的技术指标,更何况这个复杂的新技术。另外一点还要让研发技术团认同你需要应用的机器行业思维,否则开发出来的产品也不可能符合你的要求。我们专注区块链技术专业领域落地,项目已经进行了一年多的时间,还没有成功落地。难度在于推翻传统模式会触及很大的利益链条,所以必须是一个慢慢渗透的过程。
按照你讲的:基于机器学习的区块链,可以理解为你在问一个技术问题。
以上回答,希望对你有所帮助。
‘伍’ 机器学习中的数据预处理有哪些常见/重要的工具
大数据发展的挑战: 目前大数据的发展依然存在诸多挑战,包括七大方面的挑战:业务部门没有清晰的大数据需求导致数据资产逐渐流失;内部数据孤岛严重,导致数据价值不能充分挖掘;数据可用性低,数据质量差,导致数据无法利用;数据相关管理技。
机器学习之常见的数据预处理:原始数据存在的几个问题:不一致;重复;含噪声;维度高。
1.1 数据挖掘中使用的数据的原则
尽可能赋予属性名和属性值明确的含义; 去除惟一属性; 去除重复性; 合理选择关联字段。
1.2 常见的数据预处理方法
数据清洗:数据清洗的目的不只是要消除错误、冗余和数据噪音,还要能将按不同的、不兼容的规则所得的各种数据集一致起来。 数据集成:将多个数据源中的数据合并,并存放到一个一致的数据存储(如数据仓库)中。这些数据源可能包括多个数据库、数据立方体或一般文件。
数据变换:找到数据的特征表示,用维度变换来减少有效变量的数目或找到数据的不变式,包括规格化、规约、切换和投影等操作。 数据规约:是在对发现任务和数据本身内容理解的基础上,寻找依赖于发现目标的表达数据的有用特征,以缩减数据模型,从而在尽可能保持数据原貌的前提下最大限度的精简数据量,主要有两个途径:属性选择和数据抽样,分别针对数据库中的属性和记录。
二、数据清洗
2.1 缺失值处理的两种方法
删除法,根据数据处理的不同角度,删除法可分为以下4种:
(1)删除观测样本 (2)删除变量:当某个变量缺失值较多且对研究目标影响不大时,可以将整个变量整体删除 (3)使用完整原始数据分析:当数据存在较多缺失而其原始数据完整时,可以使用原始数据替代现有数据进行分析; (4)改变权重:当删除缺失数据会改变数据结构时,通过对完整数据按照不同的权重进行加工,可以降低删除数据带来的偏差。
插补法:在条件允许的情况下,找到缺失值的替代值进行插补,尽可能还原真实数据是更好的方法。常见的方法有均值插补、回归插补、二阶插补、热平台、冷平台等单一变量插补。
(1)均值法是通过计算缺失值所在变量所有非缺失观测值的均值,使用均值来代替缺失值的插补方法。 (2)均值法不能利用相关变量信息,因此会存在一定偏差,而回归模型是将需要插补变量作为因变量,其他相关变量作为自变量,通过建立回归模型预测出因变量的值对缺失变量进行插补。 (3)热平台插补是指在非缺失数据集中找到一个与缺失值所在样本相似的样本(匹配样本),利用其中的观测值对缺失值进行插补。 (4)在实际操作中,尤其当变量数量很多时,通常很难找到与需要插补样本完全相同的样本,此时可以按照某些变量将数据分层,在层中对缺失值使用均值插补,即采取冷平台插补法。
2.2 噪声数据处理
噪声是一个测量变量中的随机错误和偏差,包括错误值或偏离期望的孤立点值。
噪声检查中比较常见的方法:
(1)通过寻找数据集中与其他观测值及均值差距最大的点作为异常 (2)聚类方法检测,将类似的取值组织成“群”或“簇”,落在“簇”集合之外的值被视为离群点。 在进行噪声检查后,通常采用分箱、聚类、回归、计算机检查和人工检查结合等方法“光滑”数据,去掉数据中的噪声。
分箱:分箱方法是一种简单常用的预处理方法,通过考察相邻数据来确定最终值。所谓“分箱”,实际上就是按照属性值划分的子区间,如果一个属性值处于某个子区间范围内,就称把该属性值放进这个子区间所代表的“箱子”内。把待处理的数据(某列属性值)按照一定的规则放进一些箱子中,考察每一个箱子中的数据,采用某种方法分别对各个箱子中的数据进行处理。在采用分箱技术时,需要确定的两个主要问题就是:如何分箱以及如何对每个箱子中的数据进行平滑处理。
2.2.1 分箱的方法:有4种:等深分箱法、等宽分箱法、最小熵法和用户自定义区间法。
等深分箱法(统一权重):将数据集按记录行数分箱,每箱具有相同的记录数,每箱记录数称为箱子的深度。这是最简单的一种分箱方法。
设定权重(箱子深度)为4,分箱后
箱1:800 1000 1200 1500
箱2:1500 1800 2000 2300
箱3:2500 2800 3000 3500
箱4:4000 4500 4800 5000
等宽分箱法(统一区间):使数据集在整个属性值的区间上平均分布,即每个箱的区间范围是一个常量,称为箱子宽度。
设定区间范围(箱子宽度)为1000元人民币,分箱后
箱1:800 1000 1200 1500 1500 1800
箱2:2000 2300 2500 2800 3000
箱3:3500 4000 4500
箱4:4800 5000
用户自定义区间:用户可以根据需要自定义区间,当用户明确希望观察某些区间范围内的数据分布时,使用这种方法可以方便地帮助用户达到目的。
如将客户收入划分为1000元以下、1000~2000、2000~3000、3000~4000和4000元以上几组,分箱后
箱1:800
箱2:1000 1200 1500 1500 1800 2000
箱3:2300 2500 2800 3000
箱4:3500 4000
箱5:4500 4800 5000
2.2.2 数据平滑方法
按平均值平滑 :对同一箱值中的数据求平均值,用平均值替代该箱子中的所有数据。 按边界值平滑:用距离较小的边界值替代箱中每一数据。 按中值平滑:取箱子的中值,用来替代箱子中的所有数据。
三、数据集成
数据集成中的两个主要问题是:
(1)如何对多个数据集进行匹配,当一个数据库的属性与另一个数据库的属性匹配时,必须注意数据的结构; (2)数据冗余。两个数据集有两个命名不同但实际数据相同的属性,那么其中一个属性就是冗余的。
四、数据变换
数据变换策略主要包括以下几种:
光滑:去掉噪声; 属性构造:由给定的属性构造出新属性并添加到数据集中。例如,通过“销售额”和“成本”构造出“利润”,只需要对相应属性数据进行简单变换即可 聚集:对数据进行汇总。比如通过日销售数据,计算月和年的销售数据; 规范化:把数据单按比例缩放,比如数据标准化处理; 离散化:将定量数据向定性数据转化。比如一系列连续数据,可用标签进行替换(0,1);
五、数据归约
数据归约通常用维归约、数值归约方法实现。维归约指通过减少属性的方式压缩数据量,通过移除不相关的属性,可以提高模型效率。常见的维归约方法有:分类树、随机森林通过对分类效果的影响大小筛选属性;小波变换、主成分分析通过把原数据变换或投影到较小的空间来降低维数。
‘陆’ 神经网络异常检测方法和机器学习异常检测方法对于入侵检测的应用
神经网络异常检测方法神经网络入侵检测方法是通过训练神经网络连续的信息单元来进行异常检测,信息单元指的是命令。网络的输入为用户当前输入的命令和已执行过的W个命令;用户执行过的命令被神经网络用来预测用户输入的下一个命令,如下图。若神经网络被训练成预测用户输入命令的序列集合,则神经网络就构成用户的轮郭框架。当用这个神经网络预测不出某用户正确的后继命令,即在某种程度上表明了用户行为与其轮廓框架的偏离,这时表明有异常事件发生,以此就能作异常入侵检测。
上面式子用来分类识别,检测异常序列。实验结果表明这种方法检测迅速,而且误警率底。然而,此方法对于用户动态行为变化以及单独异常检测还有待改善。复杂的相似度量和先验知识加入到检测中可能会提高系统的准确性,但需要做进一步工作。
‘柒’ 互不相关的几组数据如何检测每组数据的异常值
简单统计。
异常检测和处理是一个比较小的分支,或者说,是机器学习的一个副产物,因为在一般的预测问题中,模型通常是对整体样本数据结构的一种表达方式,这种表达方式通常抓住的是整体样本一般性的性质,而那些在这些性质上表现完全与整体样本不一致的点,我们就称其为异常点,通常异常点在预测问题中是不受开发者欢迎的,因为预测问题通产关注的是整体样本的性质,而异常点的生成机制与整体样本完全不一致。
‘捌’ 如何利用机器学习检测加密恶意流量
恶意软件是指在计算机系统上执行恶意任务的病毒、蠕虫和特洛伊木马的程序,通过破坏软件进程来实施控制。腾讯移动安全实验室发布的数据显示,恶意软件由多种威胁组成,会不断弹出,所以需要采取多种方法和技术来进行反病毒保护。
‘玖’ 用机器学习检测异常点击流
用机器学习检测异常点击流
本文内容是我学习ML时做的一个练手项目,描述应用机器学习的一般步骤。该项目的目标是从点击流数据中找出恶意用户的请求。点击流数据长下图这样子,包括请求时间、IP、平台等特征:
该项目从开始做到阶段性完成,大致可分为两个阶段:算法选择和工程优化。算法选择阶段挑选合适的ML模型,尝试了神经网络、高斯分布、Isolation Forest等三个模型。由于点击流数据本身的特性,导致神经网络和高斯分布并不适用于该场景,最终选择了Isolation Forest。工程优化阶段,最初使用单机训练模型和预测结果,但随着数据量的增加,最初的单机系统出现了性能瓶颈;然后开始优化性能,尝试了分布化训练,最终通过单机异步化达到了性能要求。
1 算法选择
1.1 神经网络
刚开始没经验,受TensorFlow热潮影响,先尝试了神经网络。选用的神经网络是MLP(Multilayer Perceptron,多层感知器),一种全连接的多层网络。MLP是有监督学习,需要带标签的样本,这里“带标签”的意思是样本数据标注了哪些用户请求是恶意的、哪些是正常的。但后台并没有现成带标签的恶意用户样本数据。后来通过安全侧的一些数据“间接”给用户请求打上了标签,然后选择IP、平台、版本号、操作码等数据作为MLP的输入数据。结果当然是失败,想了下原因有两个:
1, 样本的标签质量非常差,用这些样本训练出来的模型性能当然也很差;
2, 输入的特征不足以刻画恶意用户。
数据的质量问题目前很难解决,所以只能弃用MLP。
1.2 高斯分布
然后尝试其他模型。通过搜索发现,有一类ML模型专门用于异常检测,找到了Andrew Ng介绍的基于高斯分布的异常检测算法:高斯分布如下图所示:
这个算法的思想比较简单:与大部分样本不一致的样本就是异常;通过概率密度量化“不一致”。具体做法是:选择符合高斯分布或能转换为高斯分布的特征,利用收集到的数据对高斯分布做参数估计,把概率密度函数值小于某个阈值的点判定为异常。
所谓的参数估计是指,给定分布数据,求分布的参数。对高斯分布来说,就是求μ和σ。用极大似然估计可以得到高斯分布参数的解析解:
得到高斯分布参数后,用下式计算概率密度:
X表示一个特征输入。若有多个特征x0、x1、…、xn,一种简单的处理方法是将其结果连乘起来即可:f(x) = f(x0)f(x1)…f(xn)。
然后选定一个阈值ε,把f(x) < ε的样本判定为异常。ε值需根据实际情况动态调整,默认可设定ε = f(μ- 3σ)。
把这个模型初步应用于点击流异常检测时,效果还不错,但在进一步实施过程中碰到一个棘手问题:样本中最重要的一个特征是操作码,当前操作码在微信后台的取值范围是[101,1000],每个操作码的请求次数是模型的基础输入,对900个特征计算概率密度再相乘,非常容易导致结果下溢出,以致无法计算出精度合适的概率密度值。这个现象被称为维度灾难(Dimension Disaster)。
解决维度灾难的一个常见做法是降维,降维的手段有多种,这里不展开讨论了。在点击流分析的实践中,降维的效果并不好,主要原因有两个:
1, 正常用户和恶意用户的访问模式并不固定,导致很难分解出有效的特征矩阵或特征向量;
2, 降维的本质是有损压缩,有损压缩必定导致信息丢失。但在本例中每一维的信息都是关键信息,有损压缩会极大破坏样本的有效性。
高斯分布模型的维度灾难在本例中较难解决,只能再尝试其他模型了
1.3 Isolation Forest
Isolation Forest,可翻译为孤异森林,该算法的基本思想是:随机选择样本的一个特征,再随机选择该特征取值范围中的一个值,对样本集做拆分,迭代该过程,生成一颗Isolation Tree;树上叶子节点离根节点越近,其异常值越高。迭代生成多颗Isolation Tree,生成Isolation Forest,预测时,融合多颗树的结果形成最终预测结果。Isolation Forest的基础结构有点类似经典的随机森林(Random Forest)。
这个异常检测模型有效利用了异常样本“量少”和“与正常样本表现不一样”的两个特点,不依赖概率密度因此不会导致高维输入的下溢出问题。提取少量点击流样本测试,它在900维输入的情况下也表现良好,最终选择它作为系统的模型。
2 工程优化
工程实现经历了单机训练、分布式训练、单机异步化训练3个方案,下面内容介绍实现过程中碰到的问题和解决方法。
2.1 单机训练
整个系统主要包括收集数据、训练模型、预测异常、上报结果四个部分。
2.1.1 收集数据
刚开始尝试该模型时,是通过手工方式从mmstreamstorage获取样本的:
1,通过logid 11357,得到手工登录成功用户的uin和登录时间;
2,利用mmstreamstorage提供的接口,得到用户登录后10分钟的点击流;
但这样做有两个缺点:
1,上述步骤1是离线手工操作的,需要做成自动化;
2,mmstreamstorage的接口性能较差,只能提供2万/min的查询性能,上海IDC登录的峰值有9万/min。
改进办法是复用点击流上报模块mmstreamstorage,增加一个旁路数据的逻辑:
1,手工登录时在presence中记录手工登录时间,mmstreamstorage基于该时间旁路一份数据给mmguardstore。由于mmstreamstorage每次只能提供单挑点击流数据,所以需要在mmguardstore中缓存;
2,mmguardstore做完数据清洗和特征提取,然后把样本数据落地,最后利用crontab定期将该数据同步到Hadoop集群中。
最终的数据收集模块结构图如下所示:
点击流数据提供了IP、平台、版本号、操作码等特征,经过多次试验,选定用户手工登录后一段时间内操作码的访问次数作为模型的输入。
上面我们提到过点击流的操作码有900个有效取值,所以一个显然的处理方法是,在mmguardstore中把用户的点击流数据转化为一个900维的向量,key是cgi id,value是对应cgi的访问次数。该向量刻画了用户的行为,可称为行为特征向量。
2.1.2 训练模型
初起为了控制不确定性,只输入1万/分钟的样本给模型训练和预测。系统的工作流程是先从Hadoop加载上一分钟的样本数据,然后用数据训练Isolation Forest模型,最后用训练好的模型做异常检测,并将检测结果同步到tdw。
在1万/分钟输入下取得较好的检测结果后,开始导入全量数据,全量数据数据的峰值为20万/分钟左右。出现的第一个问题是,一分钟内无法完成加载数据、训练模型、预测结果,单加载数据就耗时10分钟左右。这里先解释下为什么有“一分钟”的时间周期限制,主要原因有两个:
1, 想尽快获取检测结果;
2, 由于点击流异常检测场景的特殊性,模型性能有时效性,需要经常用最新数据训练新的模型。
解决性能问题的第一步是要知道性能瓶颈在哪里,抽样发现主要是加载数据和训练模型耗时较多,预测异常和上报结果的耗时并没有随数据量的增加而快速上涨。
加载数据的耗时主要消耗在网络通信上:样本文件太大了,导致系统从Hadoop同步样本数据时碰到网络带宽瓶颈。但由于样本是文本类数据,对数据先压缩再传输可极大减少通信量,这里的耗时比较容易优化。
训练模型的耗时增加源于输入数据量的增加。下图是1万样本/min的输入下,系统个阶段的耗时:
其中:
加载程序: 2s
加载数据: 6s
训练模型:11s
分类异常: 2s
保存结果: 4s
单轮总耗时:25s
需处理全量数据时,按线性关系换算,“训练模型”耗时为:11s * 24 = 264s,约为4.4分钟,单机下无法在1分钟内完成计算。
最先想到的优化训练模型耗时的办法是分布式训练。
2.2 分布式训练
由于scikit-learn只提供单机版的Isolation Forest实现,所以只能自己实现它的分布式版本。了解了下目前最常用的分布式训练方法是参数服务器(Parameter Server,PS)模式,其想法比较简单:训练模型并行跑在多机上,训练结果在PS合并。示意图如下所示:
分布式训练对算法有一定要求,而Isolation Forest正好适用于分布式训练。
然后尝试在TensorFlow上实现Isolation Forest的分布式训练版本。选择TensorFlow的原因有主要两个:
1, TensorFlow已经实现了一个分布式训练框架;
2, TensorFlow的tf.contrib.learn包已经实现的Random Forest可作参考(Isolation Forest在结构上与Random Forest类似),只需对Isolation Forest定制一个Operation即可。
写完代码测试时,发现了个巨坑的问题:TenforFlow内部的序列化操作非常频繁、性能十分差。构造了110个测试样本,scikit-learn耗时只有0.340秒,29万次函数调用;而TensorFlow耗时达207.831秒,有2.48亿次函数调用。
TensorFlow性能抽样:
Scikit-learn性能抽样:
从TensorFlow的性能抽样数据可以看到,耗时排前排的函数都不是实现Isolation Forest算法的函数,其原因应该与TensorFlow基于Graph、Session的实现方式有关。感觉这里坑比较深,遂放弃填坑。
也了解了下基于Spark的spark-sklearn,该项目暂时还未支持Isolation Forest,也因为坑太深,一时半会搞不定而放弃了。
2.3 单机异步化训练
没搞定分布式训练,只能回到单机场景再想办法。单机优化有两个着力点:优化算法实现和优化系统结构。
首先看了下scikit-learn中Isoaltion Forest的实现,底层专门用Cython优化了,再加上Joblib库的多CPU并行,算法实现上的优化空间已经很小了,只能从系统结构上想办法。
系统结构上的优化有两个利器:并行化和异步化。之前的单机模型,加载数据、训练模型、预测异常、上报结果在单进程中串行执行,由此想到的办法是启动4个工作进程分别处理相应的四个任务:异步训练模型、预测异常和上报结果,并行加载数据。工作进程之间用队列通信,队列的一个优势是容易实现流量控制。
写完代码测试,却发现YARD环境中的Python HDFS库在多进程并发下直接抛异常。尝试多个方法发现这个问题较难解决,暂时只能想办法规避。经测试发现,直接从Hadoop同步所有压缩过的样本数据只需2秒左右,由此想到规避方法是:先单进程同步所有样本数据,再多进程并发解压、加载和预测。
按上述想法修改代码测试,效果较好,处理所有样本只需20秒左右,达到了1分钟处理完所有样本的要求。然后提交YARD作业线上跑,处理所有样本耗时却达到200~400秒:
咨询YARD侧同学,得知YARD对提交的离线作业有CPU配额的硬限制,分时段配额如下表:
00:00~09:00 80%
09:00~19:00 50%
19:00~23:00 15%
23:00~24:00 50%
晚高峰时段的配额只有15%。
与YARD侧同学沟通,他们答应后续会支持scikit-learn库的在线服务。目前通过手工方式在一台有scikit-learn的mmguardstore机器上运行在线服务,晚高峰时段处理全量数据耗时为20秒左右。
最终的系统结构图如下图所示:
模型训练进程定期训练最新的模型,并把模型通过队列传给预测进程。预测进程每分钟运行一次,检查模型队列上是否有新模型可使用,然后加载数据、检测异常,将检测结果通过上报队列传给上报进程。上报进程block在上报队列上,一旦发现有新数据,就根据数据类型执行上报监控、上报tdw等操作。
2.4 评估性能
安全侧将异常用户分为以下几类:盗号、LBS/加好友、养号、欺诈、外挂/多开等。由于这些分类的异常打击是由不同同学负责,不便于对Isolation Forest的分类结果做评估,因此需要在Isolation Forest的基础上,再加一个分类器,标记“异常样本”的小类。利用操作码实现了该分类器。
接入全量数据后,每天准实时分析1亿量级的样本,检测出500万左右的异常,精确分类出15万左右的恶意请求。恶意请求的uin、类型、发生时间通过tdw中转给安全侧。安全侧通过线下人工分析和线上打击,从结果看检测效果较好。
2.5 持续优化
再回过头观察点击流数据,我们使用的Isolation Forest模型只利用了操作码的统计数据。可以明显看到,点击流是一个具备时间序列信息的时序数据。而自然语言处理(Natural LanguageProcessing,NLP)领域已经积累了非常多的处理时序数据的理论和实战经验,如LSTM、word2vec等模型。后续期望能引入NLP的相关工具挖掘出更多恶意用户。
‘拾’ 如何用matlab检测机器学习训练结果
sim函数可以检验神经网络,详见:
http://cn.mathworks.com/help/nnet/ref/sim.html?searchHighlight=sim