在 Python 中检测每组中的异常值或噪声数据

Detect outliers or noise data in each group in Python

我正在处理一个包含 3 列的数据:typexy,假设 xy 是相关的而且它们不是标准化分布的,我想要 groupby type 和过滤器 outliersnoise 数据点在 xy 中。有人可以向我推荐统计或机器学习方法来过滤异常值或噪声数据吗?我怎样才能在 Python 中做到这一点?

我正在考虑使用 scikit-learn 中的 DBSCAN,这个方法合适吗?

类型 1: 类型2: 类型 3:

df1 = df.loc[df['type'] == '3']

data= df1[["x", "y"]]
data.plot.scatter(x = "x", y = "y")

from sklearn.cluster import DBSCAN
outlier_detection = DBSCAN(
  eps = 0.5,
  metric="euclidean",
  min_samples = 3,
  n_jobs = -1)
clusters = outlier_detection.fit_predict(data)

from matplotlib import cm
cmap = cm.get_cmap('Accent')
data.plot.scatter(
  x = "iSearchCount",
  y = "iGuaPaiCount",
  c = clusters,
  cmap = cmap,
  colorbar = False
)

不关心参数当然得不到好的结果。看看你的情节。规模很大 - 你的 epsilon 很小!好像你的数据可能是整数,所以除了重复之外没有点的距离小于 0.5 ... 因此所有数据都被认为是噪音。

在使用方法之前,请确保您已了解其工作原理以及需要设置的参数。

我也会先记录转换数据。使用一些简单的阈值可能就足够了。 Don:t 当您的数据是单峰时,过度使用聚类。

经过一些特征工程技术后,您可以考虑使用 Sklearn 库中的 OneClassSVM 估计器。

https://justanoderbit.com/outlier-detection/one-class-svm/ 描述了如何使用它进行离群值检测。

对于此类数据和异常值,我会推荐一种统计方法。 SPE/DmodX(到模型的距离)或 Hotelling T2 测试可能对您有所帮助。我没有看到这 3 种类型的数据,但我生成了一些。

这些方法在 pca 库中可用。使用 n_std 您可以调整椭圆的“宽度”。

pip install pca

import pca
results = pca.spe_dmodx(X, n_std=3, showfig=True)

# If you want to test the Hotelling T2 test.
# results1 = pca.hotellingsT2(X, alpha=0.001)

results 是一个字典,包含异常值的标签。