大数据背景下的最佳异常检测算法 孤立森林 (大数据背景下财务会计的转型与发展)

文章编号:36883 资讯动态 2024-11-30 异常检测孤立森林

双语原文链接: Isolation Forest is the best Anomaly Detection Algorithm for Big>"iForest" 是一个优美动人,简洁优雅的,只需少量参数就可以检测出异常点。原始论文中只包含了最基本的数学,因而对于广大群众而言是通俗易懂的。在这篇文章中,我会总结这个算法,以及其历史,并分享我实现的代码来解释为什么是现在针对而言最好的异常检测算法。

为什么iForest是现在处理大数据最好的异常检测算法

总结来说,它在同类算法中有最好的表现。在多种数据集上的表现和精确度都比大多数其他的异常检测算法要好。我从的作者们那里取得了基准数据,并在中逐行使用绿红梯度的条件格式化。用深绿色来标识那些在这个数据集上有最好的表现的算法,并用深红色来标识那些表现得最差的:

孤立森林:大数据背景下的最佳异常检测算法

绿色表示好而红色表示差。我们看到在很多的数据集以及总体的角度上是领先的,正如平均值,中位数,标准差的颜色所表示。图源:作者。数据源:

我们看到在很多的数据集上以及总体上的表现是领先的,正如我计算出来的平均值,中位数,标准差的颜色所表示的一样。从(最重要的项指标的准确度)的表现来看也能得出同样的优秀结果。

孤立森林:大数据背景下的最佳异常检测算法

图源:author.Data

源:

可扩展性。以它表现出来的性能为标准而言是最快的。可以预料到的是,和基于频数直方图的异常点检测算法()在所有的数据集上都有更快的速度。

近邻算法()则要慢得多并且随着数据量变多它会变得越来越慢。

我已经成功地在一个包含一亿个样本和三十六个特征的数据集上构建出孤立森林,在一个集群环境中这需要几分钟。而这是我认为的算法没办法做到的。

孤立森林:大数据背景下的最佳异常检测算法

图源:author.Data

源:

要点/总结

我通过下面的综述来非常简洁地总结原来有10页内容的论文:

孤立树节点的定义:T或是一个没有子节点的叶子节点,或者是一个经过检验的内部节点,并拥有两个子节点(Tl,Tr)。我们通过递归地进行下述过程来构造一棵iTree:随机选择一项特征q和一个分割值p来划分X,直到发生下列情形之一为止:(i)树到达了限制的高度,(ii)所有样本被孤立成一个只有他们自己的外部节点,或者(iii)所有数据的所有特征都有相同的值。

路径长度:一个样本x的路径长度h(x)指的是从iTree的根节点走到叶子节点所经历的边的数量。E(h(x))是一组孤立树的h(x)的平均值。从这个路径长度的平均值,我们可以通过公式E(h(x)):s(x,n)= 2^[^[− E(h(x)) / c(n)]来得到一个异常分数s(x,n)。基本上,s和E(h(x))之间存在一个单调的关系。(想知道细节的话请查阅文末的附录,有一张图描述了他们之间的关系)。这里我不会讨论c(n),因为对于任意给定的静态数据集而言它是一个常数。

用户只需要设置两个变量:孤立树的数量和训练单棵树的子采样大小。作者通过对用高斯分布生成的数据做实验来展示了只需要少量的几棵树和少量的子采样数量就可以使平均路径长度很快地收敛。

小的子采样数量(抽样的抽样)解决了和问题。造成这两个问题的原因是输入的数据量对于异常检测这个问题来说太大了。是指由于某个正常的样本点被异常点所包围而被错误地标注为异常,则是相反的情况。也就是说,如果构建一个树的样本中有很多异常点,一个正常的数据点反而会看起来很异常。作者使用乳房线照相的数据来作为这个现象的一个例子。

小的子采样数量使得每一棵孤立树都具有独特性,因为每一次子采样都包含一组不同的异常点或者甚至没有异常点。

不依赖距离或者密度的测量来识别异常点,因此它计算成本低廉且有较快的速度。这引出了下一个议题。

线性的时间复杂度,()。不正规地说,这意味着运行时间随着输入大小的增加最多只会线性增加。这是一个非常好的性质:

孤立森林:大数据背景下的最佳异常检测算法

历程

见多识广的读者应该知道一个优秀的新想法出现与它的广泛应用之间可能会有数十年之久的间隔。例如,逻辑函数在年被发现,在年被重新发现(更多信息可参考)而到如今才被数据科学家频繁地用于逻辑回归。在最近几十年,一个新想法和它被广泛应用的间隔时间已经变得更短了,但这仍然需要一段相对较为漫长的时间。最先在年公开,但直到年后期才出现了可行的商业应用。 这是其时间线:

12/2008 -iForest的原始论文发布(论文)

07/2009 -iForest的作者们最后一次修改其代码实现(代码)

10/2018 -h2o小组实现了版和R版的iForest(代码)

01/2019 -PyOD在Python上发布了异常检测工具包(代码,论文)

08/2019 -Linkedln 工程小组发布了 iForest的Spark/Scala版本实现(代码,通讯稿)

代码实现

由于这篇文章是关于的,我采用了的集群环境。这里省略的大部分的脚手架(软件质量保证和测试之类的代码)的代码。如果在配置集群环境中需要帮助,可以参考我的文章:如何为搭建高效的

集群和

我发现能很轻易且快捷地处理万行,个特征的数据,只需几分钟就完成计算。

importh2o#h2oautomateddatacleaningwellformydatasetimportpkg_resources###################################################################printpackages+versionsfordebugging/futurereproducibility###################################################################dists=[dfordinpkg_resources.working_set]#Filteroutdistributionsyoudon'tCareaboutanduse.dists.reverse()dists###################################################################initializeh2oclusterandloaddata##################################################################h2o.init()#importpyarrow.parquetaspq#allowloadingofparquetfilesimports3fs#forworkinginAWSs3s3=s3fs.S3FileSystem()df=pq.ParquetDataset('s3a://datascience-us-east-1/anyoung/2_processedData/stack_parquetFiles',filesystem=s3).read_pandas().to_pandas()#checkinputdataloadedcorrectly;prettyprint.shapeprint('('+';'.join(map('{:,.0f}'.format,df.shape))+')')#ifyouneedtosampledatadf_samp_5M=df.sample(n=5000000,frac=None,replace=False,weights=None,random_state=123,axis=None)#convertPandasDataFrameobjecttoh2oDataFrameobjecthf=h2o.H2OFrame(df)#dropprimarykeycolumnhf=hf.drop('referenceID',axis=1)#referenceIDcauseserrorsinsubsequentcode#youcanomitrowswithnasforafirstpasshf_clean=hf.na_omit()#prettyprint.shapewiththousandscommaseparatorprint('('+';'.join(map('{:,.0f}'.format,hf.shape))+')')fromh2o.estimatorsimportH2OIsolationForestEstimatorfromh2o.estimatorsimportH2OIsolationForestEstimatorfullX=['v1','v2','v3']#splith2oDataFrameinto80/20train/testtrain_hf,valid_hf=hf.split_frame(ratios=[.8],seed=123)#specifyiForestestimatormodelsisolation_model_fullX=H2OIsolationForestEstimator(model_id="isolation_forest_fullX.hex",seed=123)isolation_model_fullX_cv=H2OIsolationForestEstimator(model_id="isolation_forest_fullX_cv.hex",seed=123)#trainiForestmodelsisolation_model_fullX.train(training_frame=hf,x=fullX)isolation_model_fullX_cv.train(training_frame=train_hf,x=fullX)#savemodels(haven'tfiguredouthowtoloadfroms3w/opermissionissuesyet)modelfile=isolation_model_fullX.download_mojo(path="~/",get_genmodel_jar=True)print("Modelsavedto"+modelfile)#predictmodelspredictions_fullX=isolation_model_fullX.predict(hf)#visualizeresultspredictions_fullX["mean_length"].hist()

孤立森林:大数据背景下的最佳异常检测算法

如果你使用来验证你的带标签数据,你可以通过比较数据集中的正常数据的分布,异常数据的分布,以及原来数据集的分布来进行进一步推理。例如,你可以查看原本数据集中不同的特征组合,像这样:

N=df.count()df[['v1','v2','id']].groupby(['v1','v2']).count()/Ndf[['v1','v3','id']].groupby(['v1','v3']).count()/N...

并与使用得出的正常异常数据集进行比较。正如下面所展示的这样:

###################################################################columnbindpredictionsfromiForesttotheoriginalh2oDataFrame##################################################################hf_X_y_fullX=hf.cbind(predictions_fullX)###################################################################Sliceusingabooleanmask.Theoutputdatasetwillincluderows#withcolumnvaluemeetingcondition##################################################################mask=hf_X_y_fullX["label"]==0hf_X_y_fullX_0=hf_X_y_fullX[mask,:]mask=hf_X_y_fullX["label"]==1hf_X_y_fullX_1=hf_X_y_fullX[mask,:]###################################################################Filtertoonlyincluderecordsthatareclearlynormal##################################################################hf_X_y_fullX_ml7=hf_X_y_fullX[hf_X_y_fullX['mean_length']>=7]hf_X_y_fullX_0_ml7=hf_X_y_fullX_1[hf_X_y_fullX_0['mean_length']>=7]hf_X_y_fullX_1_ml7=hf_X_y_fullX_3[hf_X_y_fullX_1['mean_length']>=7]###################################################################ConverttoPandasDataFrameforeasiercounting/familiarity##################################################################hf_X_y_fullX_ml7_df=h2o.as_list(hf_X_y_fullX_ml7,use_pandas=True)hf_X_y_fullX_0_ml7_df=h2o.as_list(hf_X_y_fullX_0_ml7,use_pandas=True)hf_X_y_fullX_1_ml7_df=h2o.as_list(hf_X_y_fullX_1_ml7,use_pandas=True)###################################################################Lookatcountsbycombinationsofvariablelevelsforinference##################################################################hf_X_y_fullX_ml7_df[['v1','v2','id']].groupby(['v1','v2']).count()hf_X_y_fullX_0_ml7_df=h2o.as_list(hf_X_y_fullX_0_ml7,use_pandas=True)...#Repeataboveforanomalousrecords:###################################################################Filtertoonlyincluderecordsthatareclearlyanomalous##################################################################hf_X_y_fullX_ml3=hf_X_y_fullX[hf_X_y_fullX['mean_length']<3]hf_X_y_fullX_0_ml3=hf_X_y_fullX_1[hf_X_y_fullX_0['mean_length']<3]hf_X_y_fullX_1_ml3=hf_X_y_fullX_3[hf_X_y_fullX_1['mean_length']<3]###################################################################ConverttoPandasDataFrameforeasiercounting/familiarity##################################################################hf_X_y_fullX_ml3_df=h2o.as_list(hf_X_y_fullX_ml3,use_pandas=True)hf_X_y_fullX_0_ml3_df=h2o.as_list(hf_X_y_fullX_0_ml3,use_pandas=True)hf_X_y_fullX_1_ml3_df=h2o.as_list(hf_X_y_fullX_1_ml3,use_pandas=True)

我完整地实现了上面的代码并把我的数据输出到中,很快就可以得到如下的一些累积分布函数:

孤立森林:大数据背景下的最佳异常检测算法

图源:作者自己的作品。绿线表示标识为的数据,即正常样本红线

代表的是标识为的样本,被认为有可能是异常的。

参考文献


AI研习社是AI学术青年和AI开发者技术交流的在线社区。我们与高校、学术机构和产业界合作,通过提供学习、实战和求职服务,为AI学术青年和开发者的交流互助和职业发展打造一站式平台,致力成为中国最大的科技创新人才聚集地。

如果,你也是位热爱分享的AI爱好者。欢迎与译站一起,学习新知,分享成长。

孤立森林:大数据背景下的最佳异常检测算法

版权文章,未经授权禁止转载。详情见 转载须知 。

孤立森林:大数据背景下的最佳异常检测算法

全局中部横幅
轻跨境

轻跨境由中国联通授权运营跨境业务,为跨境电商用户提供全球范围内的跨境电商线路服务。

老人定位手环,老人智能手表

爱牵挂数字科技_爱牵挂提供智慧养老解决方案,养老服务平台,老人定位手环,老人呼叫器,老人智能手表定位器等智能硬件,适用于养老、残联、健康管理等项目18620184339

吉尔森上海

Gilson移液器厂家,移液工作站。涵盖固相萃取、制备色谱、移液工作站、电动移液枪枪头、小分子化合物纯化、多道移液器操作较准等样品管理和纯化解决方案,自1957年成立以来,始终坚持自主研发,具备硕果累累的创新记录,发明了全球第一支可调量程移液器PIPETMAN®,第一种移液器称量校准方法,第一台全自动固相萃取系统等,拥有超过750项专利。

浙江大自然户外用品股份有限公司

浙江大自然户外用品股份有限公司诞生于1992年,30年来潜心专注于运动、户外用品的研发、生产。时至今日,已成为户外运动行业知名的充气床垫、户外箱包供应商,与全球40多个国家200多个品牌建立了良好稳定的合作关系。公司产品主要包括:自动充气垫、充气床、防水包、冰包、枕头、坐垫以及TPU复合面料等。

网络货运

好伙伴为网络货运平台资质申报一站式服务商,无车承运人/网络货运资质申请数量国内第一,为400多家物流企业提供网络货运技术支持,成功取得网络货运资质。好伙伴专注物流软件20年,满足网络货运/无车承各业务及运输场景要求。

广东老榕树网络科技有限公司

广东老榕树网络科技有限公司,品牌维护,品牌推广,全网营销,整站SEO,口碑维护,媒体投稿,舆情监控与维护,新闻源优化,网络推广,全网营销,整合营销,公司以战略规划、品牌建设、落地营销三大核心服务为中大型企业及品牌提供一站式全网营销服务。

江西玉道网络科技有限公司

江西玉道网络科技有限公司,位于南昌市东湖区八一大道357号财富广场A座1304室,是一家专业从事IT设备运维、网络工程、系统集成的公司。我们以积极主动和低调务实的工作态度为客户服务,拥有独特的经营理念和扎实的技术实力,致力于长期为江西客户提供优质且实惠的产品及服务。自创立之初即高瞻远瞩,外广布渠道以迎宾,内精设系统以待客,纳优质资源为己用。历经数年网络市场风云,成就业界虎踞龙盘之势,荣获江西优质网络服务商之誉。

电伴热带

电伴热带,伴热带,电热带,电伴热,伴热电缆,mi加热电缆-合肥美阳电热器材有限公司是专业从事电伴热带,自限温电伴热带,恒功率电伴热带,mi加热电缆,防爆伴热带,管道电伴热,储罐电伴热,灰斗电伴热的生产销售与施工为一体的生产厂家。欢迎选购!

游族网络游戏平台

游族网络(youzu.com)是国内知名网页游戏与手机游戏综合性运营平台。我们秉承真诚、简单可依赖的态度为玩家传递快乐,提供好玩的网页游戏与热门手机游戏;女神联盟、大皇帝、少年三国志、少年西游记、狂暴之翼、盗墓笔记、刀剑乱舞online等是我们为玩家提供的最新精品游戏,游族网络与您分享简单的快乐!

消防设备维修,消防控制器维修,消防联动维修,消防维修网

消防维修网【www.119wei.com】专业消防维修工程人员进行维修,多年从业经验,可以维修多个厂商的消防主机问题。消防主机维修电话:4000-346--119.

常州报废汽车回收

【江苏科源报废汽车回收拆解】有限公司专业从事报废汽车回收,报废汽车拆解,包括新能源汽车报废拆解等服务,专业的服务高品质的效率,欢迎来电咨询:0519-68267116

全局底部横幅