Модель предсказывает время доставки по нескольким числам-весам. Веса эти надо как-то подобрать, а для подбора нужно уметь отвечать на один вопрос: этот набор весов лучше предыдущего или хуже?
На каждом заказе у модели есть промах — разность между её прогнозом и тем, сколько заказ ехал на самом деле. Пока качество описано четырьмя промахами, ответа нет: их надо свести к одному числу, которое можно уменьшать.
Свести можно двумя способами: усреднить квадраты промахов или усреднить их модули. На аккуратных данных обе мерки дают близкие ответы, а на данных с испорченной записью — разные, и от выбора зависит, что модель сочтёт нормой. Сейчас вы увидите это расхождение своими глазами.
Подробно: Ошибка одним числом.
Задание
Напишите три функции.
def mse(y_true, y_pred): # среднее квадратов промахов
...
def mae(y_true, y_pred): # среднее модулей промахов
...
def best_const(data, metric, lo, hi, step):
...
Аргумент metric — это функция, mse или mae. Внутри best_const перебирает значения c от lo до hi с шагом step, для каждого вызывает metric(data, [c] * len(data)) и возвращает то c, при котором мерка наименьшая.
Как проверить себя
Для y_true = [2, 4, 6] и y_pred = [1, 4, 9] промахи равны −1, 0 и +3. Тогда mse даёт 3.3333, а mae — 1.3333.
Дальше примените best_const к пяти замерам времени, где один испорчен: [10.0, 11.0, 12.0, 13.0, 60.0], отрезок от 0 до 70, шаг 0.001. Сравните, что выйдет по mse и что по mae, и подумайте, какое из двух чисел вы показали бы диспетчеру как обычное время поездки.
Числа сравниваются с допуском, а не как строки: достаточно совпадения в первых четырёх знаках. Печатать ничего не надо — функция возвращает значение.