我正在处理一个包含3列的数据:type
,x
,y
,假设x
和y
是相关的,它们如果不是标准化分布的,我希望通过type
进行分组,并过滤outliers
和noise
中的x
或y
数据点。有人可以推荐我统计学或机器学习方法来过滤异常值或噪声数据吗?如何在Python中做到这一点?
我正在考虑使用DBSCAN
中的scikit-learn
,这是合适的方法吗?
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
)
答案 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)
results
是一本字典,其中包含离群值的标签。