Кластеризация Scikit-Learn DBSCAN без кластеров

У меня есть набор данных с десятком измерений (столбцов) и около 200 наблюдений (строк). Этот набор данных был нормализован с использованием quantile_transform_normalize. (Обновлено: я попытался запустить кластеризацию без нормализации, но все равно не повезло, поэтому я не верю, что это причина.) Теперь я хочу сгруппировать данные в несколько кластеров. До сих пор я использовал KMeans, но читал, что он может быть неточным в более высоких измерениях и плохо обрабатывать выбросы, поэтому я хотел сравнить с DBSCAN, чтобы увидеть, получу ли я другой результат.

Однако, когда я пытаюсь кластеризовать данные с помощью DBSCAN с использованием метрики расстояния Махаланобиса, каждый элемент кластеризуется в -1. По документации:

Noisy samples are given the label -1.

Я не совсем уверен, что это означает, но я получал несколько хороших кластеров с KMeans, поэтому я знаю, что есть что-то для кластеризации - это не просто случайное.

Вот код, который я использую для кластеризации:

covariance = np.cov(data.values.astype("float32"), rowvar=False)
clusterer = sklearn.cluster.DBSCAN(min_samples=6, metric = "mahalanobis", metric_params = {"V": covariance})
clusterer.fit(data)

И это все. Я точно знаю, что data - это числовой DataFrame Pandas, поскольку я проверил его в отладчике.

Что могло вызвать эту проблему?

Возможно, ваши данные просто недостаточно "плотные" для DBScan. Вы пробовали использовать другую метрику и отрегулировать значение min_samples?

ixeption 13.11.2018 00:23
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
1 308
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам также необходимо выбрать параметр eps.

Результаты DBSCAN очень сильно зависят от этого параметра. Вы можете найти некоторые методы его оценки в литературе.

IMHO, sklearn должен предоставить нет значение по умолчанию для этого параметра, потому что он редко когда-либо работает (с нормализованными игрушечными данными это обычно нормально, но это все).

200 экземпляров, вероятно, слишком мало для надежного измерения плотности, особенно с дюжиной переменных.

Как определяется дефолтный eps? Я немного заподозрил это, но не смог найти никакой документации, поэтому решил, что это приемлемое значение по умолчанию.

Ian 14.11.2018 16:49

Кто-то в какой-то момент выбрал значение по умолчанию. Нет процесса, зависящего от данных. Поэтому чаще всего не работает. Сообщите об ошибке, если значение по умолчанию вводит в заблуждение.

Has QUIT--Anony-Mousse 15.11.2018 21:20

Другие вопросы по теме