Как правильно перевести метки Kmeans в метки категорий

1

Я использую реализацию Sklearn Kmeans

Я группировал набор данных, который помечен как метка, и я использовал метрики кластеров sklearn, чтобы проверить производительность кластеризации.

Вычисление кластеров Sklearn Kmeans - это, как вам известно, список чисел в диапазоне k_clusters. Однако мои ярлыки являются strings.

До сих пор у меня не было проблем с ними, так как метрики из sklearn.metrics.cluster работают со смешанными входами (списки меток int & str).

Однако теперь я хочу использовать некоторые из показателей классификации и из того, что я собираю, входы k_true и k_pred должны быть одного набора. Либо числа в диапазоне от k, либо строковые метки, которые использует мой набор данных. Если я попробую, он вернет следующую ошибку:

AttributeError: 'bool' object has no attribute 'sum'

Итак, как я мог перевести метки k_means в другие типы меток? Или даже наоборот (строковые метки → целые метки).

Как я мог даже начать его реализацию? Поскольку k_means довольно недетерминирован, метки могут меняться от итерации к итерации. Есть ли законный способ для правильного перевода лейблов Kmeans?

РЕДАКТИРОВАТЬ:

ПРИМЕР

при k = 4

kmeans output: [0,3,3,2,........0]

классные метки: ['CAT','DOG','DOG','BIRD',.......'CHICKEN']

Теги:
scikit-learn
cluster-analysis
labels

2 ответа

1
Лучший ответ

Кластеризация не является классификацией.

Методы не предсказывают ярлык, поэтому вы не должны использовать оценку оценки классификации. Это было бы похоже на измерение качества яблока в милях за галлон...

Если вы настаиваете на том, чтобы делать неправильную вещь (tm), используйте венгерский алгоритм, чтобы найти наилучшее отображение. Но будьте осторожны: количество кластеров и количество классов обычно не будут одинаковыми. Если это так, использование такого сопоставления будет либо несправедливо отрицательным (не отображать дополнительные кластеры), либо несправедливо положительным (сопоставление кластеров на одной и той же метке будет рассматривать N точек - оптимальное решение N кластеров). Лучше использовать только меры кластеризации.

  • 0
    Эй, спасибо за твой ответ! Я не знал о венгерском алгоритме, так что спасибо за это :)
  • 0
    О количестве кластеров и классов. Я буду использовать kmeans, поэтому я буду искать подходящие классы. Насчет мер, я полагаю, вы правы. Разные метрики для разных вещей. Однако я думаю, что F1 , Precision и Recall могли бы применяться в кластеризации правильно? В любом случае, спасибо за ваш вклад. Я ценю это. ура
Показать ещё 2 комментария
1

Вы можете создать сопоставление с помощью словаря, скажем,

mapping_dict = { 0: 'cat', 1: 'chicken', 2:'bird', 3:'dog'}

Затем вы можете просто применить это сопоставление, используя понимание списка слов и т.д. Предположим, что ваши ярлыки хранятся в списке kmeans_predictions

mapped_predictions = [ mapping_dict[x] for x in kmeans_predictions]

Затем используйте mapped_predictions как ваши прогнозы

Обновление: основываясь на ваших комментариях, я считаю, что вам нужно сделать это наоборот. Я имею в виду преобразовать ваши метки в 'int' сопоставления.

Кроме того, вы не можете использовать здесь какую-либо классификационную метрику. Используйте показатель полноты, v-меру и однородность, поскольку они более подходят для проблем с кластеризацией. Было бы неверно просто слепо использовать любую случайную классификационную метрику здесь.

  • 0
    Спасибо за Ваш ответ. Моя проблема не в том, как, а как организовать карту. Какая метка int будет отображена на какую метку str . Я мог бы наблюдать за распределением каждого кластера, но это могло скрывать некоторые ловушки в процессе.
  • 1
    Я обновил свой ответ на основе ваших комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню