Macro-F1 для категорий поездок велопроката

тема: Метрики классификации · уровень: продвинутый

Условие

Система городского велопроката относит каждую завершённую поездку к одной из трёх категорий длительности: short, regular или long. Для набора поездок известна настоящая категория и результат модели.

Иногда модель не смогла выдать категорию. В этом случае во втором столбце записан символ -. Такая запись считается ошибкой: она увеличивает FN настоящего класса, но не увеличивает FP ни одного класса.

Для каждого класса c определяются значения TP_c, FP_c, FN_c. Значение F1 класса равно F1_c = 2 * TP_c / (2 * TP_c + FP_c + FN_c). Если знаменатель этой дроби равен нулю, значение F1_c считается равным нулю. Требуется вычислить метрику macro-F1: (F1_short + F1_regular + F1_long) / 3.

При равенстве значений F1 у классов никакой класс не выбирается: в среднее включаются все три значения.

Формат ввода

В первой строке дано целое число n — количество поездок.

В следующих n строках записаны два значения через пробел: настоящая категория поездки actual и категория, предсказанная моделью predicted.

actual всегда равна одной из строк short, regular, long. Значение predicted равно одной из этих строк или -.

Формат вывода

Выведите одно число — значение macro-F1 с тремя знаками после десятичной точки.

Округление выполняется до ближайшего значения с тремя знаками после точки. Если следующее отброшенное значение ровно посередине, округление выполняется в большую сторону.

Ограничения

1 <= n <= 4000.

Длина каждой категории составляет от 1 до 7 символов, длина обозначения пропуска равна 1 символу.

Количество строк с пропущенным предсказанием может быть от 0 до n.

Решить задачу с автопроверкой на Python →

Куда дальше