Дискусія про перевитрату в xgboost


20

Моя настройка така:

Я дотримуюся вказівок у "Прикладному прогнозуванні". Таким чином, я відфільтрував відповідні функції та закінчив таке:

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

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

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

Таким чином, якщо помилка тесту в 8 разів перевищує похибку навчання, то я б сказав: я перевищив дані тренувань. І все-таки я отримую меншу помилку на тесті все одно.

Я використовую наступні параметри на xgboost:

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

Якщо я знижую max_depth, тоді тренінг і помилка тесту наближаються, але все-таки є великий розрив, і помилка тесту більша (трохи вище 3).

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

  • lambda = 90 та `альфа = 0: знайдене за допомогою перехресної перевірки, лямбда має запобігати надмірній валій.
  • colsample_bytree = 0.8, subsample = 0.8і min_child_weight = 5: роблячи це, я намагаюся зменшити наряд.

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

Як ви думаєте: чи можу я прийняти переоцінку, якщо (якщо це можливо) реальна життєва ефективність вища? Чи має xgboost в моїх налаштуваннях надмірний розмір?

Відповіді:


34

Це надмірна оснащення, що ви не повинні вибирати модель, яка робить надмірну, навіть якщо її тестова помилка менша? Ні. Але ви повинні мати обґрунтування для його вибору.

Така поведінка не обмежується XGBoost. Це загальна нитка серед усіх технік машинного навчання; знаходження правильного компромісу між недостатнім та надмірним. Офіційне визначення - компромісна зміна (Вікіпедія) .

Компромісійне зміщення

Далі наведено спрощення компромісу з відхиленням, щоб обґрунтувати вибір вашої моделі.

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

  • Ми говоримо, що модель має велику дисперсію, якщо вона використовує занадто багато інформації з даних. Він покладається на інформацію, яка відштовхується лише у представленому йому навчальному наборі, який недостатньо добре узагальнює. Як правило, модель сильно зміниться, якщо змінити навчальний набір, звідси і назва "велика дисперсія".

Ці визначення дуже схожі на визначення недоцільності та подолання. Однак ці визначення часто занадто спрощені, щоб бути протилежними, як в

  • Ця модель є недостатньою, якщо і тренування, і помилка тесту високі. Це означає, що модель занадто проста.
  • Модель є придатною, якщо похибка тесту вища, ніж помилка навчання. Це означає, що модель занадто складна.

Ці спрощення, звичайно, є корисними, оскільки допомагають вибрати правильну складність моделі. Але вони не помічають важливого моменту, того, що (майже) кожна модель має як зміщення, так і дисперсію. Опис недоопрацювання / подолання говорить вам, що у вас занадто багато упередженості / занадто велика дисперсія, але у вас (майже) завжди є те і інше .

Якщо ви хочете отримати більше інформації про зміщення відхилення відхилення, вони є корисною візуалізацією та хорошими ресурсами, доступними через google. Кожен підручник з машинного навчання матиме розділ про компромісне зміщення, ось декілька

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

Крім того, приємна публікація в блозі, яка допомогла мені зрозуміти, - це розуміння Скотта Фортмана-Роу компромісу зміщення .

Додаток до вашої проблеми

Отже, у вас є дві моделі,

Тренуйте МАЕТест МАЕМАРС4.04.0Низька дисперсія, більший ухил,XGBoost0,32.4Більш висока дисперсія, менша зміщення,

і вам потрібно вибрати один. Для цього потрібно визначити, що є кращою моделлю. Параметри, які повинні бути включені у ваші рішення, - це складність та ефективність моделі.

  • Скільки «одиниць» складності ви готові обміняти на одну «одиницю» продуктивності?
    • Більш висока складність пов'язана з вищою дисперсією. Якщо ви хочете, щоб ваша модель добре узагальнила набір даних, який трохи відрізняється від тієї, на якій ви тренувались, ви повинні прагнути до меншої складності.
    • Якщо ви хочете модель, яку ви можете легко зрозуміти, ви можете це зробити ціною продуктивності, зменшивши складність моделі.
    • Якщо ви прагнете досягти найкращої продуктивності набору даних, яка, як ви знаєте, походить з того самого генеративного процесу, що і ваш навчальний набір, ви можете маніпулювати складністю для оптимізації вашої тестової помилки та використовувати це як показник. Це відбувається, коли ваш навчальний набір випадково відбирається з більшого набору, і ваша модель буде застосована до цього набору. Це стосується більшості змагань Kaggle, наприклад.

Мета тут - не знайти модель, яка «не перевершує». Потрібно знайти модель, яка має найкращі компромісні зміни. У цьому випадку я можу стверджувати, що зменшення упередженості, здійснене моделлю XGBoost, є досить хорошим, щоб виправдати збільшення дисперсії.

Що ти можеш зробити

Однак, напевно, ви можете зробити краще, налаштувавши гіперпараметри.

  • Збільшення кількості раундів та зниження рівня навчання - це можливість. Щось "дивно" щодо збільшення градієнта полягає в тому, що запуск його за межі того пункту, коли помилка тренування досягла нуля, здається, все ще покращує помилку тесту (як обговорювалося тут: Чи глибше краще лише тоді, коли дрібненьке добре? ). Ви можете спробувати навчити свою модель трохи довше на своєму наборі даних, як тільки встановите інші параметри,

  • 1/214. Це може бути жаргон, але якщо ваші особливості мають ступінь взаємодії 3 (Приблизно: Комбінація чотирьох особливостей не є більш потужною, ніж комбінація 3 цих ознак + четверта), то вирощування дерев розміром більше 3 становить згубний. Два дерева глибини три матимуть більше узагальнюючої сили, ніж одне дерево глибини чотири. Це досить складна концепція, і я зараз не вдаваюся в неї, але ви можете переглянути цю збірку паперів для початку. Також зауважте, що глибокі дерева призводять до великої дисперсії!

  • Використання піддиагностики, відомої як мішок , чудово зменшує дисперсію. Якщо ваші окремі дерева мають велику дисперсію, пакетування буде середньостатистичним, а середнє має меншу дисперсію, ніж окремі дерева. Якщо після налаштування глибини ваших дерев ви все ще зустрічаєтеся з великою дисперсією, спробуйте збільшити підсистемування (тобто зменшити частку використаних даних). Підсистема простору функцій також досягає цієї мети.


1
Не слід коментувати "спасибі", але за цю довгу і цікаву відповідь хотілося б сказати "дякую". Я алеаді мав деякі знання про деякі речі, які ви пишете, але це було дуже красиво. Я перегляну деякі ваші довідки та вирощую нові дерева та, можливо, повернусь із коментарем. Поки що: спасибі! Чудово!
Рік

Посилання на сторінку взаємодій stat.columbia.edu/~jakulin/Целком чудово!
Рік

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