Я пытаюсь рассчитать точность, отзыв и 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 для расчета метрик.
Вы можете использовать функцию 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
Поскольку вы уже используете sklearn, есть ли какая-то конкретная причина избегать встроенной функции F1 score?