Ошибка прогноза по фолдам забега

тема: Валидация и переобучение · уровень: средний

Условие

На школьной спартакиаде система прогнозирует время прохождения дистанции участниками. Для проверки качества прогнозов записи разделены на фолды: каждый фолд соответствует отдельной части контрольных данных.

Для каждой дисциплины требуется вычислить среднюю абсолютную ошибку прогноза с учётом размеров фолдов. В некоторых записях фактическое время ещё не известно и обозначено NA. Такие записи не участвуют в расчёте.

Для дисциплины d и фолда f пусть m_f — количество записей этой дисциплины в фолде с известным фактическим временем, а MAE_f — средняя абсолютная ошибка в этом фолде:

MAE_f = (|p_1-a_1| + |p_2-a_2| + ... + |p_m-a_m|) / m_f.

Искомая взвешенная ошибка дисциплины равна

E_d = (m_1 * MAE_1 + m_2 * MAE_2 + ... + m_5 * MAE_5) / (m_1 + m_2 + ... + m_5).

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

В последней строке входа дан запрос из одной или нескольких дисциплин. Для каждой дисциплины запроса требуется вывести её значение E_d в том же порядке.

Формат ввода

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

В следующих n строках записаны пять значений: имя_участника дисциплина фолд прогноз фактическое_время.

имя_участника и дисциплина не содержат пробелов. Поле фактическое_время содержит целое число или строку NA.

В последней строке записаны q названий дисциплин через пробел.

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

Выведите q строк. В строке с номером i выведите взвешенную среднюю абсолютную ошибку для i-й дисциплины запроса.

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

Ограничения

1 ≤ n ≤ 2000.

1 ≤ q ≤ 100.

Номер фолда — целое число от 1 до 5.

Прогноз и известное фактическое время — целые числа от 1 до 36000 секунд.

Длина имени участника — от 1 до 20 символов.

Длина названия дисциплины — от 1 до 20 символов.

Для каждой дисциплины из последней строки существует хотя бы одна запись с этой дисциплиной и известным фактическим временем.

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

Куда дальше