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

时间:2019-08-29 10:10:04

标签: python pandas outliers dbscan

我正在处理一个包含3列的数据:typexy,假设xy是相关的,它们如果不是标准化分布的,我希望通过type进行分组,并过滤​​outliersnoise中的xy数据点。有人可以推荐我统计学或机器学习方法来过滤异常值或噪声数据吗?如何在Python中做到这一点?

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

类型1: type1 类型2: enter image description here 类型3: enter image description here

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
)

enter image description here

3 个答案:

答案 0 :(得分:1)

如果您不关心参数,当然您不会获得良好的结果。看看你的情节。规模巨大-您的epsilon很小!似乎您的数据可能是整数,因此除重复项外,其他任何点的距离都不会小于0.5 ... 因此,所有数据都被认为是噪声。

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

我还要先对数据进行日志转换。使用一些简单的阈值可能就足够了。当数据为单峰时,不要:使用集群进行过度处理。

答案 1 :(得分:1)

使用某些功能工程技术后,您可以考虑使用Sklearn库中的OneClassSVM估计器。

https://justanoderbit.com/outlier-detection/one-class-svm/介绍了如何将其用于离群值检测。

答案 2 :(得分:1)

对于此类数据和异常值,我建议采用统计方法。 SPE / DmodX(距模型的距离)或Hotelling T2测试可能会在这里为您提供帮助。我看不到这三种类型的数据,但生成了一些。

这些方法在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)

example results

results是一本字典,其中包含离群值的标签。