DBSCAN sklearn работает очень медленно

Я пытаюсь сгруппировать набор данных с более чем 1 миллионом точек данных. Один столбец имеет текст, а другой столбец имеет соответствующее ему числовое значение. Проблема, с которой я сталкиваюсь, заключается в том, что она застревает и никогда не завершается. Я пытался работать с меньшими наборами данных, около 100 000, и он работает довольно быстро, но когда я начинаю увеличивать количество точек данных, он начинает замедляться, и для миллиона он никогда не завершается и зависает. Сначала я подумал, что это может быть из-за того, что у меня есть матрица tfidf для текста и 100 измерений, поэтому это занимает много времени. Затем я попытался выполнить кластеризацию на основе суммы, которая представляет собой всего лишь одно значение для каждой точки данных, и она все еще не завершена. Ниже приведен фрагмент кода. Любая идея, что я могу делать неправильно? Я видел людей, работающих с большими наборами данных, и у них не было проблем.

Y=data['amount'].values
Y=Y.reshape(-1,1)
dbscan = DBSCAN(eps=0.3, min_samples= 10, algorithm='kd_tree')
dbscan.fit_predict(Y)
labels = dbscan.labels_
print(labels.size)
clusters = labels.tolist()
#printing the value and its label
for a, b in zip(labels, Y):
    print(a, b)

person Anshul Tripathi    schedule 28.09.2018    source источник
comment
Как долго вы на самом деле ждали его завершения?   -  person Dr. Snoopy    schedule 28.09.2018
comment
Что вы подразумеваете под кластеризацией на основе суммы, которая является единственным значением для каждой точки данных? Вы выполняли настройку гиперпараметров для eps и min_samples? DBScan очень чувствителен к этим параметрам. Даже небольшое изменение в eps может изменить поведение вашей модели.   -  person Kalsi    schedule 29.09.2018
comment
@MatiasValdenegro Я запустил его на ночь, и он все еще работал. Так что, может быть, 8 часов.   -  person Anshul Tripathi    schedule 30.09.2018
comment
@Kalsi Я имел в виду, что количество - это всего лишь одна функция, поэтому мой набор данных был матрицей 1 миллион на 1 по сравнению с текстом, который после преобразования в матрицу tfidf сгенерировал 100 символов. так что матрица 1 миллион на 100.   -  person Anshul Tripathi    schedule 30.09.2018


Ответы (2)


Скорее всего ваш эпсилон слишком велик.

Если большинство точек находятся в пределах эпсилон большинства других точек, то время выполнения будет квадратичным O (n²). Итак, начните с маленьких значений!

Вы не можете просто добавлять/удалять функции и оставлять эпсилон без изменений.

person Has QUIT--Anony-Mousse    schedule 30.09.2018
comment
Почему epsilon/point-density может изменить сложность выполнения? Попарные расстояния должны быть рассчитаны независимо. - person Daniel; 24.07.2020

Используйте больше ядер.

Используйте параметр n_jobs. Определите его как: n_jobs=-1внутри DBSCAN класса.

Пример:

Y=data['amount'].values
Y=Y.reshape(-1,1)
dbscan = DBSCAN(eps=0.3, min_samples= 10, algorithm='kd_tree', n_jobs=-1)
dbscan.fit_predict(Y)
labels = dbscan.labels_
print(labels.size)
clusters = labels.tolist()
#printing the value and its label
for a, b in zip(labels, Y):
    print(a, b)
person seralouk    schedule 29.09.2018