Выбор модели и перекрестная проверка: правильный путь

34

В CrossValidated существует множество тем на тему выбора модели и перекрестной проверки. Вот несколько из них:

Однако ответы на эти темы являются довольно общими и в основном освещают проблемы с конкретными подходами к перекрестной проверке и выбору модели.

Чтобы сделать вещи как можно более конкретными , скажем, например, что мы работаем с SVM с ядром RBF: , и что У меня есть набор данных функций X и меток у , и я хочуК(Икс,Икс')знак равно(γ|Икс-Икс'|)2

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

Для этого я лично выполняю поиск по сетке, например, я пробую все возможные комбинации и . Для простоты мы можем принять следующие диапазоны:Сγ

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

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

  1. Для каждой пары ( , ) я делаю повторные итерации (например, 100 случайных повторений) перекрестной проверки с кратным смещением (например, ) в моем наборе данных, т.е. я тренирую SVM на сгибах и оцениваю ошибка в левом сгибе, повторяющаяся во всех сгибах. В целом, я собираю 100 x 10 = 1000 ошибок теста.СγККзнак равно10К-1К
  2. Для каждой такой пары ( , ) я вычисляю среднее значение и дисперсию этих 1000 тестовых ошибок .СγμM,σM

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

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

Придерживаясь этой проблемы, как конкретно я могу выбрать лучшую модель и правильно оценить ее ошибку обобщения ?

Амелио Васкес-Рейна
источник
Чтобы сделать вещи как можно более конкретными, скажите нам: Сколько статистически независимых случаев у вас есть в вашем наборе данных? Какую целевую функцию вы оцениваете для оптимизации / Какую погрешность вы используете? Вы действительно наблюдаете последовательное поведение выбранной меры ошибки по вашей сетке параметров? Если вы говорите о классификации и ваша мера ошибки позволяет это: как результаты повторной перекрестной проверки соотносятся с отклонением, которое вы ожидаете (но не можете измерить) из-за конечного размера выборки?
cbeleites поддерживает Монику
Статья, которая может вас заинтересовать: optimprediction.com/files/pdf/V2A5.pdf
user31256,
2
+1 за очень ясный и подробный вопрос, а также очень актуальный вопрос для сообщества специалистов в области данных.
НикБраунагель,

Ответы:

20

Моя статья в JMLR посвящена именно этому вопросу и демонстрирует, почему процедура, предложенная в этом вопросе (или, по крайней мере, одна очень похожая на нее), приводит к оптимистически смещенным оценкам производительности:

Гэвин К. Коули, Никола Л.К. Тэлбот, «О переоснащении при выборе модели и смещении последующего выбора при оценке эффективности», Журнал исследований в области машинного обучения, 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
Самозагрузка (выборка с заменой) представляется более естественным способом выполнения большого количества повторных выборок, поскольку она более рандомизирована, чем повторная перекрестная проверка. Хорошая функция для начальной загрузки - использование вражеских мешков с ошибкой «вне сумки» в качестве оценки производительности. Там нет огромного количества, чтобы выбрать между двумя.
Дикран Marsupial
Спасибо @Dikran - Это заставило меня задуматься, если предположить, что кто-то использует, например, самозагрузку, как бы вы выбрали хорошую модель, учитывая среднее значение и дисперсию повторений? (т.е. какой протокол выбора модели вы бы использовали?). Этот вопрос ставит именно этот вопрос. Получение вашего мнения в этой теме было бы чрезвычайно ценно!
Джош
@DikranMarsupial Не могли бы вы опубликовать код (например, Python или R) для ваших шагов 1-3? Мне намного легче понять такие процедуры, когда видишь конкретный код.
tobip
1
Ключевое сообщение: «Ключевым моментом является то, что для получения объективной оценки производительности любую процедуру, которую вы используете для генерации окончательной модели (fit_model), необходимо повторять полностью независимо в каждом цикле процедуры перекрестной проверки». Это точное сообщение также передается в «Элементах статистического обучения» (см. Раздел 7.10.2): web.stanford.edu/~hastie/Papers/ESLII.pdf
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«правильная оценка ее ошибки обобщения» (хотя и смещенной вверх, но вы не можете получить торт и съесть его тоже).

Январь-GLX
источник