Порог прогноза зачётной тридцатки

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

Условие

После школьной спартакиады сохранён файл data.csv с результатами участников забега и прогнозом того, попадёт ли участник в зачётную тридцатку. Прогноз указан в целых процентах: чем он больше, тем вероятнее попадание участника в зачёт.

Для построения бинарного решения выбирается порог t. Участник считается предсказанным в зачётной тридцатке тогда и только тогда, когда forecast_top30 >= t. Строки, в которых прогноз пропущен, полностью исключаются из расчёта.

Качество порога измеряется метрикой F1. Пусть TP — число участников, для которых прогноз и факт равны 1, FP — число участников с прогнозом 1 и фактом 0, FN — число участников с прогнозом 0 и фактом 1. Тогда F1 = 2·TP / (2·TP + FP + FN). Если знаменатель этой дроби равен нулю, значение F1 считается равным 0.

Требуется выбрать из заданного списка порог с наибольшим значением F1. При равенстве наибольших значений F1 выбирается меньший порог. Выводится целое число, округление не применяется.

Формат ввода

Рядом с программой находится файл data.csv в кодировке UTF-8 с разделителем-запятой. Первая строка файла содержит заголовок. В файле имеются столбцы runner_id, grade, time_seconds, actual_top30, forecast_top30.

В stdin в первой строке дано целое число k — количество кандидатов на порог. Во второй строке даны k различных целых чисел t через пробел — кандидаты на порог.

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

Выведите один целый порог из списка кандидатов, для которого значение F1 максимально.

Ограничения

В файле от 300 до 4000 строк с данными, не считая заголовка.

runner_id — строка длиной от 7 до 12 символов. grade — целое число от 7 до 11. time_seconds — целое число от 600 до 2000. actual_top30 равно 0 или 1. forecast_top30 является целым числом от 1 до 99 либо пустой строкой, обозначающей пропуск прогноза.

1 ≤ k ≤ 101. Каждый кандидат на порог является целым числом от 0 до 100. Все кандидаты на порог различны. В файле может быть сколько угодно строк с пропущенным прогнозом, включая все строки.

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

Куда дальше