Чем плоха проверка на тех же данных
Допустим, подобранные веса предсказывают время на всех вчерашних заказах с точностью до минуты. Значит ли это, что завтра модель сработает?
Не значит ничего. Вчерашние ответы можно просто запомнить, особенно если параметров у модели много, а заказов мало.
Так работает подготовка к экзамену по решебнику: на знакомых задачах сто процентов, на новой ноль. Только цена ошибки здесь другая: приложение обещает пользователю двадцать минут, а курьер приезжает через пятьдесят.
Чтобы отличить «нашли правило» от «запомнили ответы», часть данных откладывают и модели не показывают вовсе.
Три части выборки
Обобщение — способность модели работать на данных, которых она не видела. Ради него всё и делается: высокая точность на данных, по которым подбирались веса, сама по себе не стоит ничего.
Данные делят на три части:
- обучающая выборка, train — по ней подбираются веса;
- проверочная выборка, validation — по ней выбирают, сколько слоёв взять, какой сделать шаг обучения, когда остановиться;
- тестовая выборка, test — открывается один раз, когда все решения уже приняты.
Зачем нужна отдельная проверочная часть. Если выбирать число слоёв по тестовой выборке, то тест превращается во вторую обучающую: каждый взгляд на него и каждое решение, принятое по его результату, — это подгонка под него. Честной оценки после этого не остаётся ни одной.
Тест открывают один раз.
Как делят
Типичные доли — 70, 15 и 15 процентов. Для 5000 заказов это 3500, 750 и 750.
Перед делением номера заказов перемешивают. Без перемешивания в тест попадут только заказы последнего дня, и модель будет оценена по одной погоде и одному дню недели.
Генератор случайных чисел при этом запускают с явно заданным начальным значением. Иначе каждый запуск даёт другое разбиение, и два своих же эксперимента становится не с чем сравнивать.
Сразу после деления полезно проверить две вещи: что сумма размеров трёх частей равна исходному числу заказов и что пересечения между частями пусты. Обе проверки пишутся в две строки, и писать их стоит заранее, а не когда результат покажется подозрительным.
Утечка данных
Утечка — попадание в подбор весов информации из тестовой выборки. Модель при этом показывает хороший результат на тесте и проваливается в работе, а причину найти трудно, потому что формально всё выглядело правильно.
Самая частая утечка — посчитать среднее и разброс по всем данным, а разделить их потом. Выглядит безобидно, но среднее теперь знает про тестовые заказы.
Проверим на десяти заказах с временем доставки 12, 15, 18, 20, 22, 25, 28, 30, 35 и 40 минут.
Таблица 14. Среднее по всем данным и по обучающей части
| по чему считаем | среднее время, минут |
| по всем десяти заказам | 24.5 |
| по первым семи (обучающая часть) | 20 |
Сравниваем две строки: числа разные, разница четыре с половиной минуты. Значит, нормируя по всем данным, вы сообщаете модели кое-что о заказах, которых она видеть не должна.
Другие частые утечки: не убрать полные дубликаты строк до деления, из-за чего один и тот же заказ оказывается и в обучающей, и в тестовой части; и подбирать настройки по тесту, потому что проверочная часть показалась маленькой.