scikitlearn - HashingVectorizer之后的MiniBatchKMeans聚类期间的内存错误

问题描述 投票:1回答:1

我的目标是从数百万行的数据集中执行文本聚类,其中每行是一串单词,不对应于正确的文档,而是对应于“关键字”列表。我们的想法是每行代表一个Twitter用户,其中包含从他/她的推文中获取的关键字列表,以下是一行示例:

"remove United States District Attorney Carmen Ortiz office overreach case Aaron Swartz"

这是我的代码:

from __future__ import print_function
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.cluster import MiniBatchKMeans
from time import time
import csv

# LOAD CSV
print("Loading Dataset from a CSV...")
csvinputfile = '...'
t = time()
dataset = open(csvinputfile, 'r')
print("done in %0.3fs" % (time() - t))
print("")

# TERM OCCURRENCES
print("Calculating Term Occurrences...")
t = time()
vectorizer = HashingVectorizer(n_features=300000, stop_words=None, alternate_sign=False, norm='l2', binary=False)
x = vectorizer.fit_transform(dataset)
print("done in %0.3fs" % (time() - t))
print("")

# CLUSTERING
print("MiniBatchKMeans Clustering...")
t = time()
km = MiniBatchKMeans(n_clusters=10000, init='k-means++', n_init=1, init_size=10000, batch_size=10000, verbose=False)
clusters = km.fit(x)
print("done in %0.3fs" % (time() - t))
print("")

我的问题是,当涉及到群集时,我得到一个内存错误:

MiniBatchKMeans Clustering...
Traceback (most recent call last):
File ".../cluster-users.py", line 32, in <module> clusters = km.fit(x)
File ".../python2.7/site-packages/sklearn/cluster/k_means_.py", line 1418, in fit init_size=init_size)
File ".../python2.7/site-packages/sklearn/cluster/k_means_.py", line 684, in _init_centroids x_squared_norms=x_squared_norms)
File ".../python2.7/site-packages/sklearn/cluster/k_means_.py", line 79, in _k_init centers = np.empty((n_clusters, n_features), dtype=X.dtype)
MemoryError
[Finished in 22.923s]

我对python和scikitlearn很新,所以我不太了解发生了什么,但我认为这是因为,由于我正在处理大型数据集,因此聚类阶段正在尝试加载n_samples和n_features的巨大矩阵进入记忆。

这个错误的一部分,我不明白,因为我认为MiniBatchKMeans和HashingVectorizer可以帮助抵御内存限制,我也不知道什么是最好使用的参数(我遵循了KMeans的scikitlearn教程和MiniBatchKMeans用于聚类文本作为基础,你可以在这里找到http://scikit-learn.org/stable/auto_examples/text/document_clustering.html#sphx-glr-auto-examples-text-document-clustering-py)。

要记住的事情:

  • 我不能使用任何机器学习或NLP或MapReduce技术
  • 群集需要以某种方式表示具有相似兴趣的用户,因此使用类似的关键字

所以我的问题是:如何修复内存错误?如果有人对如何正确设置群集有一些提示,或者我的方法是错误的,那也会很好。

python scikit-learn out-of-memory cluster-analysis large-data
1个回答
1
投票

包含这样的文本的行,“删除美国地方检察官Carmen Ortiz办公室超越案例Aaron Swartz”确实是dirty

要修复内存错误,请确保以下几点符合;

  • 连续的所有关键字都相关吗?如果没有,请尝试通过删除停用词,标点符号等来减少它们。
  • 专注于汇总文本中的相关关键字。您可以创建此类关键字的列表。
  • 在python中查找regex库。它可以帮助您清理数据。
  • 要确定最佳参数,请查找within cluster sums of squaresaverage silhouettegap statistic等术语。

聚类不是某种能产生结果的dark-magic。如果你输入垃圾,它会产生垃圾。

附:请不要为同一问题创建新问题。已经有另一个similar question that you've asked recently了。除非这两个问题根本不同,否则请在帖子中另外说明一个新问题,这个问题与前一个问题有什么不同。

© www.soinside.com 2019 - 2024. All rights reserved.