【问题标题】:Automation of Outlier Detection异常值检测自动化
【发布时间】:2019-09-15 18:00:51
【问题描述】:

我正在解决一个问题,即异常值检测的自动化。为此,我需要一种算法来检测异常值。

我了解了 z 分数和分位数间距。但 z 分数仅适用于正态分布的数据。并且不确定分位数范围是否适用于每种数据(即使它遵循高斯分布、泊松分布)。我也读过 DBSCAN,但不知道这种方法的可信度。

谁能推荐一些 Python 中的算法或一些包,我可以使用它们来自动检测异常值?

我正在寻找更多的算法,或者即使是研究论文也可以,我以后可以用 Python 编写代码。

作为参考,下面是我必须找出异常值的数据示例之一。

month Units Sold
1     23178.78
2     23547.41
3     17720.51
4     25837.56
5     20375.98
6     16260.64
7     22881.59
8     25202.29
9     17255.29
10    20495.58
11    21253.27
12    20145.73

【问题讨论】:

    标签: python algorithm statistics outliers


    【解决方案1】:

    Sklearn 有相当多的异常值检测算法。例如,您有 Isolation Forest 和 One-class SVM。

    这是link 的一些示例。

    【讨论】:

      【解决方案2】:

      最近,我也在研究异常值检测 (OD) 工具主题。 根据我的经验,要进行异常值检测,您可能需要先定义您的问题。

      1. 您想要的异常值是什么?
      2. 从特征工程的角度来看,您要测量多少特征? 一维非常简单; 2 个或 N 个特征是完全不同的问题。
      3. 您希望如何显示您的 OD 结果? 1 或 2 维很容易; 3 个或更多维度应该是一个很大的挑战。
      4. 什么是特征数据类型,数字或分类数据?对于分类数据,您可以在开始时将它们转换为虚拟因子。

      关于异常值检测算法,我觉得你可以根据自己的数据来选择。

      • 对于一维,Z-score(来自 Scipy)或Mad() 模式是可以的。 虽然数据不是正态分布,但二模式可以很容易解释。您可以使用更复杂的算法并花更多时间解释为什么它们被计算为异常值。 Z-score 方法对极端异常值很敏感。在这种情况下,Mad 方法更加稳健。
      • 对于 2 维或更多维度,我最喜欢的 Isolated Forest 是快速(se)和可接受的大型数据集准确度(88%~89%)。

      【讨论】:

        【解决方案3】:

        您可以使用 XBOS、HBOS、IsolationForest 等无监督异常值检测来实现此目的:

        #create the dataframe
        import pandas as pd
        import numpy as np
        data = { 
                'month':      [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
                'Units_Sold': [23178.78,  23547.41,17720.51,25837.56,20375.98,16260.64,22881.59 ,25202.29 ,17255.29 ,20495.58,21253.27,20145.73]
               }
        
        df = pd.DataFrame(data)
        df
        
        #apply XBOS from this [Github](https://github.com/Kanatoko/XBOS-anomaly-detection)
        
        from xbos import XBOS
        
        xbos = XBOS(n_clusters=3)
        result = xbos.fit_predict(df)
        for i in result:
            print(round(i,2))
        #results
        #-0.74, -0.74, -0.94, -0.74, -0.81, -1.12, -0.91, -0.91, -1.03, -0.9, -0.9, -0.9
        #                                     ^^^^                 ^^^^
        #include results in dataframe
        df['outlier_score']= result
        df
        
        #Visualization of outliers
        import matplotlib.pyplot as plt 
        
        OD = df.query('outlier_score < -1')
        plt.scatter(df.month, df.Units_Sold)
        # set x-axis label and specific size
        plt.xlabel('month',size=16)
        # set y-axis label and specific size
        plt.ylabel('Units_Sold',size=16)
        plt.title('Visulization of unsupervised outlier Detection',size=14)
        plt.scatter(OD.month, OD.Units_Sold, color="red")
        

        异常点用红色突出显示:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-24
          • 1970-01-01
          • 1970-01-01
          • 2020-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多