精华内容
下载资源
问答
  • 2020-08-19 09:14:34

    最近开始学习数据科学,从数据清洗中的异常数据监测入手,读了几篇文献,现将一些理解和认识总结一下,当作笔记。其中方法的介绍可能不太详细,理解也可能不太准确,只为路过的各位提供一个参考。

    异常数据检测的意义

    数据存在重复、因传感器等测量仪器问题引起的数据错误、缺失等情况,若将这种数据也用于数据分析和预测,分析或预测的结果会出现一定偏差。
    另一方面,当设备出现异常时,利用异常数据检测可能会检测出设备的异常,做到早发现、早处理。

    对时序数据及其处理的理解与认识

    1.时间序列数据中,“时间连续性”(temporal continuity)十分重要;

    2.所有分析尽可能基于时间合理使用小窗口(此窗口若范围过大,则可能对异常值不敏感;范围过小则导致运算量骤增);

    3.对不同类型的数据需要有针对性地提出分析检测的方法;

    4.“时间”这一时序数据虽具备特性既可被利用,也带来了新的挑战:针对不同数据类型和应用场景需要不同的模型和方法,没有现成的模型可供使用;

    5.数据量庞大,会实时更新等。

    时序数据异常检测方法

    一.较为简单易理解的方法:

    1.恒定阈值检测:人工设置最大值和最小值,超出设置区间则标记为异常——灵活性低、不适用于非平稳数据。

    2.分位数异常检测:基于统计的方法,将数据排序,等分为四部分,取上四分位,下四分位计算四分位距,由这三者确定正常数据的上界和下界。
    3.K-Sigma异常检测:数据集满足正态分布,落在μ±3σ间(3σ原则)。

    4.局部异常检测:滑动窗口机制,基于滑动窗口的中值滤波——hampel滤波,设置样本范围,中值、样本差,分段估计异常值的上下界,同时可结合分位数异常检测和K-Sigma异常检测。此方法灵活,但仍不适用于有突变特性的数据。

    5.基于机器学习的数据异常检测特点:数据分布不均衡,异常数据占比小,正常数据占比大;产生的问题:少数集可能被忽视,模型更倾向于多数集,与我们的想法相违背。
    解决方法:
    下采样:从多数类样本中随机选取一些剔除掉。此法缺点是被剔除的样本可能包含着一些重要信息,造成信息丢失,使学习出的模型效果不好。
    上采样:由少量异常数据再生成与正常数据数量相当的异常数据。缺点是数据集中会反复出现某些样本,导致训练出的模型过拟合。

    二.论文Outlier Detection for Temporal Data: A Survey(Manish Gupta, Jing Gao)中提到的部分方法:

    时序数据库中的异常检测:

    思路有二:可直接计算;也可利用小窗口,计算重叠固定大小窗口的分数,然后将其聚合。

    1.直接计算:利用数据库中的时间序列数据先训练一个模型,之后对每个序列相对于该模型的离群分数进行计算,超过某一值则认为其为异常数据,此过程即可为有监督,也可无监督。

    (1)无监督的判别方法:
    定义两个序列间的相似函数,根据这个函数对数据库中的序列进行聚类处理分为多个类,然后计算序列与最近类的质心距离相似度衡量:基于简单匹配计数的序列相似度(计算效率高),最长公共序列的归一化长度(动态规划,适应含有噪声的片段,但代价高)。

    (2)无监督的参数化方法:
    不指定异常数据,采用在数据集上建立一个总结模型(summary model)的方法,若测试序列在此模型中生成概率很低,则认为其为异常数据。

    2.基于窗口的异常数据检测:将一个测试序列分为有重叠的小序列,即窗口,后根据每个窗口的异常分数计算整个序列的异常分数。这样可以更精确地定位异常值出现的位置。

    (1)正常模式数据库方法:
    把序列划分为固定长度的窗口,按频率存储在数据库中,取来一个测试序列,在其中获取与固定窗口长度相同的子序列,根据数据库中序列出现频率计算异常分数。另外,除固定长度窗口数据库外,还可利用前向方法构建数据库,即将序列长为1、2、3…k的子序列截取并存在数据库中供测试序列比对。

    (2)负模式和混合模式的数据库方法:
    与上一种方法建立的数据库相反,即所有不在上一种方法建立的数据库中的某固定长度的子序列被认为是负子序列或检测器。这个检测器可以随机生成,也可以通过某领域知识生成。若测试序列中存在负子序列(检测器),则认为其是异常序列。

    给定时间序列的异常检测:

    (1)预测模型(用于检测异常元素):通过之前的数据预测之后即将出现的数据,然后计算预测结果与实际结果的偏差,偏差超过一定值,则认为其是异常数据。

    (2)剖面相似性(用于检测异常元素):确定一个正常的时序数据剖面,然后将一个新的时序数据点与此剖面比较,判断是否一致。

    (3)根据异常值的特点(用于检测异常元素):若从时间序列中移除一个点,得到一个更简洁的序列,则此点为异常点。

    (4)检测异常序列:考虑时间序列中固定长度的子序列,计算两个子序列间的距离,通常为欧氏距离,超过某一特定值则认为其为异常序列。 针对维度问题,对于高维数据可进行降维或多个低维空间检测再合并的处理。

    更多相关内容
  • 针对医疗财务系统中数据规模庞大,而传统的数据检测手段难以发现其中细微异常数据的问题,设计了一套智能化的异常数据检测系统。该系统通过对异常数据的模式分析,并基于差异分析与全局分析的融合检测原理,实现了在...
  • 针对当前工业异常数据检测技术未充分考虑数据的时序特征以及训练样本中可能含有异常样本的问题,提出一种检测异常数据的方法:基于时序特征将遥测量与遥信量分为离散量与连续变化量,并分别通过改进后的K-均值算法与...
  • 异常数据检测

    2012-06-14 22:04:46
    异常 数据 检测 提出了一种新的异常数据检测方法 能有效的检测
  • 传统电网输电量异常数据检测方法存在检测准确率较低的缺陷,为了解决上述问题,提出基于并行分类算法的电网输电量异常数据检测方法。以现有电网输电量异常数据为依据,基于信息熵提取输电量异常数据特征,采用无线...
  • 结合小波分析和不确定聚类方法的优点,提出一种基时间序列不确定数据流的异常数据检测方法,该方法主要考虑数据流中元组的不确定性,同时平衡检测的计算代价与检测精度。仿真实验证明,该检测方法能够良好地适应数据...
  • 异常数据 检测

    2012-06-14 22:02:16
    异常数据检测 能有效地检测 书中介绍了常用的方法 并提出了改进措施
  • 异常检测常用的一些数据
  • Python数据分析与机器学习-交易数据异常检测; Python数据分析与机器学习-交易数据异常检测
  • 时间序列异常检测 使用正态分布检测时间序列数据中的异常值的异常检测概念的证明。 这依赖于具有正态分布的数据,并使用概率来估计离群值。 用于统计分析的算法为和。
  • 数据
  • K-means算法是一种采用距离作为相似性评价指标的聚类算法,其快速简洁的特点...实验过程中,针对异常检测数据含有冗余特征,对样本数据做了冗余特征过滤,实验结果表明改进之后的方法较传统的K-means算法有更好的检测效果。
  • KDD CPU99 数据集,已经经过处理,适合于二分类问题比如说异常检测。 已经分好了训练集与测试集,分别是两个文件。
  • 安全领域的数据分析与异常检测的特点与要求 安全领域的数据处理流程 基于ELK的日志收集及分析方案 基于ELK的日志收集及分析方案 基于Flink的数据分析与异常检测基本方案 FLINK的使用场景
  • 本文来自于csdn,本文介绍了大规模时序数据自动异常检测的通用和可扩展框架知识。本文介绍了大规模时序数据自动异常检测的通用和可扩展框架。能够在早期检测到系统异常,无论在维护用户数据一致性方面,还是在保护...
  • 时序数据异常检测

    2019-02-15 10:33:47
    outlier detection for temporal data 的综述,时序数据异常检测
  • 数据挖掘导论(完整版)涵盖了五个主题:数据,分类,关联分析,聚类和异常检测
  • 但是当前的数据模型异常检测方法都是针对数据模型本身的特点而未考虑流程模型.同样,流程模型的验证方法也缺乏对数据模型的考虑.文中提出并分析了面向业务流程的数据模型的异常问题,并给出了其3种基本类型.为了...
  • 今年五一赛C题的成品,比赛刚结束,代码程序在附录,可以参考学习,需要历年的五一赛资料可以找我
  • 2021年五一赛C一等奖论文,附录代码齐全,可以参考学习
  • python数据分析入门,异常检测及预处理
  • 数据异常异常检测方法

    千次阅读 2018-09-27 14:45:04
    1.在线流数据异常检测(iforest隔离森林算法) 该方法的主要思想是,通过随机选定样本属性及其值...该方法是基于异常数据“少且不同”的特征,来采用随机隔离的思想设计异常检查。 该方法的主要优点是,在构建初始...

    1.在线流数据异常检测(iforest隔离森林算法)

    该方法的主要思想是,通过随机选定样本属性及其值将样本空间进行随机划分,分割的过程可以看成类似于随机森林中树建立的过程,对于新的样本,基于建立的隔离树求其分割深度,深度值越小,表明越容易被隔离,也就意味着异常的概率越大;反之则为正常样本。该方法是基于异常数据“少且不同”的特征,来采用随机隔离的思想设计异常检查。

    该方法的主要优点是,在构建初始模型时不需要任何实际的数据,从而能快速构建初始探测模型,它符合数据流的分布特性且在流数据异常检测问题上达到一定的精度。此方法不需要距离或者密度的计算且具有线性的时间复杂性,并且该方法采用集成学习策略,因此不需要花很多代价训练一个高精度模型。

     

    1.1基于隔离的异常检测

    初始情况下,根节点表示整个样本空间,当随机选择某一个属性并随机选取该属性的某一取值,基于该值将样本空间分割成两个子集,其中一个子集包含样本集中所有对应属性值小于划分属性值的样本,另外一个子集为样本集中剩余的样本组成的子集,分割所得的这两

    个子集分别构成隔离树的左右两个子节点。上述过程递归进行下去,直至被分割节点仅包含指定个数的样本或者达到最大的分割次数。由于随机特性,仅仅建立这样一棵树并不能进行良好的异常判断,可以引入集成学习的方法,建立多棵树而构成集成隔离树。在异常检测时,对新的样本,计算其平均分割深度,基于深度值的大小判断其为异常可能性的高低。通常深度值越小,表示越容易被分离,也就意味着其为异常的概率越大。反之则为正常样本。

     

    1.1.1 隔离树的构造

    给定一个包含n个d维数据的样本集X={x1,x2,...xn},即xi=( , .... ),xi X,构建二叉隔离树只需要递归的随机选择分割属性q和对应的分割值P,将样本空间X进行划分即可。树构造的停止与决策树一样,达到一定的停止条件则停止,包括树的深度达到一定的预设的最大值;节点中只有一个样本;节点中所有的样本相同。

     

    1.2集成学习理论

    集成学习理论是一种计算智能的方法,原理类似于专家会诊,理论研究和实验都表明综合多个检测器的检测结果可以增加诊断的准确性,提高学习器的泛化能力,目前比较流行的集成学习器包括Bagging,Boosting。最后个体学习器结论的合成用的最多的是多数投票法。

     

    1.3算法框架

    (1)初始探测器构建

    该过程采用传统IForest算法,基于历史数据构建隔离森林获得初始的异常检测器。

    技术分享

    其中,S(x,M)表示样本x的异常分,M为样本集规模,E(h(x))是森林的平均隔离深度,表示期望的隔离深度,该值可以通过计算每棵树的隔离深度,再计算整个集成的平均隔离深度来获得。 是样本x的针对森林中第i棵树的隔离深度,c ( M ) 是有M 个样本构成的数据集的隔离树深度h(x) 的期望值。

    (2)在线异常检测

    将异常检测器应用于流数据,即对每个到达的数据,判断其异常状况,并基于Possion(1)分布,选择该样本是否作为更新样本添加到缓冲区。当新数据样本到达时,对每个学习器的个体进行更新学习。

    (3)计算异常率

    根据预定的应用规模计算异常率。如果超过了预定义的阈值或样本缓冲区已满,则对检测器进行更新。

     

      2.基于统计学方法

    基于距离的方法包括箱型图算法(BPrule),这个算法比较简单,比较适用于单维异常查找的情况,异常值被定义为大于QU+1.5IQR或小于QL?1.5IQR的值。QU是上四分位数,表示全部观察值中有1/4的数据比他大,QL是下四分位数,表示全部数据中有1/4的数据比他小。IQR是四分位间距,是QU和QL的差,其间包含了观察值的一半。

     

      3.基于近邻性的异常检测方法

    基于距离的方法包括(Index-Based的算法、Nested-Loop算法、Cell-Based算法)。基于密度的算法包括(LOF算法、LSC算法),可检测出局部异常点。基于近邻性的异常检测方法仅适用于维度较小的,且数据规模不会很大的数据集。

     

      4.基于模型的异常检测算法

    基于模型的异常检测算法,我所了解的包括基于高斯分布的异常检测(主要适用于符合高斯分布的数据),具体可参见博客http://blog.csdn.net/dingchenxixi/article/details/51689149,python中可以关注Sklearn中的EllipticEnvelope。另外其他的一些分类模型也可以,通过一些正确的样本构建分类模型(例如one-class SVM),对于新数据不符合该分类器特征的数据认为是异常点。

     

      5.基于聚类的方法

    关于聚类的方法,我之前的博客中有提及。另外聚类方法中还有Constaint-based clustering、Stream-based clustering (standardford)值得在欺诈中研究。

    展开全文
  • 在大型数据集或连续流数据中,当此类数据不遵循某些规则集或每隔一个数据点遵循的模式时,就会发生异常。 信息分析的一个关键目标是识别异常行为的模式。 在系统管理、传感器网络和安全等各种应用中都需要这种异常...
  • 要求用MATLAB写一个可以实现异常数据检测的程序,急求大神回复。
  • 机器学习数据分析之异常检测

    千次阅读 2021-07-20 11:34:14
    异常值检验可以分为单变量异常值检验和多变量异常值检验,对于时间序列数据而言还有趋势预测的时间序列异常值检验。 1.基于统计学的单变量异常值检验 可以先采用统计学方法查看数据的描述性统计(均值、标准差、...


    在检查异常值之前,可以将缺失值填充好。
    异常值检验可以分为单变量异常值检验和多变量异常值检验,对于时间序列数据而言还有趋势预测的时间序列异常值检验。

    1.基于统计学的单变量异常值检验

    可以先采用统计学方法查看数据的描述性统计(均值、标准差、最小值、最大值等信息)

    """假设数据为dataframe"""
    # 查看dataframe的描述性统计
    df.describe()
    

    1.1 3 σ \sigma σ准则

    这个原则有个条件:数据需要服从正态分布。在 3 σ 3\sigma 3σ原则下,异常值如超过3倍标准差,那么可以将其视为异常值。正负 3 σ 3\sigma 3σ的概率是99.7%,那么距离平均值 3 σ 3\sigma 3σ之外的值出现的概率为P(|x-u| > 3 σ 3\sigma 3σ) <= 0.003,属于极个别的小概率事件。如果数据不服从正态分布,也可以用远离平均值的多少倍标准差来描述。
    数值分布在(μ-σ,μ+σ)中的概率为0.6827
    数值分布在(μ-2σ,μ+2σ)中的概率为0.9545
    数值分布在(μ-3σ,μ+3σ)中的概率为0.9973

    import numpy as np
    import pandas as pd
    from scipy.stats import kstest
    
    # 正态分布检验
    def KsNormDetect(df):
        # 计算均值
        u = df['value'].mean()
        # 计算标准差
        std = df['value'].std()
        # 计算P值
        res=kstest(df, 'norm', (u, std))[1]
        # 判断p值是否服从正态分布,p<=0.05 则服从正态分布,否则不服从。
        if res<=0.05:
            print('该列数据服从正态分布------------')
            print('均值为:%.3f,标准差为:%.3f' % (u, std))
            print('------------------------------')
            return 1
        else:
            return 0
    
    # 异常值检测并删除
    def OutlierDetection(df, ks_res):
        # 计算均值
        u = df['value'].mean()
        # 计算标准差
        std = df['value'].std()
        if ks_res==1:
            # 定义3σ法则识别异常值
            # 识别异常值
            error = df[np.abs(df['value'] - u) > 3 * std]
            # 剔除异常值,保留正常的数据
            data_c = df[np.abs(df['value'] - u) <= 3 * std]
            # 输出异常数据
            print(error)
            return error
    
        else:
            print('请先检测数据是否服从正态分布-----------')
            return None
    
    df = pd.DataFrame([111, 333, 12, 290, 265, 152, 222, 1213, 242467, 114, 231, 122, 33, 2, 1, 5, 22, 44], columns=["value"])
    ks_res = KsNormDetect(df)
    result = OutlierDetection(df, ks_res)
    print(result)
    

    1.2 箱型图

    这种方法是利用箱型图的四分位距(IQR)对异常值进行检测,也叫Tukey‘s test。
    四分位距(IQR)就是上四分位与下四分位的差值。而我们通过IQR的1.5倍为标准,规定:超过(上四分位+1.5倍IQR距离,或者下四分位-1.5倍IQR距离)的点为异常值。

    import numpy as np
    import pandas as pd
    
    # 箱型图实现
    def OutlierDetection(df):
        # 计算下四分位数和上四分位
        Q1 = df.quantile(q=0.25)
        Q3 = df.quantile(q=0.75)
    
        # 基于1.5倍的四分位差计算上下须对应的值
        low_whisker = Q1 - 1.5 * (Q3 - Q1)
        up_whisker = Q3 + 1.5 * (Q3 - Q1)
    
        # 寻找异常点
        kk = df[(df > up_whisker) | (df < low_whisker)]
        data1 = pd.DataFrame({'id': kk.index, '异常值': kk})
        return data1
    
    # 创建数据
    data = [1222, 87, 77, 92, 68, 80, 78, 84, 77, 81, 80, 80, 77, 92, 86, 76, 80, 81, 75, 77, 72, 81, 72, 84, 86, 80, 68, 77, 87, 76, 77, 78, 92, 75, 80, 78, 123, 3, 1223, 1232]
    df = pd.DataFrame(data, columns=['value'])
    df = df.iloc[:,0]
    result = OutlierDetection(df)
    print('箱线图检测到的异常值如下---------------------')
    print(result)
    
    # seaborn可视化箱型图
    f,ax=plt.subplots(figsize=(10,8))
    sns.boxplot(data=df, ax=ax)
    plt.show()
    

    1.3 Grubbs检验

    3 σ \sigma σ准则的加强版,适合于近似正态分布数据的检验。

    # pip3 install outlier_utils==0.0.3
    from outlier import smirnov_grubbs as grubbs
    # 默认双边检测,alpha是显著性,输出的结果会删除不满足要求的数据
    data = pd.Series([1, 8, 9, 10, 9])
    grubbs.test(data, alpha=0.05)
    # 1     8
    # 2     9
    # 3    10
    # 4     9
    # dtype: int64
    
    data = np.array([1, 8, 9, 10, 9])
    grubbs.test(data, alpha=0.05) # array([8, 9, 10, 9])
    # 返回离群指数的单侧(最小)检验
    grubbs.min_test_indices([8, 9, 10, 1, 9], alpha=0.05) #[3]
    #返回异常值的单侧(max)测试
    grubbs.max_test_outliers([8, 9, 10, 1, 9], alpha=0.05) #[]
    grubbs.max_test_outliers([8, 9, 10, 50, 9], alpha=0.05) #[50]
    

    1.4 ESD检验

    适合多个异常值检验。预先设定异常值个数上限r,执行r轮单独的检验。

    import math
    import numpy as np
    from scipy import stats
    
    
    def get_r(arr):
        m_arr = np.mean(arr)
        d_arr = abs(arr - m_arr)
        s = np.std(arr, ddof=1)  # 样本标准差,注意分母n-1
        out_ind = np.argmax(d_arr)
        return np.max(d_arr) / s, out_ind
    
    
    def esd(data, alpha=0.05, max_anoms=0.10):
        n = len(data)
        if isinstance(max_anoms, float):
            r = math.ceil(max_anoms * n)
        else:
            r = max_anoms
        outliers = []
        for i in range(1, r + 1):
            p = 1 - alpha / (n - i + 1) / 2
            t = stats.t.ppf(p, n - i - 1)  # p分位点
            _lambda = (n - i) * t / math.sqrt((n - i - 1 + t ** 2) * (n - i + 1))
            arr = np.delete(data, outliers)
            _r, out_ind = get_r(arr)
            if _r > _lambda:  # 超出临界值,视为异常点
                outliers.append(out_ind)
            else:
                break
        return np.delete(data, outliers), data[outliers]
    

    1.5 Dixon检验

    下面这篇博文写得很清楚了,就不搬了:
    Dixon检验判断正态分布离群值

    本节其他参考:
    正态分布检验以及异常值处理
    异常值检测和处理
    数据处理中常用的检验方法汇总

    2. 时间序列数据的异常值检验

    2.1 ADTK python模块

    pip3 install adtk

    时间序列的数据主要包括时间和相应的指标(如cpu,内存,数量等)。python中数据分析一般都是pandas的DataFrame,adtk要求输入数据的索引必须是DatetimeIndex。
    pandas提供了时间序列的时间生成和处理方法。

    # pd.date_range
    stamps = pd.date_range("2012-10-08 18:15:05", periods=4, freq="D")
    # DatetimeIndex(['2012-10-08 18:15:05', '2012-10-09 18:15:05',
    # '2012-10-10 18:15:05', '2012-10-11 18:15:05'],
    #  dtype='datetime64[ns]', freq='D')
    
    # pd.Timestamp
    tmp = pd.Timestamp("2018-01-05") + pd.Timedelta("1 day")
    print(tmp, tmp.timestamp(), tmp.strftime('%Y-%m-%d'))
    # 2018-01-06 00:00:00 1515196800.0 2018-01-06
    pd.Timestamp( tmp.timestamp(), unit='s', tz='Asia/Shanghai')
    # Timestamp('2018-01-06 08:00:00+0800', tz='Asia/Shanghai')
    pd.to_datetime
    

    adtk提供是validate_series来验证时间序列数据的有效性,如是否按时间顺序:

    import pandas as pd
    from adtk.data import validate_series
    from adtk.visualization import plot
    df = pd.read_csv('./data/nyc_taxi.csv', index_col="timestamp", parse_dates=True)
    df = validate_series(df)
    plot(df)
    

    2.1.1 ThresholdAD

    adtk.detector.ThresholdAD(low=None, high=None)
    参数:
    low:下限,小于此值,视为异常
    high:上限,大于此值,视为异常
    原理:通过认为设定上下限来识别异常
    总结:固定阈值算法

    from adtk.detector import ThresholdAD
    threshold_ad = ThresholdAD(high=30, low=15)
    anomalies = threshold_ad.detect(s)
    

    2.1.2 QuantileAD

    QuantileAD
    adtk.detector.QuantileAD(low=None, high=None)
    参数:
    low:分位下限,范围(0,1),当low=0.25时,表示Q1
    high:分位上限,范围(0,1),当low=0.25时,表示Q3
    原理:通过历史数据计算出给定low与high对应的分位值Q_low,Q_high,小于Q_low或大于Q_high,视为异常
    总结:分位阈值算法

    from adtk.detector import QuantileAD
    quantile_ad = QuantileAD(high=0.99, low=0.01)
    anomalies = quantile_ad.fit_detect(s)
    

    2.1.3 InterQuartileRangeAD

    InterQuartileRangeAD
    adtk.detector.InterQuartileRangeAD(c=3.0)
    参数:
    c:分位距的系数,用来确定上下限,可为float,也可为(float,float)
    原理:
    当c为float时,通过历史数据计算出 Q3+cIQR 作为上限值,大于上限值视为异常
    当c=(float1,float2)时,通过历史数据计算出 (Q1-c1
    IQR, Q3+c2*IQR) 作为正常范围,不在正常范围视为异常
    总结:箱线图算法

    from adtk.detector import InterQuartileRangeAD
    iqr_ad = InterQuartileRangeAD(c=1.5)
    anomalies = iqr_ad.fit_detect(s)
    

    2.1.4 GeneralizedESDTestAD

    GeneralizedESDTestAD
    adtk.detector.GeneralizedESDTestAD(alpha=0.05)
    参数:
    alpha:显著性水平 (Significance level),alpha越小,表示识别出的异常约有把握是真异常
    原理:将样本点的值与样本的均值作差后除以样本标准差,取最大值,通过t分布计算阈值,对比阈值确定异常点
    计算步骤简述:
    设置显著水平alpha,通常取0.05
    指定离群比例h,若h=5%,则表示50各样本中存在离群点数为2
    计算数据集的均值mu与标准差sigma,将所有样本与均值作差,取绝对值,再除以标准差,找出最大值,得到esd_1
    在剩下的样本点中,重复步骤3,可以得到h个esd值
    为每个esd值计算critical value: lambda_i (采用t分布计算)
    统计每个esd是否大于lambda_i,大于的认为你是异常

    from adtk.detector import GeneralizedESDTestAD
    esd_ad = GeneralizedESDTestAD(alpha=0.3)
    anomalies = esd_ad.fit_detect(s)
    

    2.1.5 PersistAD

    adtk.detector.PersistAD(window=1, c=3.0, side=‘both’, min_periods=None, agg=‘median’)
    参数:
    window:参考窗长度,可为int, str
    c:分位距倍数,用于确定上下限范围
    side:检测范围,为’positive’时检测突增,为’negative’时检测突降,为’both’时突增突降都检测
    min_periods:参考窗中最小个数,小于此个数将会报异常,默认为None,表示每个时间点都得有值
    agg:参考窗中的统计量计算方式,因为当前值是与参考窗中产生的统计量作比较,所以得将参考窗中的数据计算成统计量,默认’median’,表示去参考窗的中位值
    原理:
    用滑动窗口遍历历史数据,将窗口后的一位数据与参考窗中的统计量做差,得到一个新的时间序列s1;
    计算s1的(Q1-cIQR, Q3+cIQR) 作为正常范围;
    若当前值与它参考窗中的统计量之差,不在2中的正常范围内,视为异常。
    调参:
    window:越大,模型越不敏感,不容易被突刺干扰
    c:越大,对于波动大的数据,正常范围放大较大,对于波动较小的数据,正常范围放大较小
    min_periods:对缺失值的容忍程度,越大,越不允许有太多的缺失值
    agg:统计量的聚合方式,跟统计量的特性有关,如 'median’不容易受极端值影响
    总结:先计算一条新的时间序列,再用箱线图作异常检测

    from adtk.detector import PersistAD
    persist_ad = PersistAD(c=3.0, side='positive')
    anomalies = persist_ad.fit_detect(s)
    

    2.1.6 LevelShiftAD

    LevelShiftAD
    adtk.detector.LevelShiftAD(window, c=6.0, side=‘both’, min_periods=None)
    参数:
    window:支持(10,5),表示使用两个相邻的滑动窗,左侧的窗中的中位值表示参考值,右侧窗中的中位值表示当前值
    c:越大,对于波动大的数据,正常范围放大较大,对于波动较小的数据,正常范围放大较小,默认6.0
    side:检测范围,为’positive’时检测突增,为’negative’时检测突降,为’both’时突增突降都检测
    min_periods:参考窗中最小个数,小于此个数将会报异常,默认为None,表示每个时间点都得有值
    原理:
    该模型用于检测突变情况,相比于PersistAD,其抗抖动能力较强,不容易出现误报

    from adtk.detector import LevelShiftAD
    level_shift_ad = LevelShiftAD(c=6.0, side='both', window=5)
    anomalies = level_shift_ad.fit_detect(s)
    

    2.1.7 SeasonalAD

    adtk.detector.SeasonalAD(freq=None, side=‘both’, c=3.0, trend=False)
    SeasonalAD主要是根据ClassicSeasonalDecomposition来处理,判断。
    参数:
    freq:季节性周期
    c:越大,对于波动大的数据,正常范围放大较大,对于波动较小的数据,正常范围放大较小,默认6.0
    side:检测范围,为’positive’时检测突增,为’negative’时检测突降,为’both’时突增突降都检测
    trend: 是否考虑趋势

    from adtk.detector import SeasonalAD
    seasonal_ad = SeasonalAD(c=3.0, side="both")
    anomalies = seasonal_ad.fit_detect(s)
    plot(s, anomaly=anomalies, ts_markersize=1, anomaly_color='red', anomaly_tag="marker", anomaly_markersize=2)
    

    2.1.8 组合算法

    from adtk.pipe import Pipeline
    steps = [
        ("deseasonal", ClassicSeasonalDecomposition()),
        ("quantile_ad", QuantileAD(high=0.995, low=0.005))
    ]
    pipeline = Pipeline(steps)
    anomalies = pipeline.fit_detect(s)
    plot(s, anomaly=anomalies, ts_markersize=1, anomaly_markersize=2, anomaly_tag="marker", anomaly_color='red')
    

    本节参考:
    时间序列异常检测ADTK

    展开全文
  • 孤立森林算法适用于连续数据异常检测,将异常定义为“容易被孤立的离群点”,可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而...

    说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取。

      

    1.项目背景

           孤立森林是基于Ensemble的快速异常检测方法,具有线性时间复杂度和高精准度,是符合大数据处理要求的state-of-the-art算法。孤立森林算法适用于连续数据的异常检测,将异常定义为“容易被孤立的离群点”,可以理解为分布稀疏且离密度高的群体较远的点。用统计学来解释,在数据空间里面,分布稀疏的区域表示数据发生在此区域的概率很低,因而可以认为落在这些区域里的数据是异常的。

        孤立森林最早来源于2008年发表的一篇论文《Isolation Forest》,该论文由莫纳什大学的 Fei Tony Liu、Kai Ming Ting 和南京大学的周志华合作完成的。孤立森林算法的思想是通过不断地分割数据集,从而把异常点给孤立出来。分割数据集的依据是反复随机选取样本特征,不断地分割数据集直到每个样本点都是孤立的。在此情况下,异常点因为具有不同或者特殊的特征值,因此异常点的路径通常很短,也会比较早被分离出来。

    2.数据获取

    本次建模数据来源于网络(本项目撰写人整理而成),数据项统计如下:

    数据组成:训练数据1460条、81个特征(38个数值特征和43个分类特征)

     数据详情如下(部分展示):

    3.数据预处理

    3.1 用Pandas工具查看数据形状

    使用Pandas工具的shape ()方法查看数据的形状:

    关键代码:

    3.2缺失值数据填充

    使用Pandas工具的fillna ()方法用0填充缺失的数据,关键代码:

     

    3.3生产数据集的特征列表

    使用Pandas工具的columns属性来生成数据集的特征列表:

    关键代码:

    4.异常数据检测

    使用sklearn工具中的IsolationForest(算法)来进行数据集中异常数据的检测。

    4.1建模

    模型参数如下:

    4.2拟合与预测

    应用fit()方法进行拟合,应用predict()进行预测,预测值分为1和-1,1为正常值,-1为异常值,那么在后续的深度神经网络模型应用中将会丢弃掉异常值的数据。检测结果如下:

     

    关键代码如下:

    4.3正常值结果展示

    使用Pandas工具的head()方法来展示正常值数据的前10行:

     

    关键代码如下:

    5.特征工程

    5.1数据归一化

    使用sklearn工具MinMaxScaler()方法来进行数据的无量纲化,即数据的归一化,归一化后的数据如下图:

     

    关键代码:

    5.2 建立特征数据和标签数据

    SalePrice为标签数据,除SalePrice之外的为特征数据。关键代码如下:

     

    5.3数据集拆分

    训练集拆分,分为训练集和验证集,70%训练集和30%验证集。关键代码如下:

     

    6.构建深度神经网络模型

    主要使用Keras工具的Sequential()方法构建序惯模型,然后添加Dense层,用于目标回归。

     6.1建模

     关键代码如下:

    7.模型评估

    7.1评估指标及结

    评估指标主要包括均方误差等等。

     从上表可以看出,损失值较小,深度神经网络模型效果较好。

    关键代码如下:

     

    7.3 真实值与预测值比对图

     

    从上图可以看到,真实值和预测值波动基本一致,说明除去异常值之后的深度神经网络模型效果较好。

    8.结论与展望

    综上所述,使用了孤立森林算法对房价数据进行异常检测。实验结果表明,该算法可以有效检测出房价数据中存在的异常数据。然后把异常数据去除,来构建深度神经网络模型,模型效果较好。可用于日常生活中进行建模预测,以提高生产价值和效能。

    测试集数据预测结果如下:

     

    本次机器学习项目实战所需的资料,项目资源如下:

    项目说明:
    链接:https://pan.baidu.com/s/1dW3S1a6KGdUHK90W-lmA4w 
    提取码:bcbp

    网盘如果失效,可以添加博主微信:zy10178083

    展开全文
  • pyculiarity 时序数据异常检测
  • 它应用LOF算法在每个时间段检测事务数据异常程度,设置初始阈值以检测异常值,删除异常值,然后对数据集执行SAX检测。 如果未通过测试,它将逐步扩展外围区域,并重复上述过程以优化离群值阈值,从而提高检测算法...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 352,757
精华内容 141,102
关键字:

异常数据检测

友情链接: 相机标定.rar