Python precision_check, дающий 0 результатов для перевернутой классификации - PullRequest
3 голосов
/ 23 сентября 2019

Я использую accuracy_check из sklearn.metrics

Моя маркировка данных классификационного теста, например, для

[1 1 0 0 0 1 1]

, и Kmeans дает метки как

[0 0 1 1 1 0 0]

В основном Kmeans классифицировал правильно, но перевернул ярлыки.accuracy_check дает 0% точности.

Мой код

X_full, y_full = make_blobs(n_samples=nsamples,
                            centers=2,
                            n_features=no_feat,
                            random_state=ran)

X, X_test, y, y_test = train_test_split(X_full, y_full, test_size=0.2)

kmeans = KMeans(2, random_state=3)
labels = kmeans.fit(X).predict(X_test)
acc = accuracy_score(y_test, labels)
print("KMeans:", acc)

Любые идеи о том, как это реализовать?

Редактировать: Также я не могу просто перевернуть ярлыки,потому что иногда это правильно классифицировать.И в других случаях у меня есть несколько ярлыков.

Спасибо

Ответы [ 2 ]

3 голосов
/ 24 сентября 2019

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

from sklearn.metrics.cluster import adjusted_rand_score

print(adjusted_rand_score([0, 0, 1, 1], [0, 0, 1, 1]))
print(adjusted_rand_score([0, 0, 1, 1], [1, 1, 0, 0]))

Оба должны возвращать 1,0

1 голос
/ 24 сентября 2019

Можете ли вы попробовать что-то кроме показателя точности?

Например, вы можете попробовать v_measure_score вместо accuracy_score.

Согласно документации

Этот показатель не зависит от абсолютных значений меток: перестановка значений меток класса или кластера никак не изменит значение оценки.

...