Обсуждение об оверфите в xgboost


20

Моя установка следующая:

Я следую указаниям в разделе «Прикладное прогнозное моделирование». Таким образом, я отфильтровал взаимосвязанные функции и в итоге получил следующее:

  • 4900 точек данных в тренировочном наборе и 1600 точек данных в тестовом наборе.
  • У меня есть 26 функций, и цель является непрерывной переменной.

Я применяю 5-кратную перекрестную проверку для моделей поездов, использующих caretпакет. Когда я применяю модель MARS, то получаю среднюю абсолютную ошибку (MAE) около 4 на тренировочном наборе, а также на тестовом наборе.

Однако, применяя xgboost (алгоритм дерева или линейный алгоритм), я получаю что-то вроде 0,32 (!) На тренировочном наборе и 2,4 на тестовом наборе.

Таким образом, если ошибка теста в 8 раз превышает ошибку обучения, я бы сказал: я переобучил данные тренировки. Тем не менее, я все равно получаю меньшую ошибку при тестировании.

Я использую следующие параметры в xgboost:

  • nrounds = 1000и eta = 0.01(увеличение nround и уменьшение eta может помочь, но у меня не хватает памяти, а время выполнения слишком длинное)
  • max_depth = 16: если я сравниваю другие сообщения и значение по умолчанию 6, то это выглядит большим, но проблема довольно сложная - возможно, 16 не слишком велика в этом случае.
  • colsample_bytree = 0.7, subsample = 0.8И min_child_weight = 5: делать это я стараюсь уменьшить overfit.

Если я уменьшу max_depth, то обучающая и тестовая ошибки станут ближе, но все равно будет большой разрыв, и тестовая ошибка будет больше (чуть выше 3).

Используя линейный усилитель, я получаю примерно одинаковую ошибку поезда и теста при оптимальных параметрах:

  • lambda = 90 и `alpha = 0: найдено путем перекрестной проверки, лямбда должна предотвратить перегрузку.
  • colsample_bytree = 0.8, subsample = 0.8И min_child_weight = 5: делать это я стараюсь уменьшить overfit.

У меня такое ощущение, что xgboost по-прежнему перегружен - но ошибка обучения и, насколько я могу видеть в тесте в реальном времени (я использовал модели xgboost и их целый набор в реальности в течение 4 дней), выглядит нормально (ошибка больше, чем ошибка теста, но в реальной жизни больше неопределенности относительно прогноза характеристик и других переменных).

Что вы думаете: могу ли я принять наряд, если (если это возможно) реальные результаты выше? Имеет ли xgboost в моих настройках тенденцию к переоснащению?

Ответы:


34

Является ли переоснащение настолько плохим, что вы не должны выбирать модель, которая переоснащается, даже если ошибка теста меньше? Нет. Но у тебя должно быть оправдание выбора.

Это поведение не ограничено XGBoost. Это общая нить среди всех методов машинного обучения; нахождение правильного компромисса между недостаточным оснащением и дополнительным оснащением. Формальное определение - компромисс между отклонениями (Википедия) .

Компромисс смещения дисперсии

Ниже приведено упрощение компромисса между отклонениями, чтобы помочь в выборе модели.

  • Мы говорим, что модель имеет высокий уклон, если она не в состоянии полностью использовать информацию в данных. Он слишком зависит от общей информации, такой как наиболее частый случай, среднее значение ответа или несколько мощных функций. Смещение может происходить из неправильных предположений, например, если предположить, что переменные являются нормально распределенными или что модель является линейной.

  • Мы говорим, что модель имеет высокую дисперсию, если она использует слишком много информации из данных. Он опирается на информацию, имеющую отношение только к представленному ему обучающему набору, который недостаточно обобщен. Как правило, модель сильно изменится, если вы измените тренировочный набор, отсюда и название «высокая дисперсия».

Эти определения очень похожи на определения подгонки и подгонки. Однако эти определения часто слишком упрощены, чтобы быть противоположными, как в

  • Модель не подходит, если и ошибки обучения и теста высоки. Это означает, что модель слишком проста.
  • Модель переоснащается, если ошибка теста выше, чем ошибка обучения. Это означает, что модель слишком сложна.

Эти упрощения, конечно, полезны, так как они помогают выбрать правильную сложность модели. Но они упускают из виду важный момент, тот факт, что (почти) каждая модель имеет как смещение, так и компонент дисперсии. Описание подгонки / переоснащения говорит вам, что у вас слишком много смещения / слишком много отклонений, но у вас (почти) всегда есть оба .

Если вы хотите получить больше информации о компромиссе между отклонениями, они очень полезны для визуализации и хороших ресурсов, доступных через Google. Каждый учебник по машинному обучению будет иметь раздел, посвященный компромиссу с отклонениями, вот несколько

  • Введение в статистическое обучение и Элементы статистического обучения (доступно здесь) .
  • Распознавание образов и машинное обучение, Кристофер Бишоп.
  • Машинное обучение: вероятностная перспектива, Кевин Мерфи.

Кроме того, хороший пост в блоге, который помог мне понять это Скотт Фортманн-Роу « Понимание компромисса смещения» .

Приложение к вашей проблеме

Итак, у вас есть две модели,

Поезд МАЭТест МАЭМАРС~4,0~4,0Низкая дисперсия, более высокий уклон,XGBoost~0,3~2,4Более высокая дисперсия, более низкий уклон,

и вам нужно выбрать один. Для этого вам нужно определить, какая модель лучше. Параметры, которые должны быть включены в ваши решения, - это сложность и производительность модели.

  • Сколько «единиц» сложности вы готовы обменять на одну «единицу» производительности?
    • Большая сложность связана с большей дисперсией. Если вы хотите, чтобы ваша модель хорошо обобщала набор данных, который немного отличается от того, на котором вы тренировались, вам следует стремиться к меньшей сложности.
    • Если вам нужна модель, которую вы можете легко понять, вы можете сделать это за счет производительности, уменьшив сложность модели.
    • Если вы стремитесь к наилучшей производительности в наборе данных, который, как вы знаете, происходит из того же процесса генерации, что и учебный набор, вы можете манипулировать сложностью, чтобы оптимизировать тестовую ошибку и использовать ее в качестве показателя. Это происходит, когда ваш тренировочный набор случайным образом выбирается из большего набора, и ваша модель будет применена к этому набору. Например, в большинстве соревнований Kaggle.

Цель здесь не в том, чтобы найти модель, которая "не подходит". Это найти модель, которая имеет лучший компромисс дисперсии. В этом случае я бы сказал, что уменьшение смещения, достигаемое моделью XGBoost, достаточно хорошо, чтобы оправдать увеличение дисперсии.

Что ты можешь сделать

Тем не менее, вы, вероятно, можете добиться большего успеха, настроив гиперпараметры.

  • Увеличение количества раундов и снижение скорости обучения является возможным. Что-то «странное» в повышении градиента состоит в том, что его прохождение до точки, когда ошибка обучения достигла нуля, по-видимому, все же улучшает ошибку теста (как обсуждалось здесь: « Чем глубже лучше, только когда хорош мелкий?» ). Вы можете попытаться обучить вашу модель немного дольше в вашем наборе данных, как только вы установили другие параметры,

  • 1/214, Это может быть жаргоном, но если ваши объекты имеют степень взаимодействия 3 (грубо говоря: комбинация из 4 функций не является более мощной, чем комбинация 3 из этих функций + четвертая), то растущие деревья размером больше 3 - это пагубный. Два дерева глубины три будут обладать большей степенью обобщения, чем одно дерево глубины четыре. Это довольно сложная концепция, и я не буду вдаваться в нее сейчас, но вы можете проверить этот сборник документов для начала. Также обратите внимание, что глубокие деревья приводят к высокой дисперсии!

  • Использование подвыборки, известной как пакетирование , отлично подходит для уменьшения дисперсии. Если ваши отдельные деревья имеют высокую дисперсию, то суммирование будет усреднять деревья, а среднее будет иметь меньшую дисперсию, чем отдельные деревья. Если после настройки глубины деревьев вы по-прежнему сталкиваетесь с высокой дисперсией, попробуйте увеличить подвыборку (то есть уменьшить долю используемых данных). Сэмплирование пространства признаков также достигает этой цели.


1
Не следует комментировать слова «спасибо», но за этот длинный и интересный ответ я хотел бы сказать «спасибо». Я немного знал кое-что из того, что ты пишешь, но это было действительно здорово. Я рассмотрю некоторые из ваших ссылок и вырасту новые деревья и, возможно, вернусь с комментарием. На данный момент: спасибо! Большой!
Рик

Ссылка на страницу взаимодействий stat.columbia.edu/~jakulin/Int действительно отличная!
Рик

Я воспользовался вашим советом и ограничил глубину деревьев до 3, но взял около 1200, и результаты чувствуются великолепно: очень быстрые вычисления, разница между поездом и тестированием уменьшена и все еще на хорошем уровне. Остальная часть истории находится здесь: stats.stackexchange.com/questions/205858/…
Рик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.