Вычисление точности, отзыва и оценки F1 для каждого класса в задаче классификации с несколькими метками

Я пытаюсь рассчитать точность, отзыв и F1-Score для каждого класса в моей задаче классификации с несколькими метками. Однако я думаю, что делаю что-то не так, потому что я получаю очень высокие значения, а оценка F1 для всей проблемы составляет 0,66. Тем не менее, я получаю +0,8 f1 в индивидуальных классах.

Вот как я это делаю прямо сейчас:

confusion_matrix = multilabel_confusion_matrix(gold_labels, predictions)

assert(len(confusion_matrix) == 6)

for label in range(len(labels_reduced)):

    tp = confusion_matrix[label][0][0]
    fp = confusion_matrix[label][0][1]
    fn = confusion_matrix[label][1][0]
    tn = confusion_matrix[label][1][1]

    precision = tp+fp
    precision = tp/precision

    recall = tp+fn
    recall = tp/recall

    f1_score_up = precision * recall
    f1_score_down = precision + recall
    f1_score = f1_score_up/f1_score_down
    f1_score = 2 * f1_score

    print(f"Metrics for {labels_reduced[label]}.")
    print(f"Precision: {precision}")
    print(f"Recall: {recall}")
    print(f"F1-Score: {f1_score}")

Эти результаты в порядке? Имеют ли они смысл? Я делаю что-то неправильно? Как бы вы рассчитали эти показатели? Я использую трансформеры Huggingface для загрузки моделей и получения прогнозов, а также sklearn для расчета метрик.

Поскольку вы уже используете sklearn, есть ли какая-то конкретная причина избегать встроенной функции F1 score?

LazyClown 06.11.2022 16:40
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
82
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать функцию Classification_report из sklearn:

from sklearn.metrics import classification_report

labels = [[0, 1, 1], [1, 0, 0], [1, 0, 1]]
predictions = [[[0, 0, 1], [1, 0, 0], [1, 1, 1]]

report = classification_report(labels, predictions)
print(report)

Что выводит:

              precision    recall  f1-score   support

           0       1.00      1.00      1.00         2
           1       0.00      0.00      0.00         1
           2       1.00      1.00      1.00         2

   micro avg       0.80      0.80      0.80         5
   macro avg       0.67      0.67      0.67         5
weighted avg       0.80      0.80      0.80         5
 samples avg       0.89      0.83      0.82         5

Другие вопросы по теме