Точність підмножини дійсно є суворою метрикою. Щоб зрозуміти, наскільки хороший чи поганий 0,29, є якась ідея:
- подивіться, скільки міток у вас в середньому для кожного зразка
- подивіться угоду між анотаторами, якщо вона є (якщо ні, спробуйте самі побачити, яка точність підмножини отримана, коли ви класифікатор)
- подумайте, чи чітко визначена тема
- подивіться, скільки зразків у вас є для кожної етикетки
Ви також можете обчислити бал забивання, щоб побачити, чи ваш класифікатор не зрозумілий, чи замість цього пристойно хороший, але виправите прогнозування всіх міток правильно. Дивіться нижче, щоб обчислити бальну оцінку.
У той же час, з того, що я розумію, я не можу використовувати scikit.metrics з OneVsRestClassifier, тож як я можу отримати деякі показники (F1, Precision, Recall тощо), щоб зрозуміти, що не так?
Див. Розділ Як обчислити точність / відкликання для класифікації багаторівневих класів? . Я забув, чи підтримує sklearn, я пам'ятаю, що він мав деякі обмеження, наприклад sklearn не підтримує мультимарк для матриці плутанини . Це було б гарною ідеєю побачити ці цифри справді.
Оцінка Хеммінга :
У MultiLabel класифікації настройки, sklearn.metrics.accuracy_score
тільки обчислює точність підмножини (3): тобто безліч міток передбачених для зразка повинен точно відповідати відповідного набору міток в y_true.
Цей спосіб обчислення точності колись названий, можливо, менш неоднозначно, точним співвідношенням відповідності (1):
Ще один типовий спосіб обчислення точності визначений у (1) та (2), і менш неоднозначно його називають шкалою Хеммінга (4) (оскільки він тісно пов'язаний із втратою Хеммінга) або точністю на основі етикетки ). Він обчислюється так:
Ось метод пітона для обчислення оцінки Хеммінга:
# Code by /programming//users/1953100/william
# Source: /programming//a/32239764/395857
# License: cc by-sa 3.0 with attribution required
import numpy as np
y_true = np.array([[0,1,0],
[0,1,1],
[1,0,1],
[0,0,1]])
y_pred = np.array([[0,1,1],
[0,1,1],
[0,1,0],
[0,0,0]])
def hamming_score(y_true, y_pred, normalize=True, sample_weight=None):
'''
Compute the Hamming score (a.k.a. label-based accuracy) for the multi-label case
/programming//q/32239577/395857
'''
acc_list = []
for i in range(y_true.shape[0]):
set_true = set( np.where(y_true[i])[0] )
set_pred = set( np.where(y_pred[i])[0] )
#print('\nset_true: {0}'.format(set_true))
#print('set_pred: {0}'.format(set_pred))
tmp_a = None
if len(set_true) == 0 and len(set_pred) == 0:
tmp_a = 1
else:
tmp_a = len(set_true.intersection(set_pred))/\
float( len(set_true.union(set_pred)) )
#print('tmp_a: {0}'.format(tmp_a))
acc_list.append(tmp_a)
return np.mean(acc_list)
if __name__ == "__main__":
print('Hamming score: {0}'.format(hamming_score(y_true, y_pred))) # 0.375 (= (0.5+1+0+0)/4)
# For comparison sake:
import sklearn.metrics
# Subset accuracy
# 0.25 (= 0+1+0+0 / 4) --> 1 if the prediction for one sample fully matches the gold. 0 otherwise.
print('Subset accuracy: {0}'.format(sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)))
# Hamming loss (smaller is better)
# $$ \text{HammingLoss}(x_i, y_i) = \frac{1}{|D|} \sum_{i=1}^{|D|} \frac{xor(x_i, y_i)}{|L|}, $$
# where
# - \\(|D|\\) is the number of samples
# - \\(|L|\\) is the number of labels
# - \\(y_i\\) is the ground truth
# - \\(x_i\\) is the prediction.
# 0.416666666667 (= (1+0+3+1) / (3*4) )
print('Hamming loss: {0}'.format(sklearn.metrics.hamming_loss(y_true, y_pred)))
Виходи:
Hamming score: 0.375
Subset accuracy: 0.25
Hamming loss: 0.416666666667
(1) Сороуер, Мохаммед С. " Літературне опитування щодо алгоритмів навчання на багато міток ". Орегонський державний університет, Корваліс (2010).
(2) Цумака, Григоріос та Іоанніс Катакіс. " Класифікація мульти-етикетки: огляд ". Кафедра інформатики, Університет Арістотеля в Салоніках, Греція (2006).
(3) Гамраві, Надія та Ендрю Маккаллум. " Колективна багатозначна класифікація ". Матеріали 14-ї міжнародної конференції АСМ з питань управління інформацією та знаннями. ОСБ, 2005.
(4) Годбол, Шантану та Суніта Саравагі. " Дискримінаційні методи для багатозначної класифікації. " Успіхи у відкритті знань та обміні даними. Спрингер Берлін Гейдельберг, 2004. 22-30.