Я использую реализацию 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']
Кластеризация не является классификацией.
Методы не предсказывают ярлык, поэтому вы не должны использовать оценку оценки классификации. Это было бы похоже на измерение качества яблока в милях за галлон...
Если вы настаиваете на том, чтобы делать неправильную вещь (tm), используйте венгерский алгоритм, чтобы найти наилучшее отображение. Но будьте осторожны: количество кластеров и количество классов обычно не будут одинаковыми. Если это так, использование такого сопоставления будет либо несправедливо отрицательным (не отображать дополнительные кластеры), либо несправедливо положительным (сопоставление кластеров на одной и той же метке будет рассматривать N точек - оптимальное решение N кластеров). Лучше использовать только меры кластеризации.
Вы можете создать сопоставление с помощью словаря, скажем,
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-меру и однородность, поскольку они более подходят для проблем с кластеризацией. Было бы неверно просто слепо использовать любую случайную классификационную метрику здесь.
int
будет отображена на какую метку str
. Я мог бы наблюдать за распределением каждого кластера, но это могло скрывать некоторые ловушки в процессе.
F1
,Precision
иRecall
могли бы применяться в кластеризации правильно? В любом случае, спасибо за ваш вклад. Я ценю это. ура