【问题标题】:Row wise outlier/anomaly detection based on the values given in one column (in array format)基于一列中给出的值(以数组格式)的逐行异常值/异常检测
【发布时间】:2020-06-02 07:08:43
【问题描述】:

我一直在尝试通过 Python 或 R 找到一种方法,在我拥有的 csv 文件中,脚本应该遍历每一行并尝试根据其中一列中的数组值检测异常值或异常。

在我看来,这个问题相当复杂,我已经筋疲力尽地尝试通过检测异常或异常值的方法。

我应该研究机器学习来解决这样的问题吗?

类似的事情有already a question posted,但没有得到正确回答(我觉得),那里给出的数据图像可以用来描述任何合理的答案。

谢谢

I would like to find the outliers in the Values column, for example, in the first row 142 would be an outlier when compared to other values in the cell, i want something which would go ID wise (row by row) and write the outliers to a new file with all these columns in place

【问题讨论】:

  • errrmmm 你如何定义异常值?这是一个变量表明您不需要机器学习。你能提供一个csv文件的例子吗?以及去除异常值后的终点是什么?
  • 我会根据同一个单元格中存在的其他值定义一个异常值,范围为 170-180,如果值为 142,对我来说将是一个异常值。到目前为止,我只想识别异常值并将它们写入新文件而不是删除它们。
  • 你能提供一个你的 csv 文件的例子吗?否则怎么会有人知道你的 csv 文件是什么样的格式,或者有哪些列?
  • 我已经添加了上面的图片,在编辑的部分,如果你点击“我想...”你会找到例子

标签: python r csv machine-learning


【解决方案1】:

以下内容可以帮助您入门。因此,假设我们将异常值定义为与均值相差 2 个以上的标准差,我们可以执行以下操作。在继续阅读之前,请记住在有限的数据点上做这样的事情是有风险的,因为你没有观察到足够的数据来知道它是一个异常值!

import numpy as np
import pandas as pd
df = pd.DataFrame({'id':np.arange(1,6),
                   'lat':np.array([43,44,45,47,48]),
                   'lon':np.array([16,5,12,13,17]),
                   'values':[[171,172,142,169,178,180],[27,150,151,162,159,165],
                             [151,153,152,37],[171.222,127,180,172.56],[np.nan]]
                  })

我们可以看df:

    id  lat     lon     values
0   1   43  16  [171, 172, 142, 169, 178, 180]
1   2   44  5   [27, 150, 151, 162, 159, 165]
2   3   45  12  [151, 153, 152, 37]
3   4   47  13  [171.222, 127, 180, 172.56]
4   5   48  17  [nan]

我们定义了一个函数,将数据点返回到平均值 2 sd 之外的数据点:

def func(x):
    x = np.array(x)
    x_mean = np.mean(x)
    x_sd = np.std(x)
    return(x[abs(x - x_mean)>2*x_sd])

现在我们制作一个新的数据框:

newdf =df.copy()
newdf['outlier_values'] = newdf['values'].apply(func)
newdf

结果如下:

id  lat     lon     values  outlier_values
0   1   43  16  [171, 172, 142, 169, 178, 180]  [142]
1   2   44  5   [27, 150, 151, 162, 159, 165]   [27]
2   3   45  12  [151, 153, 152, 37]     []
3   4   47  13  [171.222, 127, 180, 172.56]     []
4   5   48  17  [nan]   []

【讨论】:

  • 非常感谢,这肯定会对我有很大帮助,并且一定会让我开始!
  • 酷。真的很高兴它让你开始:)
【解决方案2】:

也许基于熵的方法可以在这里工作:http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.380.4114&rep=rep1&type=pdf

简而言之,熵是无序的量度。因此,您可以通过计算行熵来“测量”行的混乱度。这是一个相对的衡量标准,因此您必须尝试确定对您的案例来说什么是精确的(这不是一门精确的科学)。

这是一个例子:

from scipy.stats import entropy


def my_entropy(labels, base = None):
    value,counts = np.unique(labels, return_counts=True)
    return entropy(counts, base=base)  

ls = [ [1,0,1,0,1,0,1,0,1,1,1,1], [1,0,1,0,1,0,1,0,1,1,9,1] , [1,0,1,'A',1,0,1,0,1,1,1,1], [1,0,1,0,5,0,1,0,7,1,0,1] ]

res = []
for labels in ls:
    res.append(my_entropy(labels))

print(res)
#[0.6365141682948128, 0.887694275799104, 0.8239592165010823, 1.14370838942625]

res 这里根据无序对列表进行排名。在第一种情况下,我们只有零和一,所以熵是最低的。其他 3 个列表中引入的不同异常值显着增加了熵。因此,可以在这里使用熵作为质量度量。

【讨论】:

  • 嗨,欢迎来到 SO!您能否在答案中从您的链接中添加更多详细信息?想象一下,链接可能会在几年后失效,您的答案需要独立存在。
  • 嗨,我对 python、r 和机器学习真的很陌生。如果能详细点就最好了,谢谢!
猜你喜欢
  • 2015-07-06
  • 2020-10-22
  • 2022-10-08
  • 1970-01-01
  • 2014-05-13
  • 2019-07-24
  • 1970-01-01
  • 2019-12-24
  • 2020-08-28
相关资源
最近更新 更多