为什么使用 Z-Score 移除异常值仍然会遗漏一些值作为异常值?

Why removing outliers with Z-Score still leaves out some values as outliers?

我是Ml的新手。我正在使用下面给出的代码删除具有 z 分数的异常值。我面临的问题是,当我删除异常值时,它仍然会留下一些值作为异常值。谁能解释为什么会这样? Z-score 不是一种从数据中删除所有离群值的可靠方法吗?

我正在第二次计算 z-score 以了解是否还有任何数据点。

for feature in numerical_features:

   data = pd.DataFrame(housing[feature], columns=[feature])
   data = data.copy()
   z_scores = np.abs(stats.zscore(data[feature]))

   print("Before z score on ", feature, " ====> ", data[z_scores > 3].shape)
   data[z_scores > 3] = data[feature].median()

   z_scores = np.abs(stats.zscore(data[feature]))
   print("After z score on ", feature, " ===> ", data[z_scores > 3].shape)
   housing[feature] = data[feature]
   print()

之前 z-score 是我第一次应用 z-score 并告诉我当我用中位数替换时会有多少值会受到影响。 在意味着之后,还有多少值仍然作为异常值? https://i.stack.imgur.com/g6kn2.png

z-score 告诉您某个点与平均值相差多少标准差。使用 |z-分数| > 3 是识别异常值的一种非常常用的方法。你缺少的是,当你 remove/replace 异常值时,你的新分布的标准差与以前不同,因此所有剩余点的 z 分数都略有不同。在许多情况下,变化可以忽略不计;然而,在某些情况下,z-score 的变化更为明显。

根据您的应用,您可能希望 运行 z-score 过滤器几次,直到获得稳定的分布。此外,根据您的应用程序,您可以考虑删除离群值数据而不是用中值替换它们。希望您知道为什么选择替换以及与该选择相关的注意事项。