2017-02-21 22 views
0

После многочисленных попыток я не могу понять, как можно восстановить метрики классов от precision_recall_fscore_support возвращаемых значений.Не удается определить упорядочение классов в значениях возвращаемых значений precision_recall_fscore_support в scikit-learn

Например, учитывая этот классический контекст обучения:

target_names = set(y) 
y = [target_names.index(x) for x in y] 
X_train, X_test, y_train, y_test = train_test_split(X, y) 

# Some classification ... 

y_pred = clf.predict(X_test) 
precision, recall, f1, support = precision_recall_fscore_support(y_test, y_pred) 

Здесь len(set(y_test)) == len(support) так я представляю себе, что все классы, присутствующие в y_test присутствуют в возвращаемых значений. Но я не могу найти способ, которым они упорядочены, поэтому я могу восстановить, какие показатели соответствуют классу.

Благодарим за помощь!

ответ

1

Этикетки в отсортированном виде. Quoting the documentation: -

По умолчанию, все метки в y_true и y_pred используются в отсортированном порядке

Порядок классов решается параметром labels в precision_recall_fscore_support. Если не указано иное, то поведение по умолчанию - собирать все классы в y_pred и y_true и упорядочиваться в отсортированном порядке.

документация Пример:

y_true = np.array(['cat', 'pig', 'dog', 'cat', 'dog', 'pig']) 
y_pred = np.array(['cat', 'dog', 'pig', 'cat', 'cat', 'dog']) 

precision_recall_fscore_support(y_true, y_pred) 

Выход:

(array([ 0.66666667, 0.  , 0.  ]), 
array([ 1., 0., 0.]), 
array([ 0.8, 0. , 0. ]), 
array([2, 2, 2])) 

выше кортеж имеет 4 массивов (точность, напомним, f_score и поддержка) и каждый массив имеет 3 элемента, по одному для «кошки ',' собака 'и' свинья '. (Как вы сами можете рассчитать, что показатели расположены в соответствии с отсортированными классами «кот», «собака», «свинья»).

Даже если изменить порядок ярлыков здесь: -

y_true = np.array(['cat', 'dog', 'pig', 'cat', 'dog', 'pig']) 
y_pred = np.array(['cat', 'pig', 'dog', 'cat', 'cat', 'dog']) 

выход будет так же: -

(array([ 0.66666667, 0.  , 0.  ]), 
array([ 1., 0., 0.]), 
array([ 0.8, 0. , 0. ]), 
array([2, 2, 2])) 

То же самое происходит, если y имеют числовые значения.

Надеюсь, что это очистит ваши сомнения. Не стесняйтесь задавать любые сомнения.