很可惜 T 。T 您现在还不是作者身份,不能自主发稿哦~
如有投稿需求,请把文章发送到邮箱tougao@appcpx.com,一经录用会有专人和您联系
咨询如何成为春羽作者请联系:鸟哥笔记小羽毛(ngbjxym)
异常数据识别在数据分析和数据挖掘中,是经常会遇到的问题。本文会介绍不同场景下,异常数据识别的方法有哪些,以及他们之间的区别。
当前异常数据识别的使用场景主要有以下2方面:
1、数据分析和数据挖掘在正式分析前的数据处理,识别异常数据后,删除或者修正异常数据,避免异常数据影响分析结论;
2、 风控业务,通过数据识别异常用户、异常访问、异常订单、异常支付等,避免黑产团队入侵。
对变量做描述性统计,然后再基于业务考虑哪些数据是不合理的。常用的统计量是最大值和最小值,判断这个变量是否超过合理的范围。例如:用户的年龄为150岁,这就是异常的。
定义:如果单变量数据服从正态分布,异常值被定义为与平均值偏差超过3倍标准差的值。
原因:是因为在正态分布的假设下,偏离均值3倍标准差出现的概率小于0.003,是一个小概率事件。
在实际分析中,我们也不一定要拘泥于3倍标准差,可以根据实际严格程度定义,如偏离均值的4倍标准差。
如果原始数据的分布是有偏的,不满足正态分布时,可通过BOX-COX转化,在一定程度上修正分布的偏态。转换无需先验信息,但需要搜寻最优的参数λ。
Box-Cox变换的一般形式为:
1)式中y(lambda)为经Box-Cox变换后得到的新变量,y为原始连续因变量,lambda为变换参数。
2)以上变换要求原始变量y取值为正,若取值为负时,可先对所有原始数据同加一个常数a,使其(y+a)为正值,然后再进行以上的变换。
Box-Cox的python实现如下,可直接通过函数boxcox找到最优的lambda和转化后的值:
它能显示出一组数据的最大值、最小值、中位数及上下四分位数;
箱线图提供了一种数据识别的标准:异常值通常被定义为小于下边缘或者大于上边缘的数据为异常值。如下图所示:
上四分位数:1/4的样本值取值比他大
下四分位数:1/4的样本值取值比他小
上边缘=上四分位数+1.5*(上四分位数-下四分位数)
下边缘=下四分位数-1.5*(上四分位数-下四分位数)
箱线图识别异常数据的优势:
1)箱线图根据数据的真实分布绘制,他对数据不做任何限制性的要求,比如要服从正态分布等;
2)箱线图异常数据识别依赖于上四分数和下四分位数,因此异常值极其偏差不会影响异常值识别的上下边缘。这一点是优于3倍标准差方法的。
日常工作中还有一种场景,是需要对时间序列数据进行监控,如:订单量、广告访问量、广告点击量;我们需要从时间维度识别出是否异常刷单、刷广告点击的问题。像广告投放场景下,如果发现渠道刷量,会及时停止广告投放,减少损失。
对于时间序列数据异常识别,根据数据不同的特点,识别方法不同。
如果时间序列呈现平稳分布状态,即时间序列数据围绕中心值小范围内波动;我们可以定义上下界的恒定阈值,如果超过上下阈值则定义为异常。
所谓动态阈值是指,当前时间的异常阈值是由过去n段时间的时序数据计算决定的;通常对于无周期,比较平稳的时间序列,设定动态阈值的方法是移动平均法。
所谓移动平均法是:
就是用过去n个时间点的时序数据的平均值作为下一个时间点的时序数据的预测,
异常数据识别即是:确定固定移动窗口n,以过去n个窗口的指标平均值作为下一个窗口的预测值;以过去n个窗口的指标的平均值加减3倍方差作为监控的上下界。
如果时间序列数据是周期性数据,可使用STL算法将时序数据拆解成趋势项、周期项和余项。即每个时刻的时序数据等于当前时序趋势项、周期项和余项的和(或者乘)。
趋势项(T_v):涵盖了这个时序数据的趋势变化;
周期项(S_v):涵盖了时序数据的周期变化;
一般使用STL需要确定2个点:
1)确定数据周期,外卖业务的一个常规周期为7天,在周一至周五又可以将数据周期缩短为1天。
2)拆分规则,是选择加法方式还是乘法方式。
加法方式:原始数据 = 平均季节数据 + 趋势数据 + 余项这种方式,随着时间的推移季节数据不会有太大的变化,在以七天为一大周期的业务数据更适合这样的拆分方式。
乘法方式:原始数据 = 平均季节数据 * 趋势数据 * 余项
这种方式,直观感受是随着时间的推移季节数据波动会非常明显。
至于如何要判断某事的时序数据是否异常,是根据STL分解后的余项来判断;一般情况下,余项部分的时序数据是平稳分布状态,我们可对余项设置恒定阈值或者动态阈值,如果某个时间节点的分解余项超过设定阈值,则是异常数据。
python可以用seasonal_decompose可以将时间序列数据拆解成三部分,具体函数代码如下:
import statsmodels.api as sm
from statsmodels.tsa.seasonal
import seasonal_decomposeimport matplotlib.pyplot as plt
# Multiplicative Decomposition
result_mul = seasonal_decompose(data1, model='multiplicative', extrapolate_trend='freq')
Actual_Values = result_mul.seasonal * result_mul.trend * result_mul.resid
# Additive Decomposition
result_add = seasonal_decompose(data1, model='additive', extrapolate_trend='freq')
Actual_Values = result_mul.seasonal + result_mul.trend + result_mul.resid
所谓多变量数据异常识别是指:不只从一个特征去判读数据异常,而是在多个特征下来判断其是否异常。多变量异常数据识别的方法很多,比如聚类模型、孤立森林模型、one-class svm模型等。下面主要介绍简单高效,更容易使用的孤立森林模型。
基本介绍:
孤立森林iForest (Isolation Forest) 是一个可扩散到多变量的快速异常检测方法。iForest 适用于连续数据的异常检测,将异常定义为“容易被孤立的离群点——可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而可以认为落在这些区域里的数据是异常的。
iForest属于Non-parametric和unsupervised的方法,即不用定义数学模型也不需要有标记的训练。
算法逻辑介绍:
假设现在有一组一维数据(如下图所示),我们要对这组数据进行随机切分,希望可以把点 A 和点 B 单独切分出来。具体的,我们先在最大值和最小值之间随机选择一个值 x,然后按照
我们把数据从一维扩展到两维。同样的,我们沿着两个坐标轴进行随机切分,尝试把下图中的点A'和点B'分别切分出来。我们先随机选择一个特征维度,在这个特征的最大值和最小值之间随机选择一个值,按照跟特征值的大小关系将数据进行左右切分。然后,在左右两组数据中,我们重复上述步骤,再随机的按某个特征维度的取值把数据进行细分,直到无法细分,即:只剩下一个数据点,或者剩下的数据全部相同。跟先前的例子类似,直观上,点B'跟其他数据点比较疏离,可能只需要很少的几次操作就可以将它细分出来;点A'需要的切分次数可能会更多一些。
上面其实就是 Isolation Forest(IF)的核心概念。而具体的IF采用二叉树去对数据进行切分,数据点在二叉树中所处的深度反应了该条数据的“疏离”程度。整个算法大致可以分为两步:
训练:抽取多个样本,构建多棵二叉树(Isolation Tree,即 iTree);
预测:综合多棵二叉树的结果,计算每个数据点的异常分值。
训练:构建一棵 iTree 时,先从全量数据中抽取一批样本,然后随机选择一个特征作为起始节点,并在该特征的最大值和最小值之间随机选择一个值,将样本中小于该取值的数据划到左分支,大于等于该取值的划到右分支。然后,在左右两个分支数据中,重复上述步骤,直到满足如下条件:
数据不可再分,即:只包含一条数据,或者全部数据相同。
二叉树达到限定的最大深度。
预测:根据估算它在每棵 iTree 中的路径长度(也可以叫深度),计算数据 x 的异常分值,通常这个异常分值越小越异常。
Isolation Forest 算法主要有两个参数:一个是二叉树的个数;另一个是训练单棵 iTree 时候抽取样本的数目。实验表明,当设定为 100 棵树,抽样样本数为 256 条时候,IF 在大多数情况下就已经可以取得不错的效果。这也体现了算法的简单、高效。
具体python实现如下:
from sklearn.ensemble import IsolationForest
IsolationForest(*, n_estimators=100, max_samples='auto', contamination='auto', max_features=1.0, bootstrap=False, n_jobs=None, random_state=None, verbose=0, warm_start=False)
参数介绍如下:
1、n_estimators :int,optional(默认值= 100)
模型拟合中的二叉树数量。
2、max_samples :int或float,optional(default =“auto”)
每棵二叉树训练需要的样本量。
如果是int,则绘制max_samples样本。
如果是float,则绘制max_samples * X.shape [0]样本。
如果是“auto”,则max_samples = min(256,n_samples)。
如果max_samples大于提供的样本数,则所有样本将用于所有树(无采样)。
3、contamination :float(0.,0.5),可选(默认值= 0.1)
数据集中异常值的比例。在拟合时用于定义决策函数的阈值。如果是“自动”,则确定决策函数阈值,如原始论文中所示。
4、max_features :int或float,可选(默认值= 1.0)
训练每棵二叉树的特征数。
如果是int,则绘制max_features特征。
如果是float,则绘制max_features * X.shape [1]特征。
5、bootstrap :boolean,optional(default = False)
如果为True,则单个树适合于通过替换采样的训练数据的随机子集。
如果为假,则执行未更换的采样。
6、n_jobs :int或None,可选(默认=无)
适合和预测并行运行的作业数。
7. random_state :int,RandomState实例或None,可选(默认=无)
如果是int,则random_state是随机数生成器使用的种子;
如果是RandomState实例,则random_state是随机数生成器;
如果没有,随机数生成器所使用的RandomState实例np.random。
下图是我用孤立森林拟合数据识别异常值的可视化图,左边表示原始数据的呈现,右边表示孤立森林异常识别(黑色表示异常,黄色表示正常);从左右对比可看出,离散点都能识别出,但是也有一些偏离中心的正常点也被识别为异常数据。
以上就是我要介绍的异常数据识别的方法,上述方法可以覆盖日常中80%的异常数据识别;所以要熟悉掌握这些方法哦,具体细节可加微信继续沟通探讨。
-END-
本文为作者独立观点,不代表鸟哥笔记立场,未经允许不得转载。
《鸟哥笔记版权及免责申明》 如对文章、图片、字体等版权有疑问,请点击 反馈举报
Powered by QINGMOB PTE. LTD. © 2010-2022 上海青墨信息科技有限公司 沪ICP备2021034055号-6
我们致力于提供一个高质量内容的交流平台。为落实国家互联网信息办公室“依法管网、依法办网、依法上网”的要求,为完善跟帖评论自律管理,为了保护用户创造的内容、维护开放、真实、专业的平台氛围,我们团队将依据本公约中的条款对注册用户和发布在本平台的内容进行管理。平台鼓励用户创作、发布优质内容,同时也将采取必要措施管理违法、侵权或有其他不良影响的网络信息。
一、根据《网络信息内容生态治理规定》《中华人民共和国未成年人保护法》等法律法规,对以下违法、不良信息或存在危害的行为进行处理。
1. 违反法律法规的信息,主要表现为:
1)反对宪法所确定的基本原则;
2)危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一,损害国家荣誉和利益;
3)侮辱、滥用英烈形象,歪曲、丑化、亵渎、否定英雄烈士事迹和精神,以侮辱、诽谤或者其他方式侵害英雄烈士的姓名、肖像、名誉、荣誉;
4)宣扬恐怖主义、极端主义或者煽动实施恐怖活动、极端主义活动;
5)煽动民族仇恨、民族歧视,破坏民族团结;
6)破坏国家宗教政策,宣扬邪教和封建迷信;
7)散布谣言,扰乱社会秩序,破坏社会稳定;
8)宣扬淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪;
9)煽动非法集会、结社、游行、示威、聚众扰乱社会秩序;
10)侮辱或者诽谤他人,侵害他人名誉、隐私和其他合法权益;
11)通过网络以文字、图片、音视频等形式,对未成年人实施侮辱、诽谤、威胁或者恶意损害未成年人形象进行网络欺凌的;
12)危害未成年人身心健康的;
13)含有法律、行政法规禁止的其他内容;
2. 不友善:不尊重用户及其所贡献内容的信息或行为。主要表现为:
1)轻蔑:贬低、轻视他人及其劳动成果;
2)诽谤:捏造、散布虚假事实,损害他人名誉;
3)嘲讽:以比喻、夸张、侮辱性的手法对他人或其行为进行揭露或描述,以此来激怒他人;
4)挑衅:以不友好的方式激怒他人,意图使对方对自己的言论作出回应,蓄意制造事端;
5)羞辱:贬低他人的能力、行为、生理或身份特征,让对方难堪;
6)谩骂:以不文明的语言对他人进行负面评价;
7)歧视:煽动人群歧视、地域歧视等,针对他人的民族、种族、宗教、性取向、性别、年龄、地域、生理特征等身份或者归类的攻击;
8)威胁:许诺以不良的后果来迫使他人服从自己的意志;
3. 发布垃圾广告信息:以推广曝光为目的,发布影响用户体验、扰乱本网站秩序的内容,或进行相关行为。主要表现为:
1)多次发布包含售卖产品、提供服务、宣传推广内容的垃圾广告。包括但不限于以下几种形式:
2)单个帐号多次发布包含垃圾广告的内容;
3)多个广告帐号互相配合发布、传播包含垃圾广告的内容;
4)多次发布包含欺骗性外链的内容,如未注明的淘宝客链接、跳转网站等,诱骗用户点击链接
5)发布大量包含推广链接、产品、品牌等内容获取搜索引擎中的不正当曝光;
6)购买或出售帐号之间虚假地互动,发布干扰网站秩序的推广内容及相关交易。
7)发布包含欺骗性的恶意营销内容,如通过伪造经历、冒充他人等方式进行恶意营销;
8)使用特殊符号、图片等方式规避垃圾广告内容审核的广告内容。
4. 色情低俗信息,主要表现为:
1)包含自己或他人性经验的细节描述或露骨的感受描述;
2)涉及色情段子、两性笑话的低俗内容;
3)配图、头图中包含庸俗或挑逗性图片的内容;
4)带有性暗示、性挑逗等易使人产生性联想;
5)展现血腥、惊悚、残忍等致人身心不适;
6)炒作绯闻、丑闻、劣迹等;
7)宣扬低俗、庸俗、媚俗内容。
5. 不实信息,主要表现为:
1)可能存在事实性错误或者造谣等内容;
2)存在事实夸大、伪造虚假经历等误导他人的内容;
3)伪造身份、冒充他人,通过头像、用户名等个人信息暗示自己具有特定身份,或与特定机构或个人存在关联。
6. 传播封建迷信,主要表现为:
1)找人算命、测字、占卜、解梦、化解厄运、使用迷信方式治病;
2)求推荐算命看相大师;
3)针对具体风水等问题进行求助或咨询;
4)问自己或他人的八字、六爻、星盘、手相、面相、五行缺失,包括通过占卜方法问婚姻、前程、运势,东西宠物丢了能不能找回、取名改名等;
7. 文章标题党,主要表现为:
1)以各种夸张、猎奇、不合常理的表现手法等行为来诱导用户;
2)内容与标题之间存在严重不实或者原意扭曲;
3)使用夸张标题,内容与标题严重不符的。
8.「饭圈」乱象行为,主要表现为:
1)诱导未成年人应援集资、高额消费、投票打榜
2)粉丝互撕谩骂、拉踩引战、造谣攻击、人肉搜索、侵犯隐私
3)鼓动「饭圈」粉丝攀比炫富、奢靡享乐等行为
4)以号召粉丝、雇用网络水军、「养号」形式刷量控评等行为
5)通过「蹭热点」、制造话题等形式干扰舆论,影响传播秩序
9. 其他危害行为或内容,主要表现为:
1)可能引发未成年人模仿不安全行为和违反社会公德行为、诱导未成年人不良嗜好影响未成年人身心健康的;
2)不当评述自然灾害、重大事故等灾难的;
3)美化、粉饰侵略战争行为的;
4)法律、行政法规禁止,或可能对网络生态造成不良影响的其他内容。
二、违规处罚
本网站通过主动发现和接受用户举报两种方式收集违规行为信息。所有有意的降低内容质量、伤害平台氛围及欺凌未成年人或危害未成年人身心健康的行为都是不能容忍的。
当一个用户发布违规内容时,本网站将依据相关用户违规情节严重程度,对帐号进行禁言 1 天、7 天、15 天直至永久禁言或封停账号的处罚。当涉及欺凌未成年人、危害未成年人身心健康、通过作弊手段注册、使用帐号,或者滥用多个帐号发布违规内容时,本网站将加重处罚。
三、申诉
随着平台管理经验的不断丰富,本网站出于维护本网站氛围和秩序的目的,将不断完善本公约。
如果本网站用户对本网站基于本公约规定做出的处理有异议,可以通过「建议反馈」功能向本网站进行反馈。
(规则的最终解释权归属本网站所有)