Переобучение в машинном обучении и глубоком обучении - распространенная проблема. Это результат того, что модель не обобщает данные и, как таковая, имеет высокую дисперсию. В этой статье мы рассмотрим несколько распространенных способов уменьшения переобучения.
Мы будем использовать некоторые из наиболее распространенных решений по переобучению, используя sci-kit learn и примеры кода Tensorflow.
Решения высокого уровня для переобучения
- Уменьшить сложность модели
- Регуляризация (корректировка весов)
- Ансамблевые модели
- Ранняя остановка
- Больше данных
- Перекрестная проверка
Уменьшить сложность модели
Сложность модели можно уменьшить, применив приведенное ниже к модели машинного и глубокого обучения соответственно:
- Drop Features / уменьшение размерности (с использованием PCA)
- Отбросьте нейроны (используя Drop Layers)
Самый противоречивый способ перестать переобучать модель - уменьшить ее сложность. Это можно сделать несколькими способами, но самый простой - просто отказаться от некоторых функций!
Теперь ты говоришь мне, что я сумасшедший! Разве больше информации не лучше?
В общем, вы были бы правы; функции, которые коррелируют с целью и предоставляют дополнительную информацию пространству функций, помогут повысить точность моделей или уменьшить погрешность. Однако некоторые функции могут иметь информацию, представленную в другой функции, или они просто не влияют на цель. Таким образом, мы можем удалить повторяющиеся функции или те, которые имеют низкую (или нулевую) корреляцию с целью.
Это можно сделать вручную методом проб и ошибок, отбросив функции, которые имеют одинаковую информацию, или проанализировав их корреляции, однако для этого требуется глубокое знание данных.
«Автоматический» процесс уменьшения размеров / характеристик может быть выполнен с помощью алгоритма контролируемого машинного обучения Анализ главных компонентов (PCA).
Для глубокого обучения у нас есть дополнительные возможности к вышеупомянутому, используя Dropout Layers. Что, как следует из названия, отбрасывает случайный% нейронов от использования в каждом прогоне (эпохе).
Регуляризация
Регуляризация - это практика манипулирования коэффициентами или весами входных данных.
Есть много способов сделать это, при этом некоторые модели построены для включения регуляризации по умолчанию, например, модели регрессионного машинного обучения; LASSO (регуляризация L1) и Ridge (регуляризация L2).
- Регуляризация L1 - пытается ограничить веса / коэффициенты признаков до нуля (но не совсем нуля).
- Регуляризация L2 - пытается установить некоторые веса равными нулю, что исключает эти особенности из процесса прогнозирования.
Дополнительный процесс глубокого обучения для регуляризации использует class_weight, который задается при подборе модели.
Ансамбль
Интересный способ преодолеть переоснащение - использовать ансамблевые модели, которые берут модели «слабого ученика» и объединяют их для создания «супер» модели. Это можно сделать тремя способами:
- Бэггинг - однородные модели запускаются параллельно.
- Повышение - однородные модели запускаются в сериях
- Стекирование - сочетание разнородных моделей
Сбор данных - это процесс прогнозирования целевой переменной с использованием нескольких похожих моделей, параллельно и усреднения отдельных прогнозов для формирования окончательного прогноза. Примером этого является модель случайного леса, в которой несколько «более слабых» деревьев решений запускаются параллельно, а полученные результаты усредняются для формирования прогноза.
Повышение аналогично пакетированию, однако модели запускаются линейно (последовательно), в результате чего следующая модель в серии «учится» у предыдущих моделей. Популярные модели, такие как XGboost и ADAboost, используют этот процесс.
Стекинг использует разные типы моделей для прогнозирования результата. Это можно увидеть практически с помощью Регрессора голосования или Классификатора голосования в учебном пособии.
Важным гиперпараметром классификатора голосования является «жесткое голосование», при котором используется прогноз наивысшей вероятности из всех моделей, или «мягкое голосование», при котором используется среднее.
К сожалению, у нас нет определенного пакета в Tensorflow, который делал бы то же самое, однако мы можем воспроизвести это вручную, запустив несколько моделей глубокого обучения и усреднив результаты. Подробный пример можно найти здесь
Ранняя остановка
Ранняя остановка обычно отмечается в моделях глубокого обучения, где эпохи (итерации модели) останавливаются, когда производительность по данным тестирования / проверки начинает ухудшаться.
Мы можем увидеть пример использования модуля EarlyStopping в Tensorflow, где мы установили очень большое количество эпох.
Мы можем сделать это в машинном обучении, установив параметры в определенных моделях научного обучения, например n_estimators в Random Forest или n_jobs в Линейная регрессия
Больше данных
Это всегда хороший вариант, однако мы должны быть осторожны, чтобы не включать функции, информация о которых уже присутствует в других (см. Уменьшение сложности модели выше)
Один из способов сделать это - получить больше выборок данных, однако это не всегда возможно.
Другой способ - проектирование функций, при котором мы получаем дополнительные функции от других. Лучше всего это показано в нашей заявке Kaggle Titanic, где мы извлекаем дополнительные характеристики, такие как длина имени пассажира, титул пассажира (мистер, мисс и т. Д.) , группировка / биннинг функций и т. д.
Перекрестная проверка
Перекрестная проверка - это процесс повторной выборки, при котором набор данных разбивается на k групп, где определенные подмножества каждой группы используются для обучения модели, а другие - для проверки или тестирования модель.
Затем модель оценивается на предмет того, насколько хорошо она справилась с данными теста, также называемыми «неизвестными данными», поскольку эти данные не использовались при подборе / обучении модели.
Существует множество методов перекрестной проверки, таких как K-свертывание и исключение-один и т. Д. Однако самый простой и наиболее известный метод - удержание; , где часть данных откладывается для более позднего тестирования. Чаще всего это используется с модулем научных материалов train_test_split:
Вывод
Это были быстрые и грязные примеры, чтобы уменьшить переоснащение, не вдаваясь в подробности каждого шага. Я рекомендую, если вы используете какой-либо из вышеперечисленных шагов, полностью изучите процесс перед реализацией, поскольку некоторые из этих шагов могут затруднить прогнозирование модели.
Пример уменьшения переобучения с использованием слоев Ранняя остановка и Отключение можно найти в нашей Блокноте Kaggle: Борьба с переобучением с помощью слоев Ранняя остановка и выпадение