关于时间序列的无监督异常值检测

时间:2018-06-06 21:28:30

标签: python scikit-learn time-series outliers unsupervised-learning

所以我正在寻找方法来改进我目前在工作时间表中检测异常值的实现。 我的数据集是人们的徽章滑动。当前实现使用简单的标准偏差方法分别在时间和时间上发现异常值。这种方法的问题是,

  1. 我们必须手动查找时间和时间。对于在一夜之间工作的人来说,这很棘手。
  2. 由于异常值检测涉及平均值,如果计划更改或轮班转换,则平均离开。
  3. 以下是数据样本;

      PersonID            event_ts
    0   104756 2017-02-13 10:37:29
    1    38469 2017-05-10 09:15:11
    2   111130 2017-05-05 12:08:07
    3   601398 2017-04-05 18:14:10
    4    33945 2017-02-08 09:10:31
    5   101294 2017-05-17 12:28:51
    6    39476 2017-06-23 16:01:44
    7    31791 2017-03-15 18:42:12
    8   114090 2017-03-14 20:33:27
    9    33380 2017-02-22 16:03:22
    

    现在,这些数据的另一个挑战是训练数据会被异常值污染。由于数据集中的人数以及轮班的变化或轮换,因此很难清理。

    现在,我尝试使用GaussianMixter模型,并将日期调整为序数以供算法使用。而不是一个完整的时间戳,我使用带有IS_SWIPE标志的每小时数据,在该小时内至少进行一次滑动。所以数据看起来像这样。

                                     PersonID  Date_ordinal  hour  IS_SWIPE
    0  0x002935373242324333352D303533332D3443        736384     0         0
    1  0x002935373242324333352D303533332D3443        736384     1         0
    2  0x002935373242324333352D303533332D3443        736384     2         0
    3  0x002935373242324333352D303533332D3443        736384     3         0
    4  0x002935373242324333352D303533332D3443        736384     4         0
    5  0x002935373242324333352D303533332D3443        736384     5         0
    6  0x002935373242324333352D303533332D3443        736384     6         0
    7  0x002935373242324333352D303533332D3443        736384     7         0
    8  0x002935373242324333352D303533332D3443        736384     8         1
    9  0x002935373242324333352D303533332D3443        736384     9         0
    

    以下是我正在尝试使用的一般代码;

    df = pd.read_sql_query("""SQL Query""", cnxn, parse_dates=['Date','Datetime'])
    df['Date_ordinal']=df['Date'].apply(datetime.toordinal)
    df = df.sort_values(by=['Datetime'])
    train_set, test_set = train_test_split(df[['Date_ordinal','hour','IS_SWIPE']], test_size=0.4)
    A = mixture.GaussianMixture(n_components=3, covariance_type='tied').fit(train_set)
    print A.predict(test_set)[:10]
    
      

    [1 0 2 0 2 0 2 2 2 1]

    现在,我陷入困境的是,

    1. 我不知道如何解释预测函数的输出。值0,1和2意味着什么,我在这里检查了Scikit-learn文档,但它只讨论了函数对输出没有任何作用。此外,它们似乎与输入的顺序不同,并且每次调用函数时都会保持顺序。
    2. 拟合函数是否考虑了火车组中的异常值,很可能不是,对吧?
    3. 如果是这样,我正在考虑使用“稳健的协方差估计和马哈拉诺比斯距离相关性”方法,但我不完全确定我是否理解它以及如何调整我的代码呢?
    4. Mahalanobis算法是否可以使用原始时间戳来改变或轮换工作时间表?或者我是否还必须使用上述修改后的数据?
    5. 非常感谢任何帮助。你可以看到我是数据科学的新手并且还在学习,所以请原谅我的无知。

0 个答案:

没有答案