[返回科技频道首页]·[所有跟帖]·[ 回复本帖 ] ·[热门原创] ·[繁體閱讀]·[版主管理]
数据分析——异常数据识别
送交者: 婉君[☆★★★不服⭐来赌★★★☆] 于 2021-01-19 3:01 已读 1950 次  

婉君的个人频道

原标题:数据分析——异常数据识别


编辑导语:在数据分析中,我们可能经常会遇到异常数据识别的情况,为了避免一些数据异常,我们会用到一些识别方法,在不同场景下运用的方法也有所不同;本文作者分享了关于数据分析中异常数据识别的一些方法,我们一起来看一下。 6park.com

编辑导语:在数据分析中,我们可能经常会遇到异常数据识别的情况,为了避免一些数据异常,我们会用到一些识别方法,在不同场景下运用的方法也有所不同;本文作者分享了关于数据分析中异常数据识别的一些方法,我们一起来看一下。 6park.com


异常数据识别在数据分析和数据挖掘中,是经常会遇到的问题;本文会介绍不同场景下,异常数据识别的方法有哪些,以及他们之间的区别。 6park.com

一、使用场景 6park.com

当前异常数据识别的使用场景主要有以下2方面: 6park.com

对变量做描述性统计,然后再基于业务考虑哪些数据是不合理的。 6park.com

常用的统计量是最大值和最小值,判断这个变量是否超过合理的范围;例如:用户的年龄为150岁,这就是异常的。 6park.com

2. 三倍标准差 6park.com

定义:如果单变量数据服从正态分布,异常值被定义为与平均值偏差超过3倍标准差的值。 6park.com

原因:是因为在正态分布的假设下,偏离均值3倍标准差出现的概率小于0.003,是一个小概率事件。 6park.com

在实际分析中,我们也不一定要拘泥于3倍标准差,可以根据实际严格程度定义,如偏离均值的4倍标准差。 6park.com

3. BOX-COX转化+3倍标准差 6park.com

如果原始数据的分布是有偏的,不满足正态分布时,可通过BOX-COX转化,在一定程度上修正分布的偏态;转换无需先验信息,但需要搜寻最优的参数λ。 6park.com

Box-Cox变换的一般形式为: 6park.com


Box-Cox的python实现如下,可直接通过函数boxcox找到最优的lambda和转化后的值: 6park.com


4. 箱线图 6park.com

箱形图(Box plot),又称为盒须图、盒式图、盒状图或箱线图,是一种用作显示一组数据分散情况的统计图。 6park.com

它能显示出一组数据的最大值、最小值、中位数及上下四分位数; 6park.com

箱线图提供了一种数据识别的标准:异常值通常被定义为小于下边缘或者大于上边缘的数据为异常值。 6park.com

如下图所示: 6park.com


箱线图识别异常数据的优势: 6park.com

日常工作中还有一种场景,是需要对时间序列数据进行监控,如:订单量、广告访问量、广告点击量;我们需要从时间维度识别出是否异常刷单、刷广告点击的问题;像广告投放场景下,如果发现渠道刷量,会及时停止广告投放,减少损失。 6park.com

对于时间序列数据异常识别,根据数据不同的特点,识别方法不同。 6park.com

1. 设置恒定阈值 6park.com

如果时间序列呈现平稳分布状态,即时间序列数据围绕中心值小范围内波动;我们可以定义上下界的恒定阈值,如果超过上下阈值则定义为异常。 6park.com

2. 设定动态阈值-移动平均法 6park.com

所谓动态阈值是指,当前时间的异常阈值是由过去n段时间的时序数据计算决定的;通常对于无周期,比较平稳的时间序列,设定动态阈值的方法是移动平均法。 6park.com

所谓移动平均法:就是用过去n个时间点的时序数据的平均值作为下一个时间点的时序数据的预测。 6park.com


异常数据识别即是:确定固定移动窗口n,以过去n个窗口的指标平均值作为下一个窗口的预测值;以过去n个窗口的指标的平均值加减3倍方差作为监控的上下界。 6park.com

使用范围:数据无周期性,数据比较平稳。 6park.com

3. STL数据拆解法 6park.com

如果时间序列数据是周期性数据,可使用STL算法将时序数据拆解成趋势项、周期项和余项,即每个时刻的时序数据等于当前时序趋势项、周期项和余项的和(或者乘)。 6park.com

一般使用STL需要确定2个点: 6park.com

加法方式:原始数据 = 平均季节数据 + 趋势数据 + 余项这种方式,随着时间的推移季节数据不会有太大的变化,在以七天为一大周期的业务数据更适合这样的拆分方式。 6park.com


乘法方式:原始数据 = 平均季节数据 * 趋势数据 * 余项。 6park.com

这种方式,直观感受是随着时间的推移季节数据波动会非常明显。 6park.com


至于如何要判断某事的时序数据是否异常,是根据STL分解后的余项来判断;一般情况下,余项部分的时序数据是平稳分布状态,我们可对余项设置恒定阈值或者动态阈值,如果某个时间节点的分解余项超过设定阈值,则是异常数据。 6park.com

python可以用seasonal_decompose可以将时间序列数据拆解成三部分,具体函数代码如下: 6park.com

import statsmodels.api as sm 6park.com

from statsmodels.tsa.seasonal import seasonal_decompose 6park.com

# Multiplicative Decomposition 6park.com

result_mul = seasonal_decompose(data1, model=’multiplicative’, extrapolate_trend=’freq’) 6park.com

Actual_Values = result_mul.seasonal * result_mul.trend * result_mul.resid 6park.com

# Additive Decomposition 6park.com

result_add = seasonal_decompose(data1, model=’additive’, extrapolate_trend=’freq’) 6park.com

Actual_Values = result_mul.seasonal + result_mul.trend + result_mul.resid 6park.com

import statsmodels.api as sm 6park.com

from statsmodels.tsa.seasonal import seasonal_decompose 6park.com

# Multiplicative Decomposition 6park.com

result_mul = seasonal_decompose(data1, model=’multiplicative’, extrapolate_trend=’freq’) 6park.com

Actual_Values = result_mul.seasonal * result_mul.trend * result_mul.resid 6park.com

# Additive Decomposition 6park.com

result_add = seasonal_decompose(data1, model=’additive’, extrapolate_trend=’freq’) 6park.com

Actual_Values = result_mul.seasonal + result_mul.trend + result_mul.resid 6park.com

所谓多变量数据异常识别是指:不只从一个特征去判读数据异常,而是在多个特征下来判断其是否异常。多变量异常数据识别的方法很多,比如聚类模型、孤立森林模型、one-class svm模型等。下面主要介绍简单高效,更容易使用的孤立森林模型。 6park.com

1. 孤立森林 6park.com

孤立森林iForest (Isolation Forest) 是一个可扩散到多变量的快速异常检测方法;iForest 适用于连续数据的异常检测,将异常定义为“容易被孤立的离群点——可以理解为分布稀疏且离密度高的群体较远的点;用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而可以认为落在这些区域里的数据是异常的。 6park.com

iForest属于Non-parametric和unsupervised的方法,即不用定义数学模型也不需要有标记的训练。 6park.com

孤立森林iForest (Isolation Forest) 是一个可扩散到多变量的快速异常检测方法;iForest 适用于连续数据的异常检测,将异常定义为“容易被孤立的离群点——可以理解为分布稀疏且离密度高的群体较远的点;用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而可以认为落在这些区域里的数据是异常的。 6park.com

iForest属于Non-parametric和unsupervised的方法,即不用定义数学模型也不需要有标记的训练。 6park.com

算法逻辑介绍: 6park.com

假设现在有一组一维数据(如下图所示),我们要对这组数据进行随机切分,希望可以把点 A 和点 B 单独切分出来。 6park.com

具体的,我们先在最大值和最小值之间随机选择一个值 x,然后按照 =x 可以把数据分成左右两组;然后,在这两组数据中分别重复这个步骤,直到数据不可再分。 6park.com

显然,点 B 跟其他数据比较疏离,可能用很少的次数就可以把它切分出来;点 A 跟其他数据点聚在一起,可能需要更多的次数才能把它切分出来。 6park.com


我们把数据从一维扩展到两维,同样的,我们沿着两个坐标轴进行随机切分,尝试把下图中的点A’和点B’分别切分出来;我们先随机选择一个特征维度,在这个特征的最大值和最小值之间随机选择一个值,按照跟特征值的大小关系将数据进行左右切分。 6park.com

然后,在左右两组数据中,我们重复上述步骤,再随机的按某个特征维度的取值把数据进行细分,直到无法细分,即:只剩下一个数据点,或者剩下的数据全部相同。 6park.com

跟先前的例子类似,直观上,点B’跟其他数据点比较疏离,可能只需要很少的几次操作就可以将它细分出来;点A’需要的切分次数可能会更多一些。 6park.com


上面其实就是 Isolation Forest(IF)的核心概念。而具体的IF采用二叉树去对数据进行切分,数据点在二叉树中所处的深度反应了该条数据的“疏离”程度。 6park.com

整个算法大致可以分为两步: 6park.com

训练:构建一棵 iTree 时,先从全量数据中抽取一批样本,然后随机选择一个特征作为起始节点,并在该特征的最大值和最小值之间随机选择一个值;将样本中小于该取值的数据划到左分支,大于等于该取值的划到右分支。 6park.com

然后,在左右两个分支数据中,重复上述步骤,直到满足如下条件: 6park.com

预测:根据估算它在每棵 iTree 中的路径长度(也可以叫深度),计算数据 x 的异常分值,通常这个异常分值越小越异常。 6park.com

Isolation Forest 算法主要有两个参数:一个是二叉树的个数;另一个是训练单棵 iTree 时候抽取样本的数目。 6park.com

实验表明,当设定为 100 棵树,抽样样本数为 256 条时候,IF 在大多数情况下就已经可以取得不错的效果,这也体现了算法的简单、高效。 6park.com

具体python实现如下: 6park.com

from sklearn.ensemble import IsolationForest 6park.com

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) 6park.com

from sklearn.ensemble import IsolationForest 6park.com

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) 6park.com

下图是我用孤立森林拟合数据识别异常值的可视化图,左边表示原始数据的呈现,右边表示孤立森林异常识别(黑色表示异常,黄色表示正常);从左右对比可看出,离散点都能识别出,但是也有一些偏离中心的正常点也被识别为异常数据。 6park.com


以上就是我要介绍的异常数据识别的方法,上述方法可以覆盖日常中80%的异常数据识别,所以要熟悉掌握这些方法哦。 6park.com

公众号:须臾即永恒; 6park.com

本文由 @须臾即永恒 原创发布于人人都是产品经理。未经许可,禁止转载 6park.com

题图来自Unsplash,基于CC0协议

喜欢婉君朋友的这个贴子的话, 请点这里投票,“赞”助支持!
[举报反馈]·[ 婉君的个人频道 ]·[-->>参与评论回复]·[用户前期主贴]·[手机扫描浏览分享]·[返回科技频道首页]
帖子内容是网友自行贴上分享,如果您认为其中内容违规或者侵犯了您的权益,请与我们联系,我们核实后会第一时间删除。

所有跟帖:        ( 主贴楼主有权删除不文明回复,拉黑不受欢迎的用户 )


    用户名:密码:[--注册ID--]

    标 题:

    粗体 斜体 下划线 居中 插入图片插入图片 插入Flash插入Flash动画


         图片上传  Youtube代码器  预览辅助

    打开微信,扫一扫[Scan QR Code]
    进入内容页点击屏幕右上分享按钮

    楼主本栏目热帖推荐:

    >>>>查看更多楼主社区动态...






    [ 留园条例 ] [ 广告服务 ] [ 联系我们 ] [ 个人帐户 ] [ 版主申请 ] [ Contact us ]