mlebench/competitions/ranzcr-clip-catheter-line-classification/grade.py (25 lines of code) (raw):
import numpy as np
import pandas as pd
from sklearn.metrics import roc_auc_score
from mlebench.competitions.utils import prepare_for_auroc_metric
from mlebench.grade_helpers import InvalidSubmissionError
from .classes import CLASSES
def grade(submission: pd.DataFrame, answers: pd.DataFrame) -> float:
for class_name in CLASSES:
assert class_name in answers.columns, f"Missing class {class_name} in answers."
if class_name not in submission.columns:
raise InvalidSubmissionError(f"Class {class_name} is not in the submission.")
assert len(submission) == len(
answers
), f"Expected {len(answers)} rows in submission, got {len(submission)}."
roc_auc_scores = []
for class_name in CLASSES:
roc_auc_inputs = prepare_for_auroc_metric(
submission=submission,
answers=answers,
id_col="StudyInstanceUID",
target_col=class_name,
)
roc_auc_scores.append(roc_auc_score(roc_auc_inputs["y_true"], roc_auc_inputs["y_score"]))
score = np.average(roc_auc_scores)
return score