【问题标题】:Error while trying to find outliers using 'z_score'尝试使用 \'z 分数\' 查找异常值时出错
【发布时间】:2023-01-19 02:54:21
【问题描述】:

我正在尝试找出我为自己理解该主题而创建的数据集中的异常值。它是一个简单的 python 列表。但我无法获得理想的结果。我正在使用谷歌协作。我使用的概念是,在正态分布中,在第三个标准偏差之后,大多数异常值都存在。

代码如下:

df2=[12,13,14,15,10,12,14,15,1007,12,14,17,18,1005,14,15,16,17,13,14,1100,12,13,14,15]
outliers=[]

 def detect_outliers(data):
 threshold = 3             ## threshold is till 3rd standard deviation 
 mean = np.mean(data)
 standard_deviation = np.std(data)

    for i in data:
       z_score = (i-mean)/standard_deviation
       if np.abs(z_score)>threshold:
            outliers.append(i)

 return outliers
detect_outliers(df2)

我得到空列表形式的输出。 []

【问题讨论】:

  • (i-mean)/standard_deviation 都没有超过 3,所以你得到一个空的离群值列表是有道理的。如果您删除 1 或 2 个大值(超过 1000),那么您将得到孤立的大值,这些值可以通过您的方法识别为离群值
  • 其他示例,您可以将值池中的值数量增加到 10 左右,并仅保留 2 或 3 个非常大的值,以便平均值更侧重于池而不是极值。使用此集合,您将检测极值作为异常值。最后,我将绘制 df2abs(i-mean)/standard_deviation 的对比图,以便您可以图形化地了解正在发生的事情
  • 有效。实际上,我只是随机取了这些数字,我认为由于与列表中的其他数字相比存在 3 个大数字,所以它可能会显示所有三个数字。
  • 还要小心处理异常值。离群值不一定是荒谬的值,它们只能反映特定的分布(例如对数正态分布)。您通常需要一个理由来称异常值为“荒谬的值”(例如设备错误、欺诈、训练不足)
  • 嘿,你能帮我解决另一个与 anaconda 相关的问题吗

标签: statistics outliers


【解决方案1】:

您编写的代码似乎是在尝试使用 Z-score 方法查找异常值,这是一种根据数据点与平均值之间的标准差多少来识别异常值的方法。在此方法中,Z 分数大于特定阈值(在本例中为 3)的数据点被视为异常值。

但是,您的代码存在一些问题,可能会导致它返回一个空列表:

您正在尝试使用 numpy 库来计算均值和标准差,但您尚未导入它。您需要在代码顶部添加行 import numpy as np 才能使用 numpy。 detect_outliers 函数不返回任何内容。您需要在函数末尾添加 return outliers 语句以返回异常值列表。 阈值设置为 3,但该值应介于 -3 到 3 之间。 您编写的代码似乎是在尝试使用 Z-score 方法查找异常值,这是一种根据数据点与平均值之间的标准差多少来识别异常值的方法。在此方法中,Z 分数大于特定阈值(在本例中为 3)的数据点被视为异常值。

但是,您的代码存在一些问题,可能会导致它返回一个空列表:

您正在尝试使用 numpy 库来计算均值和标准差,但您尚未导入它。您需要在代码顶部添加行 import numpy as np 才能使用 numpy。 detect_outliers 函数不返回任何内容。您需要在函数末尾添加 return outliers 语句以返回异常值列表。 阈值设置为 3,但该值应介于 -3 到 3 之间。

这是更正后的代码,试一试

import numpy as np
df2=[12,13,14,15,10,12,14,15,1007,12,14,17,18,1005,14,15,16,17,13,14,1100,12,13,14,15]
outliers=[]

def detect_outliers(data):
    threshold = 3.5 # Z-score threshold
    mean = np.mean(data)
    standard_deviation = np.std(data)
    for i in data:
        z_score = (i-mean)/standard_deviation
        if np.abs(z_score) > threshold:
            outliers.append(i)
    return outliers

print(detect_outliers(df2))

值得注意的是,此方法并不总是查找异常值的最佳方法,尤其是当您的数据不是近似正态分布时。还有其他方法。 ?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-03
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 1970-01-01
    相关资源
    最近更新 更多