# Specifiy the evaluation function def compute_metrics(eval_pred): logits, labels = eval_pred probs = torch.sigmoid(torch.tensor(logits)).numpy() preds = (probs >= 0.5).astype(int) labels = labels.astype(int) from sklearn.metrics import accuracy_score exact_accuracy = accuracy_score(labels, preds) macro_f1 = f1_score(labels, preds, average="macro", zero_division=0) micro_f1 = f1_score(labels, preds, average="micro", zero_division=0) macro_precision = precision_score(labels, preds, average="macro", zero_division=0) macro_recall = recall_score(labels, preds, average="macro", zero_division=0) per_class_f1 = f1_score(labels, preds, average=None, zero_division=0) per_class_recall = recall_score(labels, preds, average=None, zero_division=0) per_class_precision = precision_score(labels, preds, average=None, zero_division=0) per_class_accuracy = (preds == labels).mean(axis=0) per_class_metrics = {} for i, emotion in enumerate(EMOTION_LABELS): per_class_metrics[f"f1_{emotion}"] = float(per_class_f1[i]) per_class_metrics[f"recall_{emotion}"] = float(per_class_recall[i]) per_class_metrics[f"precision_{emotion}"] = float(per_class_precision[i]) per_class_metrics[f"accuracy_{emotion}"] = float(per_class_accuracy[i]) return { "exact_accuracy": exact_accuracy, "macro_f1": macro_f1, "micro_f1": micro_f1, "macro_precision": macro_precision, "macro_recall": macro_recall, **per_class_metrics, }