精华内容
下载资源
问答
  • pandas数据异常值判断、可视化以及异常值的处理
    万次阅读 多人点赞
    2020-02-17 15:42:10

    pandas数据的异常值判断、可视化、处理方式

    回想一下我们小时候参加唱歌比赛,最后算分的时候总会去掉一个最高分,去掉一个最低分,将剩下的分数进行去平均。这里面就有筛选异常值的思想。一个非常夸张的异常值可能会造成对最后统计结果产生比较大的影响。所以,在这里,我们介绍两种办法来判断异常值,并使用箱线图进行显示。

    异常值的判断

    1、使用均值和标准差进行判断

    mean 为数据的均值
    std 为数据的标准差
    数据的正常范围为 【mean-2 × std,mean+2 × std】

    接下来我们使用代码来看看

    import pandas as pd
    import numpy as np
    tips = pd.read_csv('tips.csv')
    tipmean=tips['tip'].mean()
    tipstd = tips['tip'].std()
    topnum1 =tipmean+2*tipstd
    bottomnum1 = tipmean-2*tipstd
    print(tips.head(10))
    print("正常值的范围:",topnum1,bottomnum1)
    print("是否存在超出正常范围的值:",any(tips['tip']>topnum1))
    print("是否存在小于正常范围的值:",any(tips['tip']<bottomnum1))
    

    咱们先看输出结果吧:
    在这里插入图片描述

    1. 首先咱们读入了tips.csv文件,将前十条数据输出到控制台中
    2. 我们这次主要使用的是文件中的tip这一列数据,通过mean()、std()两种方法分别计算出了这一列数据的均值和标准差。
    3. 通过any()函数分别判断数据中是否存在异常值
    4. 结果显示,存在超出正常范围的异常值,不存在小于正常范围的异常值。

    使用上四中位数和下四中位数进行异常值判定

    mean1 为上四中位数(就是将数据按从小到大排列,取3/4这个位置的数)
    mean2 为下四中位数(同上,取1/4位置的数)
    mean3 为中位差 mean3 = mean1-mean2

    正常值的范围应在【mean2-1.5×mean3,mean1+1.5×mean2】

    下面看代码:

    import pandas as pd
    import numpy as np
    tips = pd.read_csv('tips.csv')
    mean1 = tips['tip'].quantile(q=0.25)#下四分位差
    mean2 = tips['tip'].quantile(q=0.75)#上四分位差
    mean3 = mean2-mean1#中位差
    topnum2 = mean2+1.5*mean3
    bottomnum2 = mean2-1.5*mean3
    print("正常值的范围:",topnum2,bottomnum2)
    print("是否存在超出正常范围的值:",any(tips['tip']>topnum2))
    print("是否存在小于正常范围的值:",any(tips['tip']<bottomnum2))
    

    先来看结果:
    在这里插入图片描述

    1. quantile(q=0.25)和quantile(q=0.75) 分别是取下四中位数和上四中位数的值。其余与上面类似。

    对比这两种方法,从结果上来看,差距不大,相对而言,matplotlib包中的箱线图使用的是第二种方式进行异常值分析。咱们平常使用的话,可以做一下比较,选取最适合自己数据的一种方法。

    通过可视化进行异常值分析判断

    接着上面的继续,上面我们提供了两种方法进行异常值的判断,接下来我们使用python中matplotlib的箱线图进行展示。箱线图是采用了上下四中位数的方法,也就是第二种方法。

    在这里插入图片描述
    先上代码:

    import matplotlib.pyplot as plt
    plt.boxplot(x=tips['tip'])
    plt.show()
    

    先看结果:
    在这里插入图片描述

    1. 首先导入matplotlib的pyplot包
    2. 使用plt.boxplot(x=tips[‘tip’]) 这个就是matplotlib的箱线图的方法,这里不介绍它的其他参数,具体用法我会在matplotlib那里做详细介绍的。传入数据tips[‘tip’]
    3. plt.show()将图形显示出来
    4. 从结果图中,我们可以看到,上下两条直线就是正常值的上下限,下面那条线下面没有任何东西,代表没有小于下限的异常值,上面那条线上有许多⭕,代表着有许多超出上限的异常值。这些与我们之前的判断一致。
    5. 这时候大家可能会有个疑问,为什么咱们上面算的下限是负数,为什么图片中下限不是负数呢。为了解答这个问题,我特意向数据添加了一条数据,tip值为0.1。咱们看看添加后这条数据的图像:
      6.
      这里我判断,我下限这里是取数据中最小的,并不是咱们之前计算的负数,暂且这么理解吧。

    异常值处理

    通常的处理方式是取数据中的最大最小值进行异常值替换。

    replace_value1=tips['tip'][tips['tip']<topnum2].max()
    tips.loc[tips['tip']>topnum2,'tip']=replace_value
    replace_value2=tips['tip'][tips['tip']>bottomnum2].min()
    tips.loc[tips['tip']<bottomnum2,'tip']=replace_value2
    
    1. tips[‘tip’][tips[‘tip’]<topnum2]首先取出小于正常值上限的数据,然后从这些数据中使用max()方法,找出最大值。
    2. 取最小值同理。

    tips数据下载

    更多相关内容
  • 文章目录行为分析数据集:疲劳驾驶数据异常行为监控数据集三维卷积特征提取器:100G异常行为数据集送上:异常行为数据集(图像)公众号来袭 行为分析数据集: oops数据集,近21000个视频的异常行为视频帧,截取...

    今天分享一下这几种数据集:
    异常行为数据集
    疲劳驾驶数据集
    行为分析数据集

    行为分析数据集:

    oops数据集,近21000个视频的异常行为视频帧,截取保存下来,有各种行为,多为异常行为与失败行为。

    链接:https://pan.baidu.com/s/1vmqbmct_wsym_0UqO-g96Q
    提取码:5l80

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bTl48luF-1595057697902)(D:\CSDN\pic\数据共享\1595055390837.png)]

    疲劳驾驶数据集

    链接:https://pan.baidu.com/s/1qWBpTtWXGOGUzMtUsUWxGw
    提取码:2051

    异常行为监控数据集

    【转载于知乎:CV上手之路 ,网址:https://zhuanlan.zhihu.com/p/98928534】

    数据集的内容包括了(括号前数字为总视频数量,括号内为训练视频数量,约10%,数据来自论文的表格2):

    1. Abuse 虐待,50(48)
    2. Arrest 抓捕,50(45)
    3. Arson 纵火,50(41)
    4. Assault 突袭,50(47)
    5. Burglary 盗窃,100(87)
    6. Explosion 爆炸,50(29)
    7. Fighting 斗殴,50(45)
    8. Normal_Videos_event 正常事件,950(800)
    9. RoadAccidents 交通事故,150(127)
    10. Robbery 当街抢劫,150(145)
    11. Shooting 枪击,50(27)
    12. Shoplifting 商店抢劫,50(29)
    13. Stealing 偷窃,100(95)
    14. Vandalism 恶意毁坏,50(45)

    视频总数量为1900个,共128小时,平均帧率是 7274帧,MP4格式,帧率似乎是30fps。视频尺寸大部分是 240x320,接近250p。虽然解压后这1900个视频文件有104GB,然而,当我们不统计超过200MB的视频文件时(共170个,占总数的9%),剩下的1870个视频只有50GB。

    250P:320x250,360P:480x360,720P:1280x720,1080P:1920x1080

    img图3,条形图:纵轴是视频数量,横轴是视频时长min,视频长度大部分在1分钟以下

    2019-12-29 初版
    2020-01-14 增加我对这篇文章的复现结果,修改了题目

    我先摆出我的观点:这个数据集不太好,但是还不至于不可用。你需要注意的问题如下(严重程度由高到低):

    • 有些过短的视频通过重复播放来凑出时长!
    • 有些视频并非是真实监控视频
    • 有些异常视频竟然存在分镜切换!
    • 有些视频中的异常行为,我作为人类难以判断
    • 视频不全是彩色视频,存在夜视视频(灰度),且视频尺寸、缩放不统一
    • 异常视频与正常视频在异常事件以外的差异非常明显(在镜头中异常事件未发生前,作为人类,我可以根据拍摄角度与视频质量直接猜出这个视频接下来是否有异常事件发生)
    • 大部分异常视频片段的前面为正常片段,异常事件发生后才是异常片段,而标记将整段视频都标记为异常(弱监督),因此对算法提出了更高的要求。

    详细的说明见下方正文**「这个数据集不太好,但是还不至于不可用」**。基于正文中对这个数据集的分析,我对在此数据集上使用其标记数据进行训练的模型性能表示强烈的怀疑。然而,当前好用的异常行为数据集非常稀少(如 UCSD Ped x, Subway xxx,Abnormal crowd),并且这个真实监控视频数据集的视频总时长非常多(收集异常行为的难度非常大!),因此这篇文章发布数据集的辛劳还是值得肯定的。

    img异常检测方法:多实例学习(Multiple Instance Learning)

    这篇论文提出的异常检测方法非常简单(文章2018-01发表在ArXiv,后投中CVPR 2018,由于此论文发布了数据集,因此引用量虚高,截至2019-12为105),如下:

    • 输入32帧的监控视频截图到 三维卷积特征提取器(Facebook的C3D)中,得到特征
    • 基于提取到的特征,训练3层FC(全连接层)对这些特征进行分类,输出一段长度为n的向量 [公式] ,表示输入视频属于各个类别的分数。
    • 由于只要有任何一种异常行为发生,这段视频就是异常视频,因此取向量中的最大值作为视频是否异常的判别结果 [公式]

    img图6,ROC曲线,表格3、表格4

    经过分析,我认为这个数据集有问题,因此即便看到了上面的ROC曲线与表格指标,我也不敢花费时间去复现这篇论文。尽管我不相信它的量化结果,但是它异常分数曲线还是不错的,很有说服力——虽然数据集没有标出异常视频中具体是哪一段存在异常行为,但是根据下方的异常分数曲线,模型可以识别出具体哪一段(红色区间)发生了异常行为。(

    @月半可可

    和我都复现过,这个指标是可信的。)


    2020-01-14 补充:下图是我的复现结果:

    img

    • 红色折线 AnoDet CVPR2018 C3D_4096+FC 是我对这篇文章提出方法的复现
    • 橙色折线 I3D_400 + RNN+Reg 是我自己的方法
    • 蓝色折线 I3D_1024 + RNN+Reg 也是我自己的方法

    可以看到,红色折线与论文的结果比较接近,它使用了在 sports1m 上的预训练的C3D。蓝色橙色折线得到的结果更好,它使用了在 Imagenet 上预训练的 I3D(当然这不是主要原因,换成C3D照样比原论文好)。I3D_400 是指使用 I3D当特征提取器,输出logits的400个特征,I3D_1024 则是输出1024个特征。尽管蓝色橙色折线差异不大,但是我还是推荐使用 蓝色折线 I3D_1024 。

    RNN+Reg 是我自己的方法,因为文章还没有发,这里就先不讲了,它的雏形是LSTM入门例子:根据前9年的数据预测后3年的客流(PyTorch实现)。在它的基础上进行一些适应弱监督数据集(指UCF Crime)的魔改,再稍微构造合适的训练输入,超越这篇论文的算法就完成了。


    接下来回到这篇论文:

    img异常分数曲线,纵轴为异常得分,横轴为帧的序号

    如果你想要了解损失函数的构造(其实就用在时序上用了 hinge loss + L2正则),那么你可以看见其他人写的论文笔记:[CVPR 2018论文笔记] 真实监控场景中的异常事件检测注意,那篇笔记中出现数据集的下载地址已经失效,请以我下方提供的为准。

    img上传于

    三维卷积特征提取器:

    关于特征提取器,论文使用了在其他大型数据集上进行预训练的特征提取器C3D,这是Facebook 在2017年提出来的 Convolution 3D (C3D),在2018年更新到了 C3D-v1.1。然而,DeepMind在2018-04 发布的 I3D拥有比C3D更好的性能。作者本人也在Github上承认并建议大家在复现的时候使用 I3D取代C3D。以下内容引用自论文Github的 README.md文件:

    Q: Should I use C3D or I3D?
    Ans: Several people have emailed me that in their experiments, I3D performs much better than C3D. So I would suggest to first try I3D. Obviously, for this, we need to re-train the model and make small modifications in training and testing codes.

    • Facebook Convolution 3D (C3D-v1.0, C3D-v1.1),需要TensorFlow 1.X,tornado
    • DeepMind I3D in Kinetics dataset,需要Tensorflow 1.X+sonnet (deepmind 自己开发的,类似于Keras?),注意 Kinetics dataset 是一个室内视频数据集
    • DeepMind I3D in pytorch,需要Pytorch 0.3,里面将Tensorflow 在 Kinetics dataset 和 Imagenet dataset 上面训练的预训练文件(每个模型文件约50MB)转化为Pytorch的格式。含有基于彩色图片和光流法的两种模型文件。
    • 我自己修改并得到了 I3D in Pytorch 1.X 的版本,并放在Github上(待上传)

    补充内容

    「这个数据集不太好,但是还不至于不可用」

    建立这样一个数据集是非常辛苦的,而且免费发布出来对学界有很大的好处,我在这里列出一些注意事项,给那些使用此数据集的人提醒:

    • 有些过短的视频通过重复播放来凑出时长!
    • 有些视频并非是真实监控视频
    • 有些异常视频竟然存在分镜切换!
    • 有些视频中的异常行为,我作为人类难以判断
    • 视频不全是彩色视频,存在夜视视频(灰度),且视频尺寸、缩放不统一
    • 异常视频与正常视频在异常事件以外的差异非常明显(在镜头中异常事件未发生前,作为人类,我可以根据拍摄角度与视频质量直接猜出这个视频接下来是否有异常事件发生)
    • 大部分异常视频片段的前面为正常片段,异常事件发生后才是异常片段,而标记将整段视频都标记为异常(弱监督),因此对算法提出了更高的要求。

    下面出现的视频均来自于这个100GB的数据集 ./UCF_Crimes/Video/

    有些过短的视频通过重复播放来凑出时长!下面是 Abuse001x264.mp4. 30fps。下面的截图显示了视频中存在的重播现象。室内有一女性背对出口站立,有两名男子进入,一男子偷走女性的包,另一名男子出拳将女性击倒,随后二人逃离现场,女性受到击打后没有站起。本来视频已经在600帧的时候结束了,但是这600帧内容被多次重播,直到2729帧才结束。另外,我们可以看到发生的事件是 抢劫与虐待?这种视频很难进行标记。

    img第1帧,第2xx帧,第3xx帧,第1xxx帧,第2xxx帧,第2729帧(最后一帧)

    有些异常视频竟然存在分镜切换!然而,真实监控视频的画面不可能会发生切换

    imgFighting032

    视频不全是彩色视频,存在夜视视频(灰度),且视频尺寸、缩放不统一,摄像头的焦距也不统一。另外,Stealing068也存在分镜切换的问题。

    img左上角:Normal013,其余图片:Stealing068

    有些视频并非是真实监控视频。如下:这种拍摄角度与监控视频有明显不同,并且也存在镜头切换。我认为正常视频里面收录这种“非真实监控视频”+镜头切换+画面长宽调整 的视频是比较合适的。

    imgNormal567

    **视频尺寸、缩放不统一。**注意,左边的视频帧率可能为 5fps,明显低于平均帧率 30fps

    img左:Normal881,右:Normal904

    **有些视频中的异常行为,我作为人类难以判断。**下面是入室盗窃Burglary062 的画面,我还以为是偷车。此处分镜头切换频繁。如果没有第一个镜头拍到他们在撬门,那么其他镜头其实都是正常的。CAM19拍到了作案车辆没有关好车门便慌张地开走,这一段镜头我还以为是偷车。然而,我只能通过视频的标签才得知这是 入室盗窃Burglary。

    imgBurglary062

    如视频 Arson???,我从视频中完全看不出来这是纵火。

    imgArson???,我忘记记下此视频的序号了

    异常视频与正常视频在异常事件以外的差异非常明显(在镜头中异常事件未发生前,作为人类,我可以根据拍摄角度与视频质量直接猜出这个视频接下来是否有异常事件发生)。如 枪击Shooting052,监控镜头拉近,拍到白车中的黑衣男子持枪射击红色车辆;如Shooting,它的片头与片尾都有提醒画面;如Arson025,这些视频把异常画面用红圈,高光标出来。如果让没有常识的机器利用这样的数据学习,即便机器只是识别到镜头缩放或提醒画面(而没有识别到异常事件),它也能完成任务,在测试中得到高分。(Testing Normal 910 也存在画面缩放等镜头调整动作)

    img第一行:Shooting052,第二行:Shooting047,第三行:Arson025

    100G异常行为数据集送上:

    链接:https://pan.baidu.com/s/1-et9bxsk35qx8KEuQ4shlA
    提取码:8zom

    异常行为数据集(图像)

    (1)USCD(University of California, San Diego)异常检测数据库[32]. 数据由加州大学圣地亚哥分校创建,
    数据是通过安装在一定高度、俯视人行道的摄像机,采集自然状态下发生的异常行为. 异常行为包含两类:
    非人实体闯入和人行为异常. 异常种类包括骑自行车、滑冰、小推车、行人横穿人行道、侵入草地等, 同
    时也记录人在轮椅上的几个实例. 数据由98 个视频组成, 被分成2 不同的场景的子集, 每个场景录制的视
    频录像被分成约200 帧的各个片段. 该数据库主要针对是人群中个体行为的识别研究.

    (2) UMN(University of Minnesota)数据库[33]. 明尼苏达州大学创建的一个数据库, 由11 个视频组成, 包
    含了正常和异常视频. 每个视频起始部分是正常行为,随后为异常行为视频序列. 人群异常行为主要包括:人群单方向跑动、人群四散等. 该视频数据库采集的视频人为安排的异常行为. 该数据库针对的整体人群行为识别.

    (3) UCF(University of Central Florida)数据库[34].该数据库由中佛罗里达大学创建, 包含了99 个视频片段. 该 数 据 库 主 要 是 收 集BBC Motion Gallery 、Youtube、Thought Equity 和Getty-Images 等网站视频数据, 用于公开的科学研究. 特点是在照明和视野的变化, 可以用于拥挤场面开发的算法的性能评价. 该数据集包含的人群和其他高密度移动物体的视频. 可以用于人群行为识别研究以及拥挤人群行为研究.

    (4) VIF(violent flow)数据库[35]. 由以色列开放大学创建的人群数据库, 主要关注的是人群暴力行为.由246个视频组成, 所有的视频从YouTube 下载的, 视频来源是真实的现实暴力录影. 数据库旨在为检验暴力/非暴力分类和暴力标准提供测试依据. 视频中, 最短剪辑的持续时间为1.04 秒,最长剪辑6.52 秒, 视频片段的平均长度为3.60 秒.

    下载链接:https://www.openu.ac.il/home/hassner/data/violentflows/

    (5) CUHK(Chinese University of Hong Kong) 数据库[36]. 该数据集用于拥挤场景下活动或行为研究. 它包括两个子数据集: 交通数据集(麻省理工学院的交通录像)和行人数据集. 交通数据集包括90 分钟长的交通视频序列, 一些抽样帧的行人基础事实是手动标记的. 行人数据集记录了纽约的大中央车站, 包含一个长30 分钟的视频, 无任何标记或事实的数据.

    (6) MALL 数据库[37]. 该数据集有两个子集: 第一是三个不同的密集的十字路口近60 分钟的交通流视频; 第二个是从一个可公开访问的购物中心的网络相机上获取的视频. 对2000 帧视频中的60000行人进行了标记, 每一个行人的头部位置也进行了标记. 因此,这个数据集方便于人群计数和轮廓分析的研究.

    下载地址:https://amandajshao.github.io/projects/WWWCrowdDataset.html(WWW dataset)

    相关链接:http://personal.ie.cuhk.edu.hk/~ccloy/datasets.html

    (7) PETS 2009(Performance Evaluation of Trackingand Surveillance) 数据库[38]. 此数据集包含了多传感器的不同人群的活动序列, 共有9 个视频. 它由五个组成部分: 校准数据、训练数据、计数和密度估计数据、跟踪数据以及流量分析和事件识别数据. 每个子集包含多个视频序列, 每个序列由4 到8 个不同视角拍摄.

    下载链接:http://www.cvg.reading.ac.uk/PETS2009/data.html

    (8) RWC(Rodriguezs Web-Collected)收集网络数据库[39]. 罗德里格斯的网络收集的数据集, 由520 个视频组成. 抓取和下载搜索引擎和素材网站的视频源,例如, Gettyimages 和YouTube 等, 构建其数据库. 除了大量人群视频外, 数据集还随机从集合中选择所有运动的人中, 记录了100 个人的地面真实轨迹. 该数据集是不向公众开放的.

    下载链接:https://www.di.ens.fr/willow/research/datadriven/

    下载链接:http://www.mikelrodriguez.com/datasets-and-source-code/#datadriven

    (9) UH(University of Haifa)数据库[40]. 视频来自五个采集点的八个摄像机, 分别是食堂1 个, 地铁入口1个, 地铁出口1 个, 车库出口1 个, 公交车站1 个, 商场3 个, 食堂和公交车站采用人为架设摄像机采集,其它地点来自监控. 所有视频中事件都进行了人为标记, 方便算法的测试. 数据库从食堂采集11 分钟视频,地铁入口1 小时36 分视频, 地铁出口43 分钟视频, 车库出口5 小时20 分视频, 公交车站2 分20 秒视频, 商场共155 分钟视频. 异常行为有自然发生, 也有人为设计的.

    下载地址:datasets are available for public use upon request

    (10) UCF-Crime

    下载链接:https://webpages.uncc.edu/cchen62/dataset.html

    (11) BEHAVE

    下载链接:http://groups.inf.ed.ac.uk/vision/BEHAVEDATA/INTERACTIONS/

    公众号来袭

    收集于网络资源,觉得有用的话,可以关注一下我的公众号:DeepAI 视界

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D5SHj6VI-1595057697972)(D:\CSDN\pic\WeChat Image_20200716151357.jpg)]

    人群异常数据库已经有一定的规模, 且基本都是公开的, 可以用于人群异常行为的研究. 但是, 目前的人群数据库还没有形成体系, 更多的都是研究团队自己采集的视频, 没有相关标准, 视频种类繁多, 这样一定程度限制了人群行为识别的研究. 因此, 标准的人群数据库的建立是需要进一步开展的相关工作.

    展开全文
  • 基于深度学习的日志数据异常检测

    万次阅读 多人点赞 2020-12-27 12:00:12
    基于日志数据异常检测 数据对象 智能运维(AIOps)是通过机器学习等算法分析来自于多种运维工具和设备的大规模数据。智能运维的分析数据对象多源运维数据包括系统运行时数据和历史记录数据,历史记录数据主要包含...

    基于深度学习的日志数据异常检测


    数据对象

    智能运维(AIOps)是通过机器学习等算法分析来自于多种运维工具和设备的大规模数据。智能运维的分析数据对象多源运维数据包括系统运行时数据和历史记录数据,历史记录数据主要包含表单和系统更新文档等。与历史记录数据相比,系统运行时数据能够反映系统的动态特征及系统发生故障时的上下文信息,对未知故障具有更好的探测和表达能力。

    系统运行时数据主要包含监控数据和日志数据,监控数据记录的是指系统运行状态下的资源占用情况,如中央处理器使用率、内存使用率、网络流量、进程数目以及进程资源使用率等;日志数据是程序开发人员为辅助调试在程序中嵌入的打印输出代码所产生的文本数据,用以记录程序运行时的变量信息、程序执行状态等。监控数据关注系统状态和粗粒度的应用状态,如进程状态、服务状态等;而日志数据关注细粒度的应用状态和跨组件的程序执行逻辑,能够定位到特定的日志及事件信息,同时能够定位异常请求实例即分布式跨组件的日志输出序列可以在一定程度上反映该请求的执行轨迹,因此日志数据更加适用于故障诊断任务。

    典型的分布式软件系统日志包括两类:事务型日志和操作型日志。事务型日志表征请求或事务执行逻辑,操作型日志表征诸如心跳、消息分派等独立事件。事务型日志之间一般存在明显因果关联关系,例如云平台中云控制器通过日志记录查找容器、解析参数以及报告请求执行状态等请求执行步骤。操作型日志之间一般是相互独立的,每一条日志代表一个独立事件,例如负责协调应用程序并跟踪程序状态的监控组件通过日志接收和保存来自其他组件的心跳。

    基于日志数据的故障诊断过程

    软件系统的故障诊断目的是在系统行为异常阶段,检测系统表征的异常信息,预测未来可能发生的故障,分析引发故障的根因。根因、异常和故障三个阶段之间具有时序和因果关系,已经出现的故障根因导致了系统现在的异常行为,进而在未来可能引发系统故障,其关系示意图如下所示:

    基于日志数据的故障诊断过程一般以下四种关键技术,分别是日志处理与特征提取、基于日志数据的异常检 测、基于日志数据的故障预测和基于日志数据的根因分析。

    日志处理与特征提取日志是程序开发人员在软件系统开发过程中为了记录系统运行状态和特殊事件而打印的文本信息,具有半结构化的特征。另外,现代软件系统的日志具有两种显著分别是大规模异构性,集群式的系统中日志规模巨大,同时由于各个组件设计各异使得其日志记录的风格和质量都有很大差异。因此,为降低日志数据的复杂性,消除大量噪音并有效提取特征,日志处理与特征提取技术利用机器学习、模式识别、统计分析、自然语言处理等方法,分析和挖掘日志数据特征信息,得到日志模板特征向量为异常检测、故障预测和根因分析提供数据基础。

    基于日志数据的异常检测即在系统日志数据中发现不符合预估行为的异常模式,其输出通常是日志片段是否属于异常的标签或日志片段包含系统异常信息的概率,评测指标通常包括精确率(precision)、召回率(recall)和综合评价指标F值(F-measure)。

    基于日志数据的故障预测即通过当前日志数据预测在不远的将来是否会发生系统故障。其输出通常是系统未来是否会出现故障的标签或出现故障的概率,评测指标通常包括精确率、召回率、综合评价指标F 值和前置时间(lead-time)。

    基于日志数据的根因分析即通过日志数据诊断与系统故障相关的根因信息,如故障类型、故障位置、故障请求、故障代码片段等。故障根因诊断技术的输出即为多种类型的故障根因信息,评测指标通常包括精确率(precision)、召回率(recall)和综合评价指标F值(F-measure)。

    日志处理与特征提取

    日志处理与特征提取主要有日志模板挖掘技术和日志特征提取技术两种,用以从降低日志文本的异构复杂性、从海量日志中提取有价值的信息。日志模板挖掘关注于日志中的常量部分,日志特征提取则关注于日志中的变量部分或其他特征。日志模板挖掘技术可以划分为基于静态代码分析、基于频繁项集挖掘和基于聚类的日志模板挖掘技术;日志特征提取技术可以划分为基于自然语言处理的日志特征提取技术、基于规则的结构化日志信息提取技术和基于统计模型的日志特征提取技术,如下图所示:

    Spell 基于最长公共子串的日志解析方法

    01 文献来源

    Du M , Li F . Spell: Online Streaming Parsing of Large Unstructured System Logs[J]. IEEE Transactions on Knowledge and Data Engineering, 2018, PP:1-1.

    02 文献目标

    • 将非结构化系统日志解析为结构化数据:已经有很多研究在解决这一问题,例如,使用正则表达式,基于源代码,或者使用数据挖掘方法如聚类和迭代分区等。然而,这些方法大都需要有特定领域的知识北京,因此,不适用于组成复杂的系统日志解析。

    • 采用在线流处理的方式进行日志解析:目前的在线处理实现是先进行大量的离线处理,然后才通过离线批处理过程将日志条目与首先识别的数据结构和模式进行匹配,显然这种方法效率较低。

    03 文献贡献

    • 提出了基于LCS(最长公共子序列)的日志解析方法:Spell是一种基于LCS的在线流处理日志解析方法,用于事件日志的结构化流式解析,实现了动态接受日志输入,实时处理输入,不断生成新的日志模板。

    • 实验证明Spell日志解析方法的有效性:使用三种最先进的方法自动从原始日志文件中提取消息类型和参数作为竞争基准,实验表明,与最先进的方法相比,Spell在效率和有效性方面都优于它们。

    04 主要算法

    基于LCS的流式日志解析方法的关键在于维护一个存储日志键和其他信息的数据结构LCSMap。LCSMap中表示每一个具体日志键内容的数据结构LCSObject包含两部分内容,一部分是已解析的LCS序列LCSseq,另一部分是记录参数位置列表的paramPos。在维护过程中,当有新的日志记录到达时,首先进行预过滤搜索前缀树中现有日志键;如果未发现匹配的日志键,进一步在倒排索引中查找匹配的日志键;最后,如果仍未找到匹配的日志键,使用简单的循环遍历方法将其与LCSMap中保存的所有日志键进行比较,并相应地更新LCSMap;如果遍历之后仍然无匹配日志键,则计算并创建一个新的LCSObject保存该日志键并插入到LCSMap中。在LCSMap的维护中可能出现日志键元素被错判断为参数和参数数量过多时参数被错判断为日志键元素的情况,这两种情况在本方法中通过定期应用拆分和合并过程以清理当前已解析的日志键。该算法具体流程如下图所示:

    一个使用最长公共子序列提取日志键的示例如下图所示:


    Drain 基于固定深度树的日志解析方法

    01 文献来源

    He P , Zhu J , Zheng Z , et al. Drain: An Online Log Parsing Approach with Fixed Depth Tree[C]// 2017 IEEE International Conference on Web Services (ICWS). IEEE, 2017.

    02 文献目标

    • 系统日志数据规模扩大:一个大型服务系统每小时产生的日志数据量可以达到50GB,这让日志解析任务难以使用人工有效完成。

    • 系统日志数据多样性增加:随着开源平台和Web服务的流行,一个系统通常由许多不同开发人员编写的组件组成,则使得传统的依赖正则表达式进行日志解析的方式变得更加困难。

    • 日志语句高频率地更新:现代计算系统中,计算任务变得越来越复杂且多变,这使得多种多样的组件产生日志消息的日志语句也在频繁地更新,这让日志解析变得更加困难。

    • 在线日志解析器还存在效率与精确的缺陷:大多数现有的日志解析器都侧重于脱机、批处理,这种方法显然很低效无法及时获取日志反应的消息。当下也有一些在线日志解析器,它们不需要离线训练步骤采用流式的日志解析方式,但是它们任然存在不够精确和高效的问题。

    03 文献贡献

    • 基于固定深度树的在线日志解析方法Drain:该方法能够以流的方式准确、高效的解析原始日志信息。可以从原始日志消息中自动提取日志模板,并将其分割为互不关联的日志组。使用一个具有固定深度的解析数来指导日志组搜索过程,这有效地避免了构造一个非常深且不平衡的数。另外,专门设计的解析规则被压缩编码在解析树节点中。

    • 实验证明了Drain方法的有效性:在五个真实世界的测试数据集上进行了广泛的实验,验证了Drain方法在准确性和效率方面的优势。

    • 公布了源码:https://appsrv.cse.cuhk.edu.hk/~pjhe/Drain.py

    04 主要算法

    日志解析的目标是将原始日志消息转换为结构化的日志消息。具体来说,原始日志消息是非结构化数据,包括时间戳和原始消息内容等。在解析过程中,解析器区分每个原始日志消息的常量部分和变量部分,常量部分是描述系统操作模板的令牌;而变量部分是其余的标记的动态运行是系统信息。典型的结构化日志消息包含匹配的日志事件和感兴趣的字段。

    Drain是一种基于固定深度树的在线日志解析方法。当一个新的原始日志消息到达时,Drain将根据领域知识通过简单的正则表达式对其进行预处理。然后搜索一个日志组,即为通过遵循编码在数内部节点中的特殊设计的规则,树的叶子节点。如果找到合适的日志组,日志消息将与存储在该日志组的日志事件匹配。否则,将根据日志消息创建一个新的日志组。

    基于日志数据的异常检测

    基于日志数据异常检测的目的是在线地对系统进行日志收集与分析,在系统日志中找到不符合预估行为的模式。其主要思路是从系统正常运行的日志数据中学习“健康”状态模型,故障探测过程通过寻找是否有与“健康”状态模型冲突的在线数据。由于日志数据与分布式软件系统的复杂性,基于日志数据的异常检测面临两个关键性挑战。

    1. 日志数据中的异常表征复杂多样,难以有效捕获。日志数据中的异常可能包含分布异常、序列异常、变量异常等,如何构造有效的异常检测模型以捕获复杂的异常成为一个技术上的挑战。

    2. 从海量日志数据中精准发现少量异常是一个难点。日志数量庞大,异常表征往往会隐藏在海量日志中,如何构造高效的异常检模型快速过滤海量日志并发现其中的异常成为一个技术上的挑战。

    现有的基于日志数据的异常检测方法主要分为3 类,分别是基于图模型的异常检测、基于概率分析的异常检测和基于机器学习的异常检测。基于图模型的异常检测对日志的序列关系、关联关系以及日志文本内容进行建模;基于概率统计的异常检测采用关联分析、对比等,计算日志与异常的关联概率;基于机器学习的异常检测采用聚类算法找到离群值或分类算法学习故障时的日志模式,判断在线日志数据是否符合这些日志模式。

    基于LSTM的日志数据异常检测

    主机系统运行过程中会产生各种各样的日志,日志记录了计算机运行时的状态和系统执行的各种操作,是在线监视和异常检测的良好信息来源,因此对系统日志的审计可以作为主机异常检测的重要手段。市场早已经存在各种各样的安全审计系统,比如日志审计系统、入侵检测系统(intrusion detection system,IDS)等,这些系统可以实现日志的采集、审计和异常行为挖掘的功能。但是在实际使用中,由于日志的差异和日志审计手段的单一落后,这些系统往往只适用于特定类型的主机,且能检测到的异常行为不够全面和准确。

    近年来,随着机器学习的发展,数据挖掘能力进一步提升,基于机器学习进日志审计的研究成果不断出现。但是对于不同的主机系统和进程,其产生的日志类型是不一致的,传统机器学习检测方法需要对不同类型的日志使用不同的特征提取方法,需要使用者有专业的知识背景才能更好的抽取日志的特征信息。在现实情况中日志的种类和语法是在不断更新的,某一种方法无法直接应用于多个系统,需要花费大量人力成本来做更新和匹配。相对比较高级的就是使用深度学习来做异常检测。系统日志的数据量越来越大已经足够深度学习模型进行学习处理,在参数合适的情况下,几乎不需要人工提取特征,深度学习模型就能很好的完成日志检测。下面主要讨论如何利用LSTM模型来实现日志的异常检测。

    DeepLog 基于LSTM深度模型的系统日志异常检测

    01 文献来源

    Du M , Li F , Zheng G , et al. DeepLog: Anomaly Detection and Diagnosis from System Logs through Deep Learning[C]// Acm Sigsac Conference on Computer & Communications Security. ACM, 2017.

    02 文献目标

    • 非结构化的系统日志:系统日志格式和语义在不同系统之间有很大差异,一些现有的方法使用基于规则的方法来解决这个问题,但是规则的设计依赖于领域知识,例如工业界常用的正则表达式。 更重要的是,基于规则的方法对于通用异常检测来说并不适用,因为我们几乎不可能预先知道不同类型日志中的关注点是什么。

    • 时效性:为了用户能够及时的发现系统出现的异常,异常检测必须要及时,日志数据以数据流的形式输入,意味着需要对整个日志数据做分析的方法不适用。

    • 异常种类多样性:系统和应用程序可能会产生多种类型的异常。异常检测系统应该不仅针对于特定的异常类型,还能检测未知的异常。同时,日志消息中也包含了丰富的信息,比如log key、参数值、时间戳等。大多数现有的异常检测方法仅仅分析了日志消息的特定部分(比如log key),这限制了它们能检测到的异常类型。

    • 并发:基于执行路径的异常检测是依据单个任务产生的日志记录来实现的,而计算系统的并发将使得并发的线程在同一时刻产生多条日志记录,这使得基于执行路径的异常检测变得复杂。

    03 文献贡献

    使用LSTM神经网络设计DeepLog框架:DeepLog不仅在日志条目中使用日志键,还使用度量值进行异常检测,因此,它能够捕获不同类型的异常。 DeepLog仅取决于小的训练数据集,该数据集由一系列“正常日志条目”组成。 在训练阶段之后,DeepLog可以识别正常的日志序列,并可以以流方式用于对传入日志条目进行在线异常检测。

    04 总体架构

    DeepLog的总体架构如下图所示,分为训练和检测两个阶段。在训练阶段,大量的系统日志数据被日志解析器解析为日志键和一个参数值向量的组合;然后使用这些日志键序列来训练一个日志键异常检测模型,并构建用于诊断目标系统执行工作流模型。对于不用的日志键,用它们的参数值向量训练一个参数值异常检测模型来检测有这些参数值反映的系统性能异常。在检测阶段,当一个新的日志记录到达时,它也被日志解析器解析为一个日志键和一个参数值向量的组合,然后使用对应内容经过对应异常检测模型进行检测,如果任一检测模型检测结果为异常,则将其标记为异常日志记录。


    Multimodal LSTM 基于系统跟踪数据的多模态深度学习的异常检测

    01 文献来源

    Nedelkoski, Sasho, Jorge Cardoso, and Odej Kao. "Anomaly detection from system tracing data using multimodal deep learning." 2019 IEEE 12th International Conference on Cloud Computing (CLOUD). IEEE, 2019.

    02 文献目标

    当前最先进的使用日志数据进行异常检测的系统将正常的系统行为建模为单一的数据类型,即文本日志关键字或真实值的性能参数。通常,他们对这两种类型的数据使用单独的模型,并建立一个集合来生成最终的预测。但是,这种加性模型没有利用数据源之间的现有相关性,仅仅从部分能够反映系统整体性能的数据中了解正常的系统行为。在系统操作执行期间收集的跟踪数据包括不同相关服务调用生成的存在因果关系的日志记录等信息和实值数据形式的服务响应时间两种形式,而利用这种多模态数据融合表示系统行为能够更好的反映系统状态,为此这篇文章研究从连续多模态数据中进行无监督异常检测的方法。

    03 文献贡献

    这篇文章使用LSTM神经网络和来自分布式跟踪技术的数据来解决云基础设施中的异常检测。首先,提出了一中针对时间序列学习的LSTM深度学习模型,使用单一模态、序列文本数据来模拟跟踪中服务之间的因果关系。以此为基础,扩展单模态体系结构,构建多模态体系结构利用多模态跟踪数据作为事件文本记录和实值序列的组合,该多模态方法不仅可以用于建模正常的系统行为,还可以用于检测异常,不仅考虑了服务的因果关系,还考虑了它们在跟踪中的响应时间。此外,该文章还使用该模型来重构执行路径,从而到达检测相关任务和并行任务的目的。最后,该文通过对真实生产云数据的详尽实验,验证了多模态LSTM达到了最佳的整体准确率优于基线。

    04 总体架构

    如下图所示,介绍的是事件文本记录数据(结构异常检测,Structural Anomaly Detection,SAD)和响应时间实值数据(响应时间异常检测,Response Time Anomaly Detection,RTAD)两种数据类型的单模态异常检测架构。模型的输入是相关服务的按时间戳事件文本记录序列,或对应服务调用的响应事件。输出是针对当前输入序列推测下一时间点发生事件或响应时间的的概率分布。检测阶段使用该模型进行预测,并将预测输出与观察到的标签值进行比较,从一系列标签中检测异常使得能够在执行期间捕获错误以及检测意外的执行路径。

    基于上述两种单模态体系结构,对其进行水平拼接提出多模态LSTM体系结构。该模型的输入包含事件文本记录数据和响应时间实值数据两种数据模式。从架构的自下而上的角度来看,该模型为每个输入设置一个带有LSTM块的层,并在第二个隐藏层中执行连接,出了这一选择外,拼接可以在交叉验证选择的任何隐藏层中进行。这两种模式的合并是通过将来自第一层的LSTM输出在相同时间上被合并并转发到下一个LSTM层的相同时间步长中完成。如下图所示,颜色编码方案表示串联的对,从级联层开始,信息被联合编码并在模态之间流动,根据这种联合表示,多对多神经网络学习到输出的映射。


    基于全链路追踪技术的异常检测

    微服务架构被广泛应用与大规模的Web服务,策略独立的服务模块,使得服务更新和部署更加便利,但是各种各样微服务之间的复杂关系和巨大的微服务规模使得保证服务提供的可靠性更加困难。为了保证微服务架构的可靠性,需要准确高效的故障排除,而调用轨迹异常检测是该过程的重要环节。管理人员通过检测到的异常调用轨迹对故障根因进行分析和定位。

    当下工业界还是以微服务调用和运行状态代码为基础,人工制定复杂的规则来检测异常的调用轨迹。对于规模越来越大、复杂度越来越高的微服务架构,这种方式显然是十分低效甚至是不可行的,为此,以全链路追踪技术为基础,设计算法可以自动化地学习复杂调用轨迹模式,并以此来识别异常调用轨迹。

    分布式服务的跟踪系统需要记录在一次特定的请求后系统中完成的所有工作的信息。如下图所示展现的是一个和5台服务器相关的一个服务,包括:前端(A),两个中间层(B和C),以及两个后端(D和E)。当一个用户发起一个请求时,首先到达前端,然后发送两个RPC到服务器B和C。B会马上做出反应,但是C需要和后端的D和E交互之后再返还给A,由A来响应最初的请求。对于这样一个请求,简单实用的分布式跟踪的实现,就是为服务器上每一次你发送和接收动作来收集跟踪标识符(message identifiers)和时间戳(timestamped events)。

    Dapper 大规模分布式系统的跟踪系统

    01 文献来源

    Sigelman, Benjamin H., et al. "Dapper, a large-scale distributed systems tracing infrastructure." (2010).

    02 文献目标

    Dapper的两点主要要求是:无所不在的部署,持续的监控。无所不在的重要性不言而喻,因为在使用跟踪系统的进行监控时,即便只有一小部分没被监控到,那么人们对这个系统是不是值得信任都会产生巨大的质疑。另外,监控应该是7x24小时的,毕竟,系统异常或是那些重要的系统行为有可能出现过一次,就很难甚至不太可能重现。那么,根据这两个明确的需求,Dapper的三个具体设计目标如下:

    • 低消耗:跟踪系统对在线服务的影响应该做到足够小。在一些高度优化过的服务,即使一点点损耗也会很容易察觉到,而且有可能迫使在线服务的部署团队不得不将跟踪系统关停。

    • 应用级的透明:对于应用的程序员来说,是不需要知道有跟踪系统这回事的。如果一个跟踪系统想生效,就必须需要依赖应用的开发者主动配合,那么这个跟踪系统也太脆弱了,往往由于跟踪系统在应用中植入代码的bug或疏忽导致应用出问题,这样才是无法满足对跟踪系统“无所不在的部署”这个需求。面对当下想Google这样的快节奏的开发环境来说,尤其重要。

    • 延展性:Google至少在未来几年的服务和集群的规模,监控系统都应该能完全把控住。

    03 文献贡献

    相较于研究型的Pinpoint、Magpie和X-Trace,Google提出的Dapper已经在大规模生产环境中摸爬滚打了多年,经过这么多生产环境的验证之后,这篇论文重点阐述在部署Dapper的过程中的设计思想,以及最有效的使用方式。Dappe作为一个平台,承载基于Dapper开发的性能分析工具,以及Dapper自身的监测工具,它的价值在于可以在回顾评估中找出一些意想不到的结果。

    在分布式跟踪这个领域中,Dapper的实现包含了许多新的贡献。例如,为了实现实现低损耗,特别是在高度优化的而且趋于极端延迟敏感的Web服务中,合理的采样率是很必要的。Dapper的另一个重要的特征,是能实现应用级透明,该的组件对应用的侵入被先限制在足够低的水平上,即使想Google网页搜索这么大规模的分布式系统,也可以直接进行跟踪而无需加入额外的标注(Annotation)。

    04 总体架构

    Dapper设计的主要思想在于对基础RPC、线程控制和流程控制的通用组件库的值入,其中包括span的创建、采样率的设置,以及日志写入本地磁盘,以此来实现跟踪系统的低消耗和应用级透明。

    Dapper使用以span为基本树节点的跟踪树构建跟踪模型,如下图所示,Dapper 为每个 span 记录了一个可读的span namespan idparent id,这样就能重建出一次分布式跟踪过程中不同 span 之间的关系。没有parent id 的 span被称为 根span。一次特定跟踪的所有相关 span 会共享同一个通用的trace id 。在一个典型的 Dapper 跟踪中,期望是每个 RPC 对应一个 span,每一个组件层对应跟踪树上的一个层级。

    Dapper通过在部分通用库中进行性能测量埋点,实现应用级透明路径跟踪。(a)当一个线程处理被跟踪的控制路径时,Dapper 会把一个跟踪上下文存储到Thread Local中;跟踪上下文是一个小而容易复制的容器,里面包含了 trace id 和 span id 等 span属性。(b)当计算过程是延迟调用或异步执行时,开发者一般会使用一个通用的控制流程库来构造回调函数,并用线程池或其他 executor 来执行回调;Dapper 确保所有的回调都会存储其创建者的跟踪上下文,而当执行回调时这个跟踪上下文会关联到合适的线程上,通过这种方式,Dapper 用于重建跟踪的 ID 也能透明地用于异步控制流程。(c)Dapper 的跟踪数据是语言无关的,生产环境中的许多跟踪结合了 C++ 和 Java 进程中的数据。

    Dapper 的一个关键设计目标是低损耗,Dapper跟踪系统的成本由两部分组成,一是正在被监控的系统在生成追踪和收集追踪数据的消耗导致系统性能下降;二是需要使用一部分资源来存储和分析跟踪数据。Dapper主要针对采样率进行优化,以实现低损耗,包含适应性采样应对激进采用收集过程中的额外采样三种采样策略。

    最后,介绍以下Dapper的跟踪收集过程,如下图所示,Dapper 的跟踪记录和收集管道分为三个阶段。首先,把 span 数据写入(1)到本地日志文件。然后 Dapper 守护进程从所有生产主机中将他们拉取出来(2),最终写入(3) 到 Dapper 的 Bigtable 仓库中。Bigtable 中的行表示一次跟踪,列表示一个 span。Bigtable 对稀疏表格布局的支持正适合这种情况,因为每个跟踪都可能有任意多个 span。跟踪数据收集即将应用程序二进制数据传输到中央仓库,其延迟中位数小于 15 秒。98 分位延迟呈现双峰形;大约 75% 时间里,98 分位延迟小于 2 分钟,但是在另外 25% 时间里可能会涨到几小时。


    TraceAnomaly 基于深度学习的调用轨迹异常检测算法

    01 文献来源

    Liu, Ping, et al. "Unsupervised Detection of Microservice Trace Anomalies through Service-Level Deep Bayesian Networks." 2020 IEEE 31st International Symposium on Software Reliability Engineering (ISSRE). IEEE, 2020.

    02 文献目标

    • 以可解释的方式统一跟踪的响应时间和调用轨迹:

      • 由于微服务架构的复杂关系,没有异常的微服务调用也可能出现不同的响应时间,因为其响应时间不仅取决于其自身和其处于的调用轨迹也存在着重要关联。

      • 异常和正常的调用轨迹可能具有一致的调用结构,而响应时间是可能区分他们的唯一方式。

      • 检测到异常调用轨迹后要进行故障根因分析,若以现有的故障根因匹配存在一定的局限性,那就是当出现无法匹配的根因时无法正确定位故障根因,这时具有解释性的响应时间和调用轨迹将可以帮助管理人员分析根因。

    • 设计一种健壮的无监督调用轨迹特征学习体系结构:

      • 对于包含许多微服务的单个服务,可能有数百条单独的调用轨迹,因此需要根据其调用轨迹来学习数百个响应时间分配。 针对如此复杂的情况,需要一个大容量的学习模型。

      • 由于无法在如此复杂的上下文中使用大量数据来获取异常标签,因此需要使用无监督学习算法。

    03 文献贡献

    • 提出了一种服务调用轨迹特征构造方法STV:该方法可以有效地对跟踪的响应时间信息和调用路径信息进行编码,并可以在服务级别进行有效学习,在跟踪级别进行准确的异常检测,并在微服务级别进行有效的定位。

    • 提出了一种针对调用轨迹异常检测的无监督学习方法TraceAnomaly:该方法以深度贝叶斯网络为基础,添加后流(posterior flows)可以使用非线性映射来增加贝叶斯网络中潜在变量的复杂度,从而允许模型以健壮,准确和无监督的方式捕获复杂调用轨迹模式。

    • 使用TrainTicket详细测试了本文提出微服务调用轨迹异常检测方法的有效性。

    • STV为基础提出了一种故障根因定位算法。

    04 总体架构

    TraceAnomaly通过周期性的线下训练去自动地学习调用轨迹的正常模式。在线上异常检测的时候,基于学习到的正常模式计算新的调用轨迹的异常分数。如果分数过小,则新的调用轨迹被判定为异常调用轨迹。TraceAnomaly通过基于后验流的深度贝叶斯网络设计,实现了非监督的针对Web服务调用轨迹的异常检测。如下图所示,TraceAnomaly的深度贝叶斯网络的结构,非监督学习是通过左边的编码网络和右边的解码网络实现的,其中,路径向量x表示被编码成向量的调用轨迹。编码网络的作用是将调用轨迹的模式信息编码进神经网络中,而解码网络的作用是用编码进神经网络中的信息重建输入的调用轨迹模式。这样通过编码网络和解码网络的不断迭代学习,重建出的调用轨迹模式的精度不断提升,最终,TraceAnomaly通过这种非监督的方式学习到了调用轨迹中的模式。

    该深度学习算法模型分为离线训练阶段和在线检测两个阶段如下图所示。离线训练阶段,服务的调用轨迹被编码为服务轨迹向量STV,然后被喂入到深度贝叶斯网络进行训练并获得异常检测模型,为了适应潜在的服务升级,将定期对模型进行重新训练。在线检测阶段,新到的调用轨迹先被编码为服务轨迹向量STV,如果存在不可见的调用路径则视为异常,如果不存在则使用训练好的异常检测模型进行检测并计算一个异常值,当该异常值小于一定阈值时,则视该调用轨迹为异常,最后使用根因定位算法分析该异常调用轨迹的故障根因。


    基于对抗网络GAN的异常检测

    与传统的分类方法不同,GAN训练的鉴别器在无监督的方式下学习辨别真伪,使GAN成为异常检测的一种有吸引力的无监督机器学习技术。此外,GAN框架还产生了一个生成器,它实际上是目标系统的一个不明确模型,能够从一定的潜在空间输出正常样本。灵感来自更新从实时空间映射到某个潜在的空间来提高发电机和鉴频器的训练,研究人员最近提议培养潜在的空间可以理解GAN和无监督学习应用它的丰富的特性表征任意的数据分布。通过从潜在空间重构测试样本识别异常的可能性,应用基于GAN的异常检测策略来发现图像的意外标记,以此为启发,可以利用GAN训练过的发生器和鉴别器来更好地检测基于残差和鉴别损失的异常。

    MAD-GAN 基于生成对抗网络的时间序列数据多变量异常检测

    01 文献来源

    Li, Dan, et al. "Anomaly detection with generative adversarial networks for multivariate time series." arXiv preprint arXiv:1809.04758 (2018).

    Li, Dan, et al. "Multivariate anomaly detection for time series data with generative adversarial networks." arXiv preprint arXiv:1901.04997 (2019).

    02 文献目标

    Cyber-Physical Systems(CPSs)是为关键任务设计的相互连接的物理网络系统。一些CPSs的例子是水处理和分配工厂、天然气分配系统、炼油厂、发电厂、电网和自动驾驶汽车。物联网(IoT)的出现将进一步推动CPSs在各种任务中的扩散,导致许多系统和设备在网络上自动通信和操作,因此,网络攻击是CPSs最关注的潜在威胁之一。

    为了解决现代物联网络日益动态和复杂的特性,导致传感器生成的多变量时间序列复杂难以分析,人们利用监督和非监督机器学习技术,从大数据中开发更智能和自适应的方法,以识别异常或入侵。但是,即使使用机器学习技术,检测时间序列中的异常仍然具有挑战性,大多数受监督的技术需要足够多的可靠正常数据和标记异常类来学习,但在实践中很少出现这种情况,因为异常通常很少见。另外,现有的无监督方法大多是通过线性投影和变换建立的,但复杂CPSs多变量时间序列隐藏的内在相关性往往存在非线性,目前的大多数技术还只是将当前状态与预测的正常范围进行简单的比较,由于控制范围不够灵活,不能有效地识别间接攻击,无法进行异常检测。

    03 文献贡献

    • 针对传感器和执行器网络化的复杂多进程网络物理系统,提出了一种基于GAN的无监督异常检测方法

    • 用多变量时间序列训练GAN模型,采用长短期递归神经网络LSTM-RNN捕捉时间依赖性,将一般应用于图像生成域的GAN适应于时间序列生成

    • 统一使用高维的正规序列训练GAN模型辨别真伪,同时从特定的潜在空间重构测试序列

    • 损失计算的训练有素的鉴别器和重建之间的剩余损失和实际测试序列,使用两个训练有素的鉴别器和生成器,组合在一起来检测在高维时间序列异常点,并显示该方法在一个复杂的网络攻击安全水处理系统中异常检测上优于现有方法

    04 总体架构

    为了处理时间序列数据,如下图所示本文使用LSTM-RNN神经网络构造GAN的发生器G和鉴别器D。遵循典型的GAN框架,生成器G以来自随机潜在空间的序列作为其输入生成伪时间序列,并将生成的序列样本传递给鉴别器D,鉴别器D要将将生成的虚假数据序列与实际正常训练数据序列区分开来。

    MAD-GAN框架不是独立处理每个数据流,而是同时考虑整个变量集,以便将变量之间的潜在交互捕获到模型中。该框架在判别前用滑动窗口将多元时间序列分成子序列,为了根据经验确定子序列表示的最佳窗口长度,使用不同的窗口大小来捕获不同分辨率下的系统状态。与标准的GAN框架一样,D和G的参数是基于D的输出来更新的,因此鉴别器D可以被训练为尽可能敏感地将正确的标签分配给真实和虚假序列,而生成器将被训练为尽可能聪明地在经过足够多轮的迭代后欺骗鉴别器,即误导D将真实标签分配给虚假序列。通过能够生成真实的样本,生成器G将已经捕获了训练序列的隐藏多元分布,并且可以被视为正常状态下系统的隐式模型。同时,得到的鉴别器D也已经被训练成能够以高灵敏度区分虚假数据和真实数据。在MAD-GAN框架中,使用G和D来完成异常检测任务的步骤分为:

    • 重构基于从实时空间到GAN潜在空间的映射,利用实时测试样本和G重构样本之间的残差

    • 鉴别用鉴别器D对时间序列进行分类。如图所示,测试样本被映射回潜在空间,以基于重建的测试样本和实际测试样本之间的差异来计算相应的重建损失。同时,测试样本还被馈送到训练好的鉴别器D,以计算鉴别损失。

    • DR值判断异常使用一种新的鉴别和重建异常分数DR-Score来组合两种损失,以检测数据中的潜在异常

    05 实验源码

    Anomaly detection with generative adversarial networks for multivariate time series.

    AMultivariate anomaly detection for time series data with generative adversarial networks.


    TadGAN 生成对抗网络的时间序列异常检测

    01 文献来源

    Geiger, Alexander, et al. "TadGAN: Time Series Anomaly Detection Using Generative Adversarial Networks." arXiv preprint arXiv:2009.07769 (2020).

    02 文献目标

    基于深度学习的方法的一个基本挑战是,它们出色的数据拟合能力带来了它们也能拟合异常数据的风险。使用L2目标函数的自动编码器可以非常精确地拟合和重建数据,从而拟合异常。另一方面,GANs在学习生成器以完全捕捉数据的隐藏分布方面可能是无效的,从而导致错误警报。本文将这两种方法混合在一起,创建了一种更细致的方法。此外,该领域的工作经常强调改进深度学习模型本身。然而,正如我们在本文中所展示的,改进后处理步骤有助于显著减少误报的数量。

    03 文献贡献

    • 针对时间序列数据,本文提出了一种新的基于无监督对抗生成神经网络重构的异常检测方法,并引入了一个周期一致的GAN架构,用于时间序列到时间序列的映射。

    • 本文提出了一种新的两种时间序列相似性度量方法,利用GAN的生成器和判别器来计算每个时间步长时间序列的鲁棒异常分数,该方法适用于评估原始序列和重建序列之间的上下文相似性

    • 本文使用来自3个著名实体 (NASA、Yahoo 和 Numenta ) 的11个时间序列数据集进行了广泛的评估,证明本文提出的方法优于其他8个基线。

    • 本文研究人员开发了一个用于时间序列异常检测的基准系统。该系统是开源的,可以通过其他方法和数据集进行扩展,在撰写本文时,该基准包括9个异常检测管道、13个数据集和2个评估机制。

    04 总体架构

    为了捕捉时间序列分布的时间相关性,本文使用LSTM循环神经网络作为生成器和判别器的基本模型。TadGAN采用循环一致性损失进行训练,以实现有效的时间序列数据重建。除此之外,还提出了几种新的方法来计算重建误差,以及不同的方法来结合重建误差和临界输出来计算异常分数。本文利用对抗性学习方法来获得两个映射函数E和G。如下图所示,将这两个映射函数均视为生成器,E充当编码器,将时间序列映射到潜在空间;而G充当解码器,将潜在空间转换到重建的时间序列;判别器C区分来自x的真实时间序列和来自G(z)生成的虚假时间序列;而判别器Cz测量映射到潜在空间的有效性。

    文中指出应用标准对抗损失的原始公式存在梯度不稳定和模式崩溃的问题。模式崩溃是指在生成器与判别器的动态博弈之后,生成器其实是更倾向于产生那些已经被发现是“好”的样本来愚弄判别器,而不愿意产生新的样本,这导致生成器产生的样本多样性不足,无法完美收敛到目标分布。因此,TadGAN的目标包括 Wasserstein loss 和 Cycle consistency loss ,前者是为了使生成的时间序列的分布与目标域的数据分布相匹配;后者是为了防止两个生成器之间产生矛盾。

    05 实验源码

    TadGAN: Time Series Anomaly Detection Using Generative Adversarial Networks.


    基于 GAN 的发电厂多元时间序列数据异常检测与定位

    01 文献来源

    Choi, Yeji, et al. "Gan-based anomaly detection and localization of multivariate time series data for power plant." 2020 IEEE International Conference on Big Data and Smart Computing (BigComp). IEEE, 2020.

    02 文献目标

    如果将对抗训练方法 (GAN) 直接应用于LSTM-RNN模型,这会导致优化模型的巨大计算复杂性。因为基于 LSTM 的 GAN 需要一个迭代过程,该过程中通过在随机潜在空间中生成样本并将测试数据重新映射回潜在空间来更新模型,这就导致了巨大的计算复杂性。为此,本文提出了一种新的基于 GAN 的异常检测和定位框架,以及一种称为距离图像 (Distance Image) 被用于多元时间序列成像的变换方法,使得能够尽可能早地检测异常情况发生的某个时间点。

    03 文献贡献

    本文提出了一种新的基于对抗生成神经网络的异常检测和定位框架,以及一种用于多元时间序列成像的变换方法,称为距离图像。生成器可以学习一系列距离图像到下一个距离图像的映射,从而不仅可以分析时间序列数据的时间关联,还可以通过卷积滤波分析多变量之间的相关性。特别地,具有逐点卷积的编码器确保编码每个时间序列图像的时间信息以及每个变量之间的相互关系。在电厂真实数据上的实验证明了该方法对异常检测任务的有效性,并证实了该方法得到的异常分值是诊断异常情况的重要指标。

    04 总体架构

    在对多元时间序列图像进行异常检测之前,本文使用一种称为距离图像的方法用于多元时间序列成像的变换,通过测量每个时间步长的变量之间的相似性来将多变量时间序列数据转换成图像,该方法受到距离矩阵概念的启发,通过合成距离图像来表征给定持续时间内每对变量之间的相位差。这种变换不仅通过测量每个变量之间的相位差将传感器之间的相关关系编码为空间信息,而且捕获了给定时间段内的时间信息。此外,它对某些点上出现的脉冲噪声是鲁棒的,因为噪声通过时间轴上的平均处理被冲走了。多元时间序列成像转换的例子如下图所示,正常情况下的正常模式有很多种,来自异常状态的模式不同于正常样本的模式。

    基于上述距离图像,本文提出的基于对抗生成神经网络的异常检测和定位框架如下图所示,首先将每个时间步长内的多元时间序列转换成距离图像,时间窗口大小为 w,然后将该序列图像馈送给GANs以生成下一个距离图像。这个过程中,在生成器的顶部使用了逐点卷积层 (Pointwise Convolution) ,以便从一系列距离图像中捕获时间信息,并使用一般的卷积层来提取表示每对变量相关性的空间信息。该框架的目标是训练一个有效的生成器,能够根据一个距离图像序列生成下一个预期的距离图像,为此,训练过程中只使用正态数据集进行训练,学习正态数据分布的潜在向量空间。生成器 G 由编码器和解码器结构组成,并使用跳跃连接来提高输出结果的质量;鉴别器 D 尽可能的区分输入图像 (真实) 和重建图像 (虚假) 。

    最后结合真实距离图像和估计距离图像之间的残差损失和判别特征损失,推导出异常评分函数。为了确定给定时间序列数据对应于正常情况还是异常情况,本文定义了基于两个损失的异常评分函数,即鉴别器中的重建损失和特征损失。重建损失计算公式如下所示:

                                                                       L_{rec} = E_x||m^t-G(m^{t-w},...,m^{t-1})||_1

    对于在时间步长为 t 的距离图像 mt ,在 t 时段其异常评分计算公式如下所示,其中 f 是D的最后一层特征向量,lambda是调节特征丢失对总体异常评分函数的影响的加权参数。

                                                                     L_f = ||f(m_t)-f(G(m^{t-w},...,m^{t-1}))||

                                                                                      \Phi(t) = L_{rec}^t + \lambda_fL_f^t

    由于模型只学习训练数据集中正态数据的分布,当测试数据偏离正态数据分布时,重构损失会增加。此外,输入图像和生成图像的特征向量的L2距离计算特征空间中的相异度。因此,这些损失的组合可以实现测量异常的程度。当该异常分数接近0时,意味着测试时间点对应于正常状态,反之亦然。

    展开全文
  • 数据挖掘:数据清洗——异常值处理 一、离群点是什么? 离群点,是一个数据对象,它显著不同于其他数据对象,与其他数据分布有较为显著的不同。有时也称非离群点为“正常数据”,离群点为“异常数据”。 离群点跟...

    数据挖掘:数据清洗——异常值处理在这里插入图片描述

    一、离群点是什么?

    离群点,是一个数据对象,它显著不同于其他数据对象,与其他数据分布有较为显著的不同。有时也称非离群点为“正常数据”,离群点为“异常数据”。

    离群点跟噪声数据不一样,噪声是被观测变量的随机误差或方差。一般而言,噪声在数据分析(包括离群点分析)中不是令人感兴趣的,需要在数据预处理中剔除的,减少对后续模型预估的影响,增加精度。

    离群点检测是有意义的,因为怀疑产生它们的分布不同于产生其他数据的分布。因此,在离群点检测时,重要的是搞清楚是哪种外力产生的离群点。
    常见的异常成因:

    1. 数据来源于不同的类(异常对象来自于一个与大多数数据对象源(类)不同的源(类)的思想)
    2. 自然变异
    3. 数据测量或收集误差。

    通常,在其余数据上做各种假设,并且证明检测到的离群点显著违反了这些假设。如统计学中的假设检验,基于小概率原理,对原假设进行判断。一般检测离群点,是人工进行筛选,剔除不可信的数据,例如对于房屋数据,面积上万,卧室数量过百等情况。而在面对大量的数据时,人工方法耗时耗力,因此,才有如下的方法进行离群点检测。

    二、常用的离群点的检测方法

    【1】基于统计模型的方法:

    1. 首先建立一个数据模型,异常是那些同模型不能完美拟合的对象;
    2. 如果模型是簇的集合,则异常是不显著属于任何簇的对象;
    3. 在使用回归模型时,异常是相对远离预测值的对象。

    【2】基于邻近度的方法:通常可以在对象之间定义邻近性度量,异常对象是那些远离其他对象的对象。

    【3】基于密度的方法:仅当一个点的局部密度显著低于它的大部分近邻时才将其分类为离群点。

    【4】基于聚类的方法:聚类分析用于发现局部强相关的对象组,而异常检测用来发现不与其他对象强相关的对象。因此,聚类分析非常自然的可以用于离群点检测。

    三、 基于分布(概率模型)的假设检验的方法:

    基于统计模型的方法:

    统计方法

    统计方法。统计学方法是基于模型的方法,即为数据创建一个模型,并且根据对象拟合模型的情况来评估它们。大部分用于离群点检测的统计学方法都是构建一个概率分布模型,并考虑对象有多大可能符合该模型。
    离群点的概率定义:离群点是一个对象,关于数据的概率分布模型,它具有低概率。这种情况的前提是必须知道数据集服从什么分布,如果估计错误就造成了重尾分布

    参数方法:

    1.基于正态分布的一元离群点检测

    • 当数据服从正太分布的假设时在正态分布的假定下,u±3σ区域包含99.7%的数据,u±2σ包含95.4%的数据,u±1σ包含68.3%的数据。其区域外的数据视为离群点。
    • 当数据不是对称分布时,可以使用切比雪夫不等式,它对任何分布形状的数据都适用。根据切比雪夫不等式,至少有(1-1/k2)的数据落在±k个标准差之内。所以,有以下结论:
      至少有75%的数据在平均数±2个标准差的范围之内;
      至少有89%的数据在平均数±3个标准差的范围之内;
      至少有94%的数据在平均数±4个标准差的范围之内;

    计算得到:通过绘制箱线图可以直观地找到离群点,或者通过计算四分位数极差(IQR)定义为Q3-Q1。比Q1小1.5倍的IQR或者比Q3大1.5倍的IQR的任何对象都视为离群点,因为Q1-1.5IQR和Q3+1.5IQR之间的区域包含了99.3%的对象。

    假设检验:根据问题的需要对所研究的总体作某种假设,记作H0;选取合适的统计量,这个统计量的选取要使得在假设H0成立时,其分布为已知;由实测的样本,计算出统计量的值,并根据预先给定的显著性水平进行检验,作出拒绝或接受假设H0的判断。常用的假设检验方法有u—检验法、t检验法、χ2检验法(卡方检验)、F—检验法,秩和检验(非参数)等。假设检验检测离群点原理

    2.多元离群点检测

    使用混合参数分布在许多情况下,数据是由正态分布产生的假定很有效。然而,当实际数据很复杂时,这种假定过于简单。在这种情况下,假定数据是被混合参数分布产生的。混合参数分布中用期望最大化(EM)算法来估计参数。

    异常检测的混合模型方法:对于异常检测,数据用两个分布的混合模型建模,一个分布为普通数据,而另一个为离群点。
    聚类和异常检测目标都是估计分布的参数,以最大化数据的总似然(概率)。聚类时,使用EM算法估计每个概率分布的参数。然而,这里提供的异常检测技术使用一种更简单的方法。初始时将所有对象放入普通对象集,而异常对象集为空。然后,用一个迭代过程将对象从普通集转移到异常集,只要该转移能提高数据的总似然(其实等价于把在正常对象的分布下具有低概率的对象分类为离群点)。(假设异常对象属于均匀分布)。异常对象由这样一些对象组成,这些对象在均匀分布下比在正常分布下具有显著较高的概率。

    优缺点:

    (1)优点:有坚实的统计学理论基础,当存在充分的数据和所用的检验类型的知识时,这些检验可能非常有效;
    (2)缺点:大多数方法是针对一元数据的,而对于多元数据,可用的选择少一些,并且对于高维数据,这些检测可能性很差。
    在这里插入图片描述

    非参数方法:
    • 不假定先验统计模型,而是试图从输入数据确定模型

    通过绘制直方图进行查找,看图说话。但这个方法很难选择一个较好的直方图参数。

    优缺点:

    (1)优点:可以通过观察数据的分布情况,直观地找到异常点的大致范围。
    (2)缺点:一方面,如箱尺寸太小,则由很多正常对象都会落入空的或稀疏箱,因而被误识别为离群点。这将导致很高的假正例率或低精度。相反,如果箱尺寸太大,则离群点对象可能渗入某些频繁的箱中,这将导致很高的假负例率或召回率。为了解决这些问题,使用核密度估计来估计数据的概率密度分布。

    基于簇的离群点检测

    模型是簇,则异常是不显著属于任何簇的对象。
    注意
    传统的观点都认为孤立点是一个单独的点,然而很多的现实情况是异常事件具有一定的时间和空
    间的局部性,这种局部性会产生一个小的簇.这时候离群点(孤立点)实际上是一个小簇(图下图的C1和C3)。
    在这里插入图片描述

    基于回归模型的离群点检测

    反应釜中温度的相关过程数据用于算法测试 . 对于反应釜中的温度 ,利用温度传感器 , 每隔 1 min对其进行采样 . 同时 , 上述过程数据中还包含了测量噪声 .
    注意
    (1)由于有离群点的存在,在建立模型时,需要建立一个鲁棒预测模型。防止出现过拟合现象,非鲁棒性预测模型尽管该能够检测出全部离群点 , 但同时也会出现了误检的情况 , 随着测量噪声的进一步加大 , 误检或漏检的问题也将更加突出 。
    (2)模型鲁棒性需要选择合适的阈值。
    在这里插入图片描述

    三、基于邻近性的方法

    一个对象是异常的,如果它远离大部分点。这种方法比统计学方法更一般、更容易使用,因为确定数据集的有意义的邻近性度量比确定它的统计分布更容易。不依赖统计检验,将基于邻近度的离群点看作是那些没有“足够多“邻居的对象。这里的邻居是用**邻近度(距离)**来定义的。最常用的距离是绝对距离(曼哈顿)和欧氏距离等等。

    一个对象的离群点得分由到它的k-最近邻的距离给定。离群点得分对k的取值高度敏感。如果k太小,则少量的邻近离群点可能导致离群点较少;如果K太大,则点数少于k的簇中所有的对象可能都成了离群点,导致离群点过多。为了使该方案对于k的选取更具有鲁棒性,可以使用k个最近邻的平均距离。

    优缺点:

    (1)优点:简单;
    (2)缺点:基于邻近度的方法需要O(m2)时间,大数据集不适用;
    (3)该方法对参数的选择也是敏感的;
    (4)不能处理具有不同密度区域的数据集,因为它使用全局阈值,不能考虑这种密度的变化。
    在这里插入图片描述

    四、基于密度的方法

    从基于密度的观点来说,离群点是在低密度区域中的对象。一个对象的离群点得分是该对象周围密度的逆。基于密度的离群点检测与基于邻近度的离群点检测密切相关,因为密度通常用邻近度定义。

    定义密度

    一种常用的定义密度的方法是,定义密度为到k个最近邻的平均距离的倒数。如果该距离小,则密度高,反之亦然。
    另一种密度定义是使用DBSCAN聚类算法使用的密度定义,即一个对象周围的密度等于该对象指定距离d内对象的个数。需要小心的选择d,如果d太小,则许多正常点可能具有低密度,从而离群点较多。如果d太大,则许多离群点可能具有与正常点类似的密度(和离群点得分)无法区分。使用任何密度定义检测离群点具有与基于邻近度的离群点方案类似的特点和局限性。特殊地,当数据包含不同密度的区域时,它们不能正确的识别离群点

    定义相对密度

    为了正确的识别这种数据集中的离群点,我们需要与对象邻域相关的密度概念,也就是定义相对密度。常见的有两种方法:
    (1)使用基于SNN密度的聚类算法使用的方法;
    (2)用点x的密度与它的最近邻y的平均密度之比作为相对密度使用相对密度的离群点检测(局部离群点要素LOF技术)

    1. 首先,对于指定的近邻个数(k),基于对象的最近邻计算对象的密度density(x,k),由此计算每个对象的离群点得分;
    2. 然后,计算点的邻近平均密度,并使用它们计算点的平均相对密度。这个量指示x是否在比它的近邻更稠密或更稀疏的邻域内,并取作x的离群点得分(这个是建立在上面的离群点得分基础上的)
    优缺点:

    (1)优点:给出了对象是离群点的定量度量,并且即使数据具有不同的区域也能够很好的处理;(2)与基于距离的方法一样,这些方法必然具有O(m2)的时间复杂度。对于低维数据使用特定的数据结构可以达到O(mlogm);
    (3)缺点:参数选择是困难的。虽然LOF算法通过观察不同的k值,然后取得最大离群点得分来处理该问题,但是,仍然需要选择这些值的上下界。
    在这里插入图片描述

    五、基于聚类的方法

    一种利用聚类检测离群点的方法是丢弃远离其他簇的小簇。这个方法可以和其他任何聚类技术一起使用,但是需要最小簇大小和小簇与其他簇之间距离的阈值。这种方案对簇个数的选择高度敏感。使用这个方案很难将离群点得分附加到对象上。、
    一种更系统的方法,首先聚类所有的点,对某个待测点评估它属于某一簇的程度。(基于原型的聚类可用离中心点的距离来评估,对具有目标函数(例如kmeans法时的簇的误差平方和)的聚类技术,该得分反映删除对象后目标函数的改进),如果删去此点能显著地改善此项目标函数,则可以将该点定位为孤立点。
    基于聚类的离群点:一个对象是基于聚类的离群点,如果该对象不强属于任何簇。离群点对初始聚类的影响:如果通过聚类检测离群点,则由于离群点影响聚类,存在一个问题:结构是否有效。为了处理该问题,可以使用如下方法:

    1. 对象聚类,删除离群点,对象再次聚类(这个不能保证产生最优结果)。
    2. 还有一种更复杂的方法:取一组不能很好的拟合任何簇的特殊对象,这组对象代表潜在的离群点。随着聚类过程的进展,簇在变化。不再强属于任何簇的对象被添加到潜在的离群点集合;而当前在该集合中的对象被测试,如果它现在强属于一个簇,就可以将它从潜在的离群点集合中移除。聚类过程结束时还留在该集合中的点被分类为离群点(这种方法也不能保证产生最优解,甚至不比前面的简单算法好,在使用相对距离计算离群点得分时,这个问题特别严重)。

    对象是否被认为是离群点可能依赖于簇的个数(如k很大时的噪声簇)。该问题也没有简单的答案。一种策略是对于不同的簇个数重复该分析。另一种方法是找出大量小簇,其想法是(1)较小的簇倾向于更加凝聚,(2)如果存在大量小簇时一个对象是离群点,则它多半是一个真正的离群点。不利的一面是一组离群点可能形成小簇而逃避检测。

    优缺点:

    (1)优点:基于线性和接近线性复杂度(k均值)的聚类技术来发现离群点可能是高度有效的;
    (2)簇的定义通常是离群点的补,因此可能同时发现簇和离群点;
    (3)缺点:产生的离群点集和它们的得分可能非常依赖所用的簇的个数和数据中离群点的存在性,不知道具体该有多少个离群点;
    (4)聚类算法产生的簇的质量对该算法产生的离群点的质量影响非常大。
    在这里插入图片描述

    六、sklearn中异常值的检测方法

    异常检测的分类

    novelty detection: 训练集中没有异常样本
    outlier detection: 训练集中有异常样本

    异常样本:

    数量少,比较分散

    novelty detection和outlier detection的区别

    1. 它们的关注对象不同。novelty detection认为,所有跟训练集样本类别不同的点都是异常,不论它跟正常样本有多像,也不论它的分布有多聚集;而outlier detection要求更宽松,只有那些分布稀疏且离正常样本较远的点才是异常的
    2. 它们属于不同的机器学习范畴。noverlty detection是半监督学习,因为训练集都是正常样本,所以我们就已经知道了正常样本的数据分布;outlier detection是无监督学习,因为训练集和测试集(真实环境)的分布是一样的,我们无法得知正常样本的分布,只能对数据分布的假设来区分正常和异常。差异自己掌握。

    Sklearn异常检测模型一览

    sklearn中4种异常检测模型(列)在不同数据集(行)中的检测效果对比

    1. Robust covariance,即基于方差的鲁棒的异常检测模型,在sklearn中是sklearn.covariance.EllipticEnvelope。该模型假设正常样本都服从高斯分布。显然,对如上图所示的二维数据集,covariance.ELLipticEnvelope采用二维的椭圆拟合正常样本。
    2. One-Class SVM,即单类别的SVM,在sklearn中是sklearn.svm.OneClassSVM,从上图可以看到该模型的边界都是弯弯曲曲的,说明one-class svm具有很强的拟合能力,但这也导致了它对训练集中对噪声点很敏感。
      one-class svm只适用于novelty detection,而outlier detection的训练集中会包含异常样本,因此不适合使用one-class svm来做。
    3. Isolation Forest,即孤立森林,在sklearn中是sklearn.ensemble.IsolationForest,它在上图5中数据集中的异常检测效果都不错。
    4. Local Outlier Factor,即局部异常因子检测算法,又称LOF,即相对密度,在sklearn中是sklearn.neighbors.LocalOutlierFactor,效果也不错。

    奇异点检测(Novelty Detection)

    奇异点检测,就是判断待测样本到底是不是在原来数据的概率分布内。概率学上认为,所有的数据都有它的隐藏的分布模式,这种分布模式可以由概率模型来具象化。

    One-Class SVM

    SVM通过把原始空间通过核方法(kernel method)映射到一个特征空间中,进而使不同类别的样本在特征空间中很容易分开。One-class SVM也是一样的,先用一个核方法,比如高斯核(RBF kernel)将原始空间映射到特征空间,然后在特征空间中画一个“圈”,圈内是自己人,圈外是敌人。这个“圈”就是支撑向量(support vectors)形成的边界。
    当训练数据只有一类时,可以选择One-class SVM算法。该算法进行异常点检测原理是将样本数据训练出一个最小的超球面(大于3维特征),其中在二维中是一个曲线,将数据全部包起来,即将异常点排除其核心在于选择从低维的空间向高维特征空间映射的核函数及相应的误差惩罚因子。跟SVM调参一样。
    在这里插入图片描述

    离群点检测(Outlier Detection)

    不同与奇异点检测是,现在我们没有一个干净的训练集(训练集中也有噪声样本)。下面介绍的三种离群点检测算法其实也都可以用于奇异点检测。

    Fitting an elliptic envelope(拟合一个椭圆矩形)

    做离群点检测的最简单的思路是,正常数据服从一个已知的分布。服从一个已知的分布,说白了就是正常数据的分布可以通过一个不是很复杂的数据公式刻画出来,如均匀分布、高斯分布、泊松分布等等。这个模型假设所有的数据都服从高斯分布,然后拿着开始试不同的均值和方差(高维情况下就是均值矩阵和协方差矩阵),那组均值和方差形成的高斯分布适合描述当前的数据集。这就像套圈,拿着不同形状的椭圆套,套套套~
    SKlearn提供了一个covariance.EllipticEnvelope类,它可以根据数据做一个鲁棒的协方差估计,然后学习到一个包围中心样本点并忽视离群点的椭圆。

    鲁棒的意思是足够稳定,绝不过拟合。

    下图是Sklearn官方给出的例子,可以看到robust做的很棒,平时用的时候默认开启robust设置就好了。
    在这里插入图片描述

    Isolation Forest

    孤立森林是一个高效的离群点监测算法。该算法与随机森林同源,具体检测算法如下:

    1. 随机选择一个数据集的子集作为单棵树的根结点
    2. 随机选择一个特征
    3. 在该特征上随机选择一个值做split
    4. 重复2、3直到树的深度到达
    5. 重复1、2、3、4到树个数上限
    6. 经常距离根结点较近的点是异常点

    那些距离根结点比较近的,都是因为离群,导致很容易被划分成叶子节点

    LOF

    LOF算法比较复杂,它通过观察数据分布的密度来检测异常。
    LOF中的基本概念:

    1. k-neighbors,即K近邻,就是距离目标样本点最近的k个样本。
    2. rechability distance,即可达距离,就是目标样本点的势力范围,是一个能把K近邻都包含进去的圆。
    3. rechability density,即可达密度,就是目标样本点势力范围内的“人口密度”。

    如果我们认为,可达密度小的目标样本点就是异常点,这样未尝不可。但是,LOF算法更进一步。
    LOF算法从两个维度判断异常点:

    1. 目标样本点的可达密度小
    2. 目标样本的K近邻的可达密度都较大
      LOF可以用来判断经纬度的异常。

    总结

    如果训练集很干净:使用one-class svm
    训练集不干净,如果能保证训练集能基本覆盖正常样本:LOF
    训练集不干净,如果能保证训练集服从正太分布:EllipticEnvelope
    训练集不干净,不能保证训练集基本覆盖正常样本:isolation forest

    七、 参考文献

    http://blog.sina.com.cn/s/blog_6002b97001014njh.html
    https://blog.csdn.net/qq_34531825/article/details/72828182
    https://wenku.baidu.com/view/208864738e9951e79a892705.html
    https://blog.csdn.net/hustqb/article/details/75216241
    https://blog.csdn.net/hustqb/article/details/75216241

    展开全文
  • 为了定位人群异常行为,将视频分成若干子区域,获取视频的子区域时空数据样本,然后将数据样本输入设计的深度时空卷积神经网络进行训练和分类,实现人群异常行为的检测与定位。同时,为了解决深度时空卷积神经网络...
  • 基于时间序列采集的历史数据集中,引入索引号,对历史数据集进行聚类,分析数据集与索引号的映射关系,将实时获得的输入数据流通过滑动窗口匹配,实现对单数据流的异常点检测与修正。再利用输入、输出数据间的...
  • 针对输入为确定数、输出为LR型模糊数的模糊数据集,利用最小二乘法建立了该模糊数据集的模糊线性回归分析模型及参数估计,用数据删除的方法研究了数据删除模糊线性回归模型,构造了统计诊断量-模糊Cook距离来识别...
  • 时序数据异常检测

    万次阅读 多人点赞 2019-07-12 17:22:21
    文章目录AIOPS网上相关资料一、时序数据概念及分析1.1 数据前期处理的重要性1.2.1时序数据周期研究(重点方向)1.3 时序数据的随机过程1.4 白噪声序列1.5 平稳性序列1.7 弱平稳1.7.1 原始序列平稳处理方法1.8 关于多...
  • Python数据清洗--异常值识别与处理01

    千次阅读 2020-12-29 00:40:30
    前言《Python数据清洗--类型转换和冗余数据删除》和《Python数据清洗--缺失值识别与处理》文中已经讲解了有关数据中重复观测和缺失值的识别与处理,本节中将分享异常值的判断和处理方法。异常值也称为离群点,...
  • CVPR2019 无监督异常检测/定位数据集:MVTec AD

    千次阅读 多人点赞 2020-12-05 21:58:15
    《MVTec AD:A Comprehensive Real-World Dataset for Unsupervised Anomaly Detection...数据集为异常区域都提供了像素级标注,是一个全面的、包含多种物体、多种异常数据集。 训练集中只包含正常样本,测试集中包.
  • 常见的脏数据:缺失值、异常值、不一致的值、重复数据即含有特殊符号(如#、¥、*)的数据 一、缺失值分析 1、缺失值产生的原因: 1.有些信息暂时无法获取,或获取信息的代价太高。 2.信息被遗漏,可能是人为因素,...
  • 数据处理中的异常处理

    千次阅读 2018-09-27 14:37:54
    异常即是一个事件,该事件会程序执行过程中发生,影响了程序的正常执行。 一般情况下,Python无法正常处理程序时就会发生一个异常异常是Python对象,表示一个错误。 当Python脚本发生异常时我们需要捕获...
  • 一般来说,异常值出现有各种原因,比如数据集因为数据来自不同的类、数据测量系统误差而收到损害。根据异常值的检测,异常值与原始数据集中的常规数据显著不同。开发了多种解决方案来检测他们,其中包括基于模型的...
  • 数学形式可表示为: y = f (X), X = {X1, X2, ...}, also is X = {Xt : t∈T} y ∈ {0,1} 乍看之下,时序数据异常检测,输入数据形式简单,任务也很明确,一般情况输入的数量也很小,很容易设计各种算法来做...
  • 《Python数据清洗(一):类型转换和冗余数据删除》和《Python数据清洗(二):缺失值识别与处理》文中已经讲解了有关数据中重复观测和缺失值的识别与处理,本节中将分享异常值的判断和处理方法。 异常值也称为离群...
  • Peirce准则是消除异常值的统计程序。
  • 异常检测——从经典算法到深度学习》 0 概论 1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法 3 基于One-Class SVM的异常检测算法 4 基于高斯概率密度异常检测算法 5 Opprentice——异常检测经典...11 针对
  • 如何应对接口数据异常

    千次阅读 2018-12-17 17:10:48
    如何应对接口数据异常1 已知字段名一致,格式变化2 字段不存在或者Entity未定义字段 1 已知字段名一致,格式变化 参考1:https://www.jianshu.com/p/d6bd6bd5fce3 ( 采取方法:自定义Gson响应体变换器和响应变换...
  • 为了解决网络中节点设备异常检测、智能运维、根因分析等问题,针对链路时延、网络吞吐率、设备内存使用率等时序数据,提出了一种基于图的门控卷积编解码异常检测模型。考虑网络场景的实时性需求以及网络拓扑连接关系...
  • 开发过程中,针对用户输入的不合法信息,我们应该后端进行数据验证,并抛出相关的异常传递到前端来提示用户。 可是如何进行自定义抛出异常信息呢?通常处理方法有三种,我将依次介绍这三种方法。 第一种方法: ...
  • python_异常处理

    千次阅读 2021-02-10 21:43:26
    1.1.异常的概念程序运行时,如果python解释器遇到一个错误,会停止...通过异常捕获可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性一段代码:num = int(input("请输入数字:"))print('hello')如果我们...
  • Fetch的数据获取和发送以及异常处理

    万次阅读 2018-12-17 15:54:12
    这样不清楚哪里出错了,你肯定也不会想在异常时,输出下面这样:   让我们看看响应: { body: ReadableStream bodyUsed: true headers: Headers ok: false // Response is not ok redirected...
  • 异常检测算法分类及经典模型概览

    千次阅读 2020-02-23 13:12:09
    最近工作涉及有关异常检测的内容,而且前几天公司做了一次有关异常检测算法和应用场景的分享,此总结记录一下。 ​什么是异常检测? 异常检测(Anomaly Detection 或 Outlier Detection)指的是通过数据挖掘...
  • 第二个实验是提出的因果卷积进行的实验,针对不同的卷积核大小进行判断,仍e-c与t-c数据集上进行,训练损失函数值如下图所示。 第三个实验是针对提出的LogSparse策略的实验。比较了LogSparse策略Transformer与...
  • 针对现有离群点检测算法存在参数选取困难、效率差和精度低等问题,提出了基于...实验结果表明,所提算法减少了参数选取,提高了时间效率,同时基于双向邻居的修正因子使算法合成数据集和UCI数据集上的准确率更高。
  • 【Python】异常处理

    千次阅读 2021-03-06 04:12:37
    异常的概念程序运行的时候,遇到错误导致程序停止运行时,这就是异常。程序停止运行,并且提示错误信息这个动作,我们称为:抛出(raise)异常。程序开发的时候,很难一次性考虑到所有的特殊情况,通过异常捕获可以...
  • 针对人体行为最重要的motion特征,提出了基于时间上下文的二级递推异常行为识别方法.不同于传统深度学习的训练方法,本文方法不是直接从图像数据中学习特征,而是把提取的形状信息HOG特征作为训练输入.首先提取基于...
  • 数据点一般系统运行过程中产生,且能反应系统的功能是否正常,多以日志形式呈现。当系统功能发生异常时,就会产生异常数据。快速高效地发现这些异常值,对于快速止损具有重要意义。对此,我们提
  • 导读:在数据清洗过程中,主要处理的是缺失值、异常值和重复值。所谓清洗,是对数据集通过丢弃、填充、替换、去重等操作,达到去除异常、纠正错误、补足缺失的目的。作者:宋天龙如需...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 181,801
精华内容 72,720
关键字:

在针对异常输入数据