Контролируемая кластеризация - Метри c для оценки каждой метки наземной правды? - PullRequest
1 голос
/ 14 марта 2020

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

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

Например, метка 0 имеет 5 точек данных, поэтому мы имеем следующее:
true_labels = [0,0,0,0,0]
cluster_numbers = [1,1,1,1,1] (то есть все метки 0 точек находятся в одном кластере)
-> должны вернуть идеальный результат 1,0

И если точки меток распределены в нескольких кластерах, как это
cluster_numbers = [0,0,0,1,1]
-> возвращаемый балл 0.6

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

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Я думаю, вы можете попробовать оценить матрицу путаницы и проверить голос большинства. Например, мы используем набор данных iris:

from sklearn.datasets import load_iris
from sklearn.cluster import SpectralClustering
from sklearn.metrics import confusion_matrix
import pandas as pd

data = load_iris()
df = pd.DataFrame(data.data, 
columns=['sepal.length','sepal.width','petal.length','petal.width'])
labels = data.target

И выполняем спектральную кластеризацию:

clustering = SpectralClustering(n_clusters=3,
assign_labels="discretize",random_state=0).fit(df)

M = confusion_matrix(labels,clustering.labels_)

M
array([[ 0, 50,  0],
       [ 2,  0, 48],
       [37,  0, 13]])

Для каждой строки у вас есть прогноз для каждой метки. Чистота, как у вас выше:

np.max(M,axis=1)/np.sum(M,axis=1)
array([1.  , 0.96, 0.74])

Если вы хотите заключить общее соглашение, вы можете использовать:

from sklearn.metrics import adjusted_rand_score
adjusted_rand_score(labels,clustering.labels_)
0.7436826319432357
0 голосов
/ 16 марта 2020

Почему бы не использовать скорректированный рейтинг рандов для этой цели? Вы можете рассчитать его для каждого кластера и усреднить по кластерам, если хотите. Он игнорирует перестановки, что является преимуществом для вашего приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...