DBSCAN sklearn内存问题

4

我正在尝试使用DBSCAN sklearn实现进行异常检测。对于小数据集(500 x 6),它运行良好。但是,当我尝试使用大数据集(180000 x 24)时,它会遇到内存问题。是否有什么方法可以解决这个问题?

from sklearn.cluster import DBSCAN
import pandas as pd
from sklearn.preprocessing import StandardScaler
import numpy as np

data = pd.read_csv("dataset.csv")
# Drop non-continuous variables
data.drop(["x1", "x2"], axis = 1, inplace = True)
df = data

data = df.as_matrix().astype("float32", copy = False)

stscaler = StandardScaler().fit(data)
data = stscaler.transform(data)

print "Dataset size:", df.shape

dbsc = DBSCAN(eps = 3, min_samples = 30).fit(data)

labels = dbsc.labels_
core_samples = np.zeros_like(labels, dtype = bool)
core_samples[dbsc.core_sample_indices_] = True

# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)

print('Estimated number of clusters: %d' % n_clusters_)

df['Labels'] = labels.tolist()

#print df.head(10)

print "Number of anomalies:", -1 * (df[df.Labels < 0]['Labels'].sum())

1
可能是scikit-learn DBSCAN内存使用的重复问题。 - Has QUIT--Anony-Mousse
不幸的是,sklearn实现的最坏情况是O(n^2)(这不是标准的DBSCAN,而是由于sklearn的向量化;例如ELKI仅使用O(n)内存)。您可以使用低内存实现,增加内存,并尝试使用较小的eps。在标准化数据上,3看起来太大了! - Has QUIT--Anony-Mousse
好的。让我尝试不同的参数。感谢您的回复。 我希望在尝试ELKI或R之前有一些高效的Python实现。 - Nira
我将参数更改为: dbsc = DBSCAN(eps = 1, min_samples = 15).fit(data) 它占用了10GB的内存和25分钟的时间,但是运行良好。再次感谢。 - Nira
1个回答

2
根据您要解决的问题类型,在DBSCAN构造函数中可以调整此参数: leaf_size:int,可选(默认值= 30) 传递给BallTree或cKDTree的叶大小。这可能会影响构建和查询的速度以及存储树所需的内存。最佳值取决于问题的性质。
如果这不符合您的需求,则已经在这里解决了这个问题,您可以尝试使用ELKI的DBSCAN实现。

谢谢。我确实看到了其他的Stack Overflow问题,但是希望这个问题在最新的scikit learn中已经得到解决。 - Nira
1
叶大小对内存成本的影响可能很小。sklearn的问题在于它首先计算并存储所有点的所有邻居,然后运行DBSCAN。这就是为什么大的eps会有问题的原因。 - Has QUIT--Anony-Mousse
ELKI需要在文档方面进行改进。 - StatguyUser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接