Тема 7. Оценка и выбор моделей
В темах 4 и 5 мы научились строить классификаторы и регрессоры, а в теме 3 — корректно разбивать данные и сравнивать модель с базовой стратегией. Когда задача проста и данных много, схема «обучили — посмотрели на тесте» работает безотказно. Но как только мы беремся всерьёз сравнивать несколько алгоритмов, подбирать гиперпараметры или собирать ансамбль, простая проверка на одном отложенном множестве начинает обманывать. Цифры на тестовой выборке скачут от запуска к запуску, и неясно, отражает ли это реальную разницу моделей или случайность разбиения.
Эта тема — про то, как получать оценки качества, которым можно верить, и как на их основе принимать решения: какие гиперпараметры выбрать, какую модель оставить, имеет ли смысл переходить к ансамблю. Мы введём кросс-валидацию как способ снизить разброс оценки, рассмотрим стратегии подбора гиперпараметров и разберём три ансамблевых семейства — бэггинг, бустинг и стэкинг, — которые лежат в основе подавляющего большинства побед на табличных задачах за последние двадцать лет.
Проблема надёжной оценки
Почему test set недостаточен
Стандартное разбиение «обучение — валидация — тест», описанное в теме 3, исходит из идеализированного предположения: тестовая выборка достаточно велика и репрезентативна, чтобы оценка на ней служила прокси истинного риска. На умеренных по размеру датасетах это предположение трещит сразу с двух сторон.
Первая проблема — зависимость метрики от конкретного разбиения. Возьмём набор из тысячи примеров, выделим 20% в тест, обучим модель и получим accuracy 0.87. Перемешаем данные, повторим — получим 0.84. Снова — 0.89. Размах в три-пять процентных пунктов на маленьких выборках — норма, а не исключение, и для дисперсии оценки accuracy через биномиальное приближение получим , что при и даёт стандартное отклонение около 0.024. Доверительный интервал шириной в пять процентных пунктов перекрывает разницу между большинством разумных моделей: «бустинг лучше леса на два пункта» в таких условиях статистически неотличимо от шума.
Вторая проблема тоньше и опаснее. Когда исследователь сравнивает на одной и той же тестовой выборке десяток моделей, выбирает лучшую и отчитывается её метрикой, он совершает то, что в литературе называют подглядыванием в тест (англ. test set peeking) или, более формально, множественной проверкой гипотез на одной выборке. Чем больше моделей мы пробуем, тем выше вероятность, что одна из них окажется лучше остальных по чистой случайности; и заявленная для победителя метрика будет систематически завышена. Эффект называют оптимистическим смещением оценки. Тестовая выборка перестаёт быть тестовой не только когда мы дообучаем модель на её основе, но и когда мы используем её для выбора модели среди многих.
Логический выход — отделить выборку, по которой мы сравниваем модели, от выборки, на которой меряем итоговое качество. Но если данных мало, заводить три отдельных множества (обучение, валидация, тест) уже расточительно, и валидационная часть оказывается слишком маленькой, чтобы давать стабильную оценку. Этой проблеме посвящена кросс-валидация.
Кросс-валидация
Идея кросс-валидации — переиспользовать обучающие данные для оценки качества за счёт многократного повторного разбиения. Вместо того чтобы один раз выделить валидационную часть, мы делаем это раз, каждый раз по-новому, и усредняем результат 1.
В самой распространённой схеме — K-fold кросс-валидации — обучающая выборка разбивается на непересекающихся блоков (англ. folds) приблизительно равного размера. В -й итерации -й блок служит валидационным множеством, а оставшиеся блоков — обучающим. Модель переобучается заново на каждой итерации, метрика вычисляется на отложенном блоке, и финальная оценка — это среднее по значениям: где — модель, обученная без -го блока, а — этот блок целиком.
Выбор — это компромисс. При обучающее множество на каждой итерации составляет 80% исходных данных, что близко к будущей модели, обученной на полной выборке; вычислительные затраты — пятикратные. При оценка чуть точнее, обучающая выборка ещё ближе к полной, но вычислений вдвое больше. В подавляющем большинстве задач выбирают или ; первое значение — для быстрых прототипов, второе — для итоговых сравнений.
Предельный случай называется leave-one-out кросс-валидацией: в каждой итерации проверяется ровно один объект, а обучается модель на объекте. Это статистически почти несмещённая оценка истинного риска, но у неё два изъяна. Вычислительный — -кратное обучение редко оправдано: модель в каждой итерации почти идентична, а усреднение почти -кратно дублирует одни и те же предсказания. Статистический — высокая дисперсия оценки: предсказания разных итераций сильно коррелированы между собой, потому что обучающие выборки почти совпадают; усреднение коррелированных величин снижает дисперсию слабее, чем некоррелированных. Leave-one-out оправдан только для очень маленьких выборок () или для моделей, у которых leave-one-out оценка получается аналитически без переобучения, — например, для линейной регрессии через формулу PRESS.
Для классификации с несбалансированными классами обычное K-fold может оставить в некоторых блоках непредставительное число примеров миноритарного класса. Решение — стратифицированная K-fold (англ. stratified K-fold): разбиение, сохраняющее пропорции классов в каждом блоке. Принцип тот же, что и со стратификацией при простом train/test split в теме 3, просто распространённый на все блоков сразу.
Что мы получаем на выходе — это не одно число, а значений метрики. Их статистическое описание содержательнее, чем точечная оценка: рядом со средним всегда сообщается выборочное стандартное отклонение , а различие двух моделей оценивается через в сравнении с . Если разница меньше стандартной ошибки разности — выбор между моделями статистически не подтверждён, и решающим аргументом становятся вторичные факторы: интерпретируемость, скорость инференса, потребление памяти.
Кросс-валидацию допустимо вкладывать в более крупный пайплайн, но при этом сохраняется главный принцип темы 3: тестовая выборка остаётся неприкосновенной. Кросс-валидация заменяет валидационную часть и обслуживает выбор модели; финальное число — accuracy, , RMSE — всегда сообщается на отдельно отложенной тестовой части. Если же тестовой части нет (всё ушло в кросс-валидацию), сравнивать модели можно, но итоговая метрика модели-победителя завышена ровно настолько, насколько мы её выбирали по этим же значениям.
Настройка гиперпараметров
Подбор гиперпараметров
Различение параметров и гиперпараметров — методологическая граница, проходящая ровно по линии «что обновляет оптимизатор и что задаётся снаружи». Параметры модели — коэффициенты линейной регрессии, веса в нейронной сети, разбиения признаков в дереве — оптимизируются процедурой обучения по обучающей выборке. Гиперпараметры (англ. hyperparameters) — глубина дерева, коэффициент регуляризации , число соседей в kNN, шаг обучения , число деревьев в ансамбле — задаются до запуска обучения и определяют его поведение. Алгоритм обучения не оптимизирует гиперпараметры; их подбирают внешней процедурой, обычно через перебор и оценку на отложенных данных.
Простейший подход к подбору — поиск по сетке (англ. grid search). Для каждого гиперпараметра задаётся конечный список значений, образующих сетку в их совместном пространстве; для каждой точки сетки модель обучается и оценивается кросс-валидацией; победитель выбирается по среднему значению метрики. Если у нас три гиперпараметра по пять значений каждый, сетка содержит 125 точек, и при 5-fold кросс-валидации это 625 обучений модели. Подход прозрачен, легко параллелится и даёт исчерпывающий обзор сетки.
Проблема grid search обнаруживается, когда гиперпараметров становится много. Перебор по измерениям с значениями в каждом даёт точек — экспоненциальный рост, известный как «проклятие размерности». На практике из десятка гиперпараметров обычно по-настоящему чувствительны два-три, остальные слабо влияют на качество; но grid search этого не знает и тратит вычислительный бюджет равномерно.
Случайный поиск (англ. random search) предлагает альтернативу: вместо сетки задаются распределения значений каждого гиперпараметра, и из них независимо выбираются точек. Бергстра и Бенжио в работе 2 показали, что при ограниченном числе попыток случайный поиск стабильно даёт результаты не хуже, а часто лучше grid search, и объяснили это просто. Если по двум измерениям обходить сетку , то по каждому отдельному гиперпараметру мы пробуем всего 5 уникальных значений (повторяющихся 5 раз). Если те же 25 попыток распределить случайно, каждое измерение «опросится» в 25 уникальных точках. Когда один из гиперпараметров заметно важнее остальных, случайный поиск лучше его исследует — и шансы попасть в окрестность оптимума выше.
На практике типичная стратегия — grid search для одного-двух гиперпараметров с малым числом разумных значений и random search для остальных. Поверх этого существуют более изощрённые методы: байесовская оптимизация, основанная на построении вероятностной модели зависимости метрики от гиперпараметров, и эволюционные алгоритмы. Они дают преимущество при дорогих обучениях (нейронные сети с многочасовой эпохой), но для классических табличных моделей выгоды от перехода обычно скромные, а сложность реализации заметна — в курсе мы ограничимся grid и random search.
Отдельный сюжет — корректное оценивание модели после подбора гиперпараметров. Если на одних и тех же данных мы и подбираем гиперпараметры, и сообщаем итоговую метрику, то полученная цифра систематически завышена: гиперпараметры выбраны так, чтобы метрика была максимальной, и часть прироста объясняется удачей перебора, а не реальным качеством. Этот эффект описывают как множественную проверку гипотез на одной выборке, и он тем сильнее, чем больше комбинаций гиперпараметров мы пробовали.
Корректное решение — вложенная кросс-валидация (англ. nested cross-validation). Внешний цикл K-fold отвечает за оценку: он разбивает данные на обучающую и тестовую части (в смысле этой итерации). Внутри каждой обучающей части запускается свой K-fold для подбора гиперпараметров. Победившая комбинация переобучается на полной обучающей части итерации и оценивается на тестовой. Метрика модели — среднее по внешним итерациям. Цена — кратное увеличение вычислений: 5-fold снаружи × 5-fold внутри × 20 комбинаций даёт 500 обучений. Зато оценка не смещена выбором гиперпараметров.
В прикладной работе вложенную кросс-валидацию запускают редко — чаще ограничиваются обычной CV для подбора и заранее отложенной тестовой выборкой для финальной оценки. Это компромисс: тестовая выборка не участвует в подборе и даёт несмещённую оценку, но её мало (одно разбиение, а не среднее по нескольким), поэтому погрешность самой оценки выше. Вложенная CV нужна, когда финальное число важно с точностью до полупроцента и когда тестовой выборки выделить нельзя.
Ансамблевые методы
Идея ансамбля (англ. ensemble) — объединить предсказания нескольких моделей в одно, обычно более точное. Логика проста: если разные модели делают разные ошибки и эти ошибки слабо коррелированы, усреднение или голосование снизит общую ошибку без увеличения смещения. Декомпозиция смещения и разброса из темы 3 даёт этому строгое объяснение: ансамбль уменьшает компоненту разброса при сохранении компоненты смещения, и тестовая ошибка падает.
Три семейства ансамблей покрывают почти все практические случаи: бэггинг строит независимые модели на бутстрэп-выборках, бустинг строит модели последовательно с фокусом на ошибках предыдущих, стэкинг учит метамодель комбинировать предсказания разнородных моделей.
Бэггинг
Бэггинг (англ. bootstrap aggregating, bagging) 3 строит моделей, каждая — на собственной случайной выборке, полученной бутстрэпом (англ. bootstrap) из исходных данных: объектов выбираются с возвращением, так что некоторые попадают в выборку несколько раз, а часть (в среднем около 37% при больших ) не попадает вовсе. Эти невыбранные объекты называют out-of-bag (OOB) и используют для оценки качества без отдельной валидационной выборки.
Для регрессии предсказания моделей усредняются, для классификации — голосуют большинством. Математически усреднение независимых одинаково распределённых случайных величин с дисперсией даёт дисперсию . Реальные модели не независимы — они обучены на пересекающихся бутстрэп-выборках, — поэтому при средней корреляции между предсказаниями дисперсия усреднённого предсказания равна . Первое слагаемое не падает с ростом ; второе — падает. Отсюда вывод: бэггинг эффективен ровно настолько, насколько модели в ансамбле декоррелированы.
Бэггинг даёт максимальный выигрыш с моделями высокого разброса — теми, что сильно меняются при небольшом изменении обучающей выборки. Классический пример — глубокие деревья решений. Одно глубокое дерево переобучается, его accuracy скачет от выборки к выборке. Усредняя сотню таких деревьев, мы снимаем разброс, не теряя смещения: каждое дерево по-прежнему способно ухватить сложную зависимость, но усреднение гасит индивидуальные особенности.
Знаменитое развитие идеи — случайный лес (англ. random forest) @breiman2001rf. К бутстрэпу строк добавляется случайный выбор признаков: при каждом разбиении в каждом дереве алгоритм рассматривает не все признаков, а случайное подмножество размера (типичные значения — для классификации, для регрессии). Это вторая ось рандомизации; она дополнительно декоррелирует деревья и обычно даёт существенный прирост по сравнению с обычным бэггингом деревьев.
В практическом отношении случайный лес — образцовый baseline для табличных задач: на классических бенчмарках он часто проигрывает градиентному бустингу всего несколько процентных пунктов, при этом почти не требует настройки. Разумные значения по умолчанию (300–500 деревьев, , без ограничения глубины) во многих задачах работают сразу из коробки, а out-of-bag оценка качества даёт «бесплатную» кросс-валидацию.
Бустинг
Бустинг (англ. boosting) строит ансамбль последовательно: каждая следующая модель пытается исправить ошибки предыдущих. Исходная идея, восходящая к работам Шапира конца 1980-х, доказала фундаментальный факт: семейство слабых классификаторов, каждый из которых лишь немного лучше случайного угадывания, можно объединить в произвольно сильный @schapire1990boosting. Это теоретическое открытие — одно из ключевых в теории машинного обучения.
Первой работающей реализацией стал AdaBoost: после обучения очередного слабого классификатора веса неправильно классифицированных объектов увеличиваются, веса правильно классифицированных — уменьшаются, и следующий классификатор обучается на этом перевзвешенном распределении. Финальное предсказание — взвешенное голосование классификаторов, где вес каждого пропорционален его точности. Прорывом этого подхода была не только эффективность, но и устойчивость к переобучению на средних задачах — феномен, противоречивший интуиции и потребовавший отдельной теории.
Современный взгляд на бустинг сформировал Фридман: он переформулировал процедуру как градиентный спуск в функциональном пространстве 4. Идея состоит в следующем. Пусть мы хотим минимизировать функцию потерь по функции (а не по конкретным параметрам). Шаг градиентного спуска в обычной оптимизации — . Перенесём это в функциональное пространство: на каждом шаге вычисляем «псевдо-остаток» — отрицательный градиент потерь по предсказанию текущего ансамбля, обучаем новое дерево предсказывать эти остатки, добавляем его с шагом к ансамблю:
Для квадратичной функции потерь отрицательный градиент равен — обычным остаткам регрессии. Поэтому простейший случай бустинга — «деревья, обучающиеся предсказывать остатки предыдущих». Каждое дерево добавляет в ансамбль ту часть зависимости, которую предыдущие не объяснили.
Гиперпараметры градиентного бустинга образуют связанный набор. Скорость обучения (англ. learning rate) умножает вклад каждого дерева; при меньшем ансамбль учится медленнее, но обычно достигает лучшего качества при большем числе деревьев. Число деревьев напрямую регулирует сложность ансамбля; при слишком большом возникает переобучение, поэтому обычно выбирается по валидации с ранней остановкой (англ. early stopping) — остановкой обучения при ухудшении валидационной метрики. Глубина деревьев контролирует выразительность каждого слабого ученика: обычно , более глубокие деревья учат сложные взаимодействия, но дают больше переобучения. Эти три гиперпараметра подбираются совместно: типичная связка — небольшой , большое с ранней остановкой, умеренное .
Современные реализации градиентного бустинга — XGBoost 5 и LightGBM 6 — добавляют к классической схеме несколько улучшений. XGBoost использует расширенную регуляризацию (штрафы за число листьев и за величину предсказаний в листьях), точное вычисление производных второго порядка для шага обучения и оптимизации для разреженных данных. LightGBM применяет иную стратегию построения дерева — выращивание по листу с максимальным приростом качества, а не по уровню, — и гистограммную аппроксимацию для ускорения. На практике обе библиотеки на одинаковых данных дают сопоставимое качество, и выбор между ними часто определяется тем, что уже стоит в проекте и насколько быстро нужно обучаться: LightGBM обычно быстрее на больших датасетах, XGBoost — стабильнее по гиперпараметрам и лучше документирован для начинающих.
Сравнение бэггинга и бустинга по логике их работы фиксируется в нескольких пунктах. Бэггинг строит модели параллельно, бустинг — последовательно. Бэггинг снижает разброс, не трогая смещения; бустинг снижает и смещение, и разброс, но рискует переобучиться при избытке шагов. Бэггинг работает с моделями высокого разброса (глубокие деревья), бустинг — со слабыми моделями высокого смещения (мелкие деревья глубины 3–8). Бэггинг почти не требует настройки и устойчив к гиперпараметрам, бустинг сильно зависит от связки , и , и его подбор — основная статья расходов на гиперпараметрический поиск.
В практической дилемме «случайный лес или градиентный бустинг» однозначного ответа нет. На однородных табличных данных среднего размера, без жёстких ограничений по времени обучения, бустинг обычно даёт лучший результат на 1–3 процентных пункта. На задачах с большим числом шумных признаков, где требуется устойчивость, и при минимальном бюджете на настройку, выигрывает лес. И, как обсуждалось в теме 3, разница в 1–2 пункта при неустойчивой оценке статистически слаба, а сложность сопровождения у бустинга выше — поэтому начало проекта почти всегда с леса, а переход к бустингу — обоснованное решение по результатам анализа метрик.
Стэкинг
Стэкинг (англ. stacking) @wolpert1992stacked — третий путь к ансамблю, методологически отличный от бэггинга и бустинга. Вместо того чтобы соединять однотипные модели простым усреднением или голосованием, стэкинг обучает метамодель (англ. meta-learner), которая использует предсказания базовых моделей как признаки. Иерархия двухуровневая: на нижнем уровне (level-0) работают разнородные модели — например, случайный лес, градиентный бустинг, логистическая регрессия и k-NN; на верхнем уровне (level-1) метамодель учится оптимально комбинировать их выходы.
Принципиальный момент — как получать обучающие данные для метамодели. Если просто обучить базовые модели на полной выборке и взять их предсказания на ней же, метамодель обучится на сильно переобученных предсказаниях: для тренировочных объектов базовые модели часто почти безошибочны, а на новых объектах будут ошибаться, и метамодель не научится корректно их комбинировать. Корректная процедура — генерировать предсказания базовых моделей через кросс-валидацию: для каждого блока кросс-валидации базовые модели обучаются на остальных блоках, и их предсказания для текущего блока становятся признаками метамодели. После обучения на этих cross-validated предсказаниях метамодель применяется к новым данным, для которых базовые модели уже обучены на полной выборке.
В качестве метамодели обычно берут простую: линейная или логистическая регрессия. Усложнённая метамодель часто переобучается на относительно небольшом наборе признаков (всего по одному значению от каждой базовой модели), и выигрыш от её гибкости съедается потерей качества. Логистическая регрессия с регуляризацией — стандартный выбор, дающий интерпретируемые веса базовых моделей.
Когда стэкинг работает лучше отдельных моделей? Когда базовые модели делают разные ошибки. Если случайный лес ошибается на одном подмножестве объектов, а градиентный бустинг — на другом, метамодель научится опираться на каждую модель там, где она сильна. Если же все базовые модели ошибаются на одних и тех же сложных примерах (что часто бывает с однотипными ансамблями деревьев), стэкинг даст микроскопический прирост и не оправдает усложнения пайплайна.
Практический баланс таков: стэкинг — инструмент финальной полировки качества в задачах, где значимы доли процентного пункта (соревнования, продакшен с большими ставками). Для прикладных проектов с разумным бюджетом обычно достаточно одной хорошо настроенной модели — случайного леса или градиентного бустинга. Сложность пайплайна, требования к воспроизводимости, риск ошибок в кросс-валидации генерируемых признаков — всё это делает стэкинг инструментом не первого выбора. Но как идея — комбинирование разнородных моделей через обучаемую метамодель — стэкинг прочно прописан в инструментарии прикладного машинного обучения.
Литература
- Kohavi R. A Study of Cross-Validation and Bootstrap for Accuracy Estimation and Model Selection. — Proceedings of the 14th International Joint Conference on Artificial Intelligence (IJCAI), 1995, С. 1137–1143.
- Bergstra J., Bengio Y. Random Search for Hyper-Parameter Optimization. — Journal of Machine Learning Research, 2012, С. 281–305, https://jmlr.org/papers/v13/bergstra12a.html.
- Breiman L. Bagging Predictors. — Machine Learning, 1996, С. 123–140, DOI: 10.1007/BF00058655.
- Friedman J. H. Greedy Function Approximation: A Gradient Boosting Machine. — The Annals of Statistics, 2001, С. 1189–1232, DOI: 10.1214/aos/1013203451.
- Chen T., Guestrin C. XGBoost: A Scalable Tree Boosting System. — Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining, 2016, С. 785–794, DOI: 10.1145/2939672.2939785.
- Ke G., Meng Q., Finley T., Wang T., Chen W., Ma W., Ye Q., Liu T. LightGBM: A Highly Efficient Gradient Boosting Decision Tree. — Advances in Neural Information Processing Systems 30 (NIPS 2017), 2017, С. 3146–3154.