Вибір моделі та перехресне підтвердження: правильний шлях


34

У CrossValided є численні теми на тему вибору моделі та перехресної перевірки. Ось декілька:

Однак відповіді на ці теми є досить загальними і здебільшого висвітлюють питання з особливими підходами до перехресної валідації та вибору моделі.

Щоб зробити речі максимально конкретними , скажімо, наприклад, що ми працюємо з SVM з ядром RBF: , і що у мене є набір даних функційXі мітокy, і що я хочуК(х,х')=(γ|х-х'|)2

  1. Знайдіть найкращі можливі значення моєї моделі ( і CγС )
  2. Навчити SVM за допомогою мого набору даних (для остаточного розгортання)
  3. Оцініть помилку узагальнення та невизначеність (дисперсію) навколо цієї помилки

Для цього я б особисто здійснив пошук в сітці, наприклад, я намагаюся використовувати всі можливі комбінації і γ . Для простоти можна припустити наступні діапазони:Сγ

  • С{10,100,1000}
  • γ{0,1,0,2,0,5,1,0}

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

  1. Для кожної пари ( , γ ) я виконую повторні ітерації (наприклад, 100 випадкових повторів) K- кратної перехресної перевірки (наприклад, K = 10 ) на своєму наборі даних, тобто я треную свій SVM на K - 1 складках і оцінюю помилку на складці ліворуч, перебираючи всі K складки. Загалом я збираю 100 х 10 = 1000 тестових помилок.СγКК=10К-1К
  2. Для кожної такої ( , γ ) пари, я обчислити середнє значення і дисперсію цих тестових 1000 ПОМИЛОК М М , сг М .СγмкМ,σМ

Тепер я хочу вибрати найкращу модель (найкращі параметри ядра), яку я використовував би для тренування мого остаточного SVM для повного набору даних. Я розумію, що при виборі моделі , яка мала саму низьку середню помилку і дисперсію і σ M буде правильний вибір, і що моделі μ M є σ M мої найкращі оцінки зміщення помилки узагальнення моделі і дисперсії , коли навчання з повний набір даних.мкМσМмкМσМ

АЛЕ, прочитавши відповіді у вищезазначених потоках, у мене складається враження, що цей метод вибору найкращого SVM для розгортання та / або для оцінки його помилки (ефективність узагальнення) є недоліком, і що є кращі способи вибору найкращий SVM та повідомляє про свою помилку. Якщо так, то що вони? Шукаю конкретну відповідь, будь ласка.

Дотримуючись цієї проблеми, як конкретно я можу вибрати найкращу модель та правильно оцінити її помилку узагальнення ?


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

Статтю , в якій ви можете знайти цікаві: optimalprediction.com/files/pdf/V2A5.pdf
user31256

2
+1 за дуже чітке та детальне запитання, а також дуже актуальне питання для спільноти наукових даних взагалі.
NickBraunagel

Відповіді:


20

Моя стаття в JMLR стосується саме цього питання і демонструє, чому запропонована у питанні процедура (або принаймні одна дуже сподобалася) призводить до оптимістично упереджених оцінок ефективності:

Гевін К. Каулі, Ніколас Л. Талбот, "Про надмірне входження в вибір моделі та наступні ухили відбору в оцінці продуктивності", Journal of Machine Learning Research, 11 (липень): 2079−2107, 2010. ( www )

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

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

Крок 1 - Пристосуйте модель до всіх доступних даних, використовуючи функцію fit_model. Це дає вам модель, яку ви будете використовувати в роботі.

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

Крок 3 - Змінення параметрів гіперпараметрів - виконайте аналіз значень гіперпараметрів, зібраних на кроці 3. Однак я повинен зазначити, що немає нічого особливого щодо гіперпараметрів, вони є лише параметрами моделі, які були оцінені (опосередковано ) з даних. Вони розглядаються як гіперпараметри, а не параметри для обчислювальної / математичної зручності, але це не повинно бути так.

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

Ключовим моментом є те, що для отримання неупередженої оцінки продуктивності будь-яку процедуру, яку ви використовуєте для створення остаточної моделі (fit_model), необхідно повторити в повному обсязі незалежно у кожному складі процедури перехресної перевірки.


Це чудова відповідь. Коли ви кажете rather than repeated cross-validation you would go for bootstrapping- Яка саме різниця? Обидва пов'язані кілька повторень ділення даних на trainі testпотім навчання в trainі оцінці в test, чи не так?
Джош

4
Запуск завантаження (вибірка з заміною) здається більш природним способом виконання великої кількості повторних вибірок, оскільки це більш рандомізовано, ніж повторна перехресна перевірка. Для завантаження із застосуванням мішків із застосуванням мішок - це приємна особливість, що помилка поза мішком є ​​оцінкою продуктивності. Вибирати між ними не існує величезної кількості.
Дікран Марсупіал

Дякую @Dikran - Це змусило мене замислитися, припускаючи, що використовується, наприклад, завантажувальна програма, як би ви вибрали хорошу модель з огляду на середню та відмінність повторів? (тобто який протокол вибору моделі ви б дотримувались?). Це питання ставить саме це питання. Отримати свій внесок у цю нитку було б надзвичайно цінним!
Джош

@DikranMarsupial Чи можете ви розмістити поштовий індекс (наприклад, Python або R) для кроків 1-3? Мені набагато простіше зрозуміти такі процедури, коли бачимо конкретний код.
tobip

1
Ключове повідомлення: "Ключовим моментом є те, що для отримання неупередженої оцінки продуктивності будь-яку процедуру, яку ви використовуєте для створення остаточної моделі (fit_model), необхідно повторити в повному обсязі незалежно у кожному складі процедури перехресної перевірки." Це точне повідомлення також передане в «Елементах статистичного навчання» (див. Розділ 7.10.2
NickBraunagel

0

γС

Процедура, яка оптимізує ці гіперпараметри та тренує SVM з ними , також є лише алгоритмом машинного навчання . Замість оптимізації внутрішніх параметрів SVM (опорних векторів) він також оптимізує гіперпараметри.

Тепер у вас є дві проблеми [які можна вирішити самостійно]:

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


Конкретне (можливо, не оптимальне) рішення конкретної проблеми вашого питання:

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

Тут modelбуде ваша "найкраща модель" та loss_CV"правильна оцінка її помилки узагальнення" (хоча упереджена вгору, але ви не можете мати торт і їсти його теж).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.