scikitlearn - ошибка памяти при кластеризации MiniBatchKMeans после HashingVectorizer - PullRequest
0 голосов
/ 01 сентября 2018

моя цель - выполнить кластеризацию текстов из набора данных миллионов строк , где каждая строка представляет собой строку слов, которая не соответствует надлежащему документу, а точнее к списку "ключевых слов". Идея состоит в том, что каждая строка представляет пользователя 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 было то, что могло помочь против ограничений памяти, я также не знаю, что лучшие параметры для использования (я следовал учебнику scikitlearn для KMeans и MiniBatchKMeans для кластеризации текстов в качестве основы, вы можете найти его здесь http://scikit -learn.org / stable / auto_examples / text /document_clustering.html#sphx-glr-auto-examples-text-document-clustering-py).

Что следует помнить:

  • Я не могу использовать любой Машинное обучение или НЛП или MapReduce аналогичные методики
  • Кластеры должны как-то представлять пользователей со схожими интересами , поэтому использование схожих ключевых слов

Итак, мой вопрос: как мне исправить ошибку памяти ? И если у кого-то есть подсказки о том, как правильно настроить кластеризацию, или если мой подход неверен, это также было бы неплохо.

1 Ответ

0 голосов
/ 02 сентября 2018

Строка, содержащая текст, подобный этому, «удалить случай перебранки в офисе окружного прокурора США Кармен Ортис Аарон Шварц», действительно dirty.

Чтобы исправить ошибку памяти, убедитесь, что следующие пункты верны;

  • Все ли ключевые слова в строке актуальны? Если нет, попробуйте уменьшить их, удалив стоп-слова, знаки пунктуации и т. Д.

  • Сосредоточьтесь на агрегации релевантных ключевых слов из текста. Вы можете создать список таких ключевых слов.

  • Найдите библиотеку regex в python. Это может помочь вам с очисткой данных.

  • Чтобы определить наилучшие параметры, ищите такие термины, как within cluster sums of squares или average silhouette или gap statistic.

Кластеризация - это не какой-то dark-magic, который даст результаты. Если вы введете мусор, это приведет к мусору.

P.S. Пожалуйста, не создавайте новые вопросы по той же проблеме. Уже есть похожий вопрос, который вы задали недавно . Если два вопроса радикально не отличаются, создайте новый вопрос, в противном случае четко изложите его в своем посте, чем этот вопрос отличается от предыдущего вопроса.

...