Чтобы наглядно показать особенности и эффективность кросс валидации стоит взглянуть на то как она появилась. То есть вспомнить предшествующие подходы.
Для чего мы вообще разделяем датасет на тренировочный и тестовый?
Модель нужно оценивать, дабы понять на сколько хорошо она работает, если мы обучим модель на всех данных, то мы не узнаем, на сколько хорошо она делает предсказания. Даже если мы потом будем делать тесты на тех же данных, на которых обучилась модель, то она выдаст прекрасный результат, но по сути мы и так знаем значения таргета в имеющихся данных, главная же задача - предсказывать значения целевой переменной на новых данных.
Отсюда вытекает первое правило - модель должна тестироваться на данных, которые она не знает. Это будет гарантировать проверку её реальных способностей.
Есть наблюдения или объекты, которые влияют друг на друга во времени, как погода сегодня влияет на погоду завтра и есть объекты, порядок которых является независимыми - как, например, объявления о продаже автомобилей в Авито.
Рассмотрим вариант, когда каждый объект выборки является независимым друг от друга во времени.
TRAIN/TEST
Одна тренировочная подвыборка и одна тестовая - самое простое и часто используемое решение. Данные разбиваются на две части с выбранным соотношением, типичные из
которых 2/1 или 4/1
Теперь модель проверяется на реальных данных и можно получить более достоверный результат.
Почему более достоверный а не достоверный?
Разберём наглядную ситуацию, когда у нас выборка состоит из 12 красных яблок и 4 зелёных. Модель учиться отделять яблоки красного цвета от зелёного.
Может появиться ситуация, когда в тренировочной выборке окажутся только красные яблоки, а в тестовой - только зелёные.
В таком случае модель не успела познакомиться с отличительными чертами зелёных яблок и на тесте окажется, что модель ничему не научилась.
Именно поэтому данные нужно перемешивать так гораздо больше шансов на то, что целевые признаки будут распределены равномерно и тренировочная и тестовая выборка будут вместе отражать выборку, из которой они были получены.
Вот так была решена проблема неравномерного распределения в данных.
Но всегда есть вероятность неправильного разбиения выборки даже с перемешиванием...
Как нам точно и правильно распределить класс зеленого и красного яблока?
Нужно посчитать количество зелёных и красных яблок, а затем уже в каждом классе сделать разделение на тренировочную и тестовую часть. В данном случае получится два трейн теста - (9/3) красных яблок и (3/1) зелёных.
Вот так, чтобы решить задачу уравнивания классов, стоит просто их подсчитывать и делать мини трейн-тест подвыборку для каждого класса, а потом просто объединить трейны и тесты в итоговую валидационную выборку.
Однако даже если данные были идеально распределены по выборкам, по факту модель предсказывала только 4 определённых яблока из 16. То есть она не пробовала классифицировать остальные 12 вариантов, да так, чтобы она на них не обучалась. За этим скрывается неизвестность. Мы не можем точно говорить, что модель справилась со всеми данными, ведь мы проверили только одну комбинацию.
Вариантом задействования большего количества данных является последовательное перемешивание выборки и обучение, но так нельзя быть на 100% уверенным, что на определенной итерации мы точно испробовали все варианты, поэтому способ ещё и накладный.
Эволюцией этой идеи является кросс-валидация - когда на одном и том же порядке и наборе данных делаются последовательные трейн и тесты. Да таким образом, полученные модели в своей совокупности обучались на всех данных и тестировались тоже на всех данных.
Полное название подхода - k-fold cross-validation. Он подразумевает, что датасет делится на k кусочков, один из которых тестовый, а остальные - тренировочные.
Далее тестовый фолд последовательно меняется местами с фолдами тренировочными таким образом, чтобы были перебранны все возможные местоположения тестового чанка. Всего получается k комбинаций.
На картинке выше k=5. Обучается и тестируется
5 одинаковых моделей, а затем находится среднее их результатов. Все данные были использованы, а средний результат является наиболее точной оценкой модели, подобранной для этих данных.
Если объединить этот подход с уравниванием соотношения трейн-тест для каждого класса, то получится стратифицированная кросс-валидация
Если наш целевой признак - три неравномерно распределённых класса, то применив k-fold кросс валидацию можно увидеть, как как классы в трейнах и тестах будут серьезно варьироваться, где-то вообще не будет одного из классов - следовательно и модели обученные на таких данных будут плохими.
Стратифицированная кросс-валидация разделит выборки сохранив процентное содержание объектов для каждого класса.
Таким образом, стратифицированная кросс-валидация объединяет в себе несколько подходов и является наиболее эффективным методом разбиния датасета для валидации.
В следующей статье я продолжу раскрывать тему валидации и объясню особенности её применения на временных рядах.
Автор: Андрей Епифановский