Как получить гиперпараметры во вложенной перекрестной проверке?


17

Я прочитал следующие посты о вложенной перекрестной проверке и до сих пор не уверен на 100%, что мне делать с выбором модели с вложенной перекрестной проверкой:

Чтобы объяснить мою путаницу, позвольте мне попробовать пошагово пройти выбор модели с помощью метода перекрестной проверки.

  1. Создайте внешний цикл CV с помощью K-Fold. Это будет использоваться для оценки производительности гиперпараметров, которые "выиграли" каждый внутренний цикл CV.
  2. Используйте GridSearchCV для создания внутреннего цикла CV, где в каждом внутреннем цикле GSCV проходит через все возможные комбинации пространства параметров и подбирает лучший набор параметров.
  3. После того, как GSCV обнаружил лучшие параметры во внутреннем цикле, он проверяется с помощью набора тестов во внешнем цикле, чтобы получить оценку производительности.
  4. Затем внешний цикл обновляется до следующего сгиба в качестве тестового набора, а остальные - в качестве тренировочного набора, и 1-3 повторения. Общие возможные "выигрышные" параметры - это количество фолдов, обозначенных во внешнем цикле. Таким образом, если внешний цикл составляет 5 крат, тогда у вас будет оценка производительности алгоритма с 5 различными наборами гиперпараметров, а НЕ производительность одного конкретного набора гиперпараметров.

Этот подход иллюстрируется на странице примера SKLearn: http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html

Вопрос: После 4. Как вы определяете, какие гиперпараметры работали лучше всего? Я понимаю, что вы хотите обучить свой алгоритм (например, Логистическая регрессия, Случайный лес и т. Д.) С помощью ПОЛНОГО набора данных в конце. Но как определить, какие гиперпараметры работали лучше всего в вашей перекрестной проверке? Насколько я понимаю, для каждого внутреннего цикла победит другой набор гиперпараметров. Что касается внешнего цикла, вы получаете оценку своей производительности GridSearchCV, но вы не получаете какой-то определенный набор гиперпараметров. Итак, как при создании окончательной модели вы знаете, какие гиперпараметры использовать? Это недостающая логика, которую мне трудно понять из других шагов.

Заранее благодарю за любые советы, особенно, если @Dikran Marsupial и @cbeleites могут участвовать!

Изменить: Если вы можете, пожалуйста, в своем ответе используйте такие термины, как «алгоритм» и «гиперпараметры». Я думаю, что один источник путаницы для меня - это когда люди используют термин «модель» или «выбор модели». Я запутался, говорят ли они о выборе алгоритма или гипер-параметров.

Изменить 2: я создал блокнот, который показывает два способа выполнения перекрестной проверки вложенности. Первый способ - тот, который показан в примере с SKLearn, а другой, более длинный, - тот, который я написал. Путь, показанный в SKLearn, не раскрывает «выигрышные» гиперпараметры, но мой более длинный путь делает это. Но вопрос остается прежним. Что мне теперь делать после завершения вложенной перекрестной проверки, даже с указанием гиперпараметров? Как видно из гиперпараметров в конце ноутбука, они немного различаются.


1
+1 за ноутбук. Этот вопрос также интересует меня и продолжит.
Арнольд Кляйн

Ответы:


6

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

Но сначала немного терминологии:

  • Исходя из прикладной области, (приспособленная / обученная) модель для меня готова к использованию. Т.е. модель содержит всю информацию, необходимую для генерации прогнозов для новых данных. Таким образом, модель содержит также гиперпараметры . Как вы увидите, эта точка зрения тесно связана с подходом 2 ниже.
  • OTOH, алгоритм обучения в моем опыте не очень хорошо определен в следующем смысле: чтобы получить (подогнанную) модель, нужно сделать не только - давайте назовем это «первичной подгонкой» - «нормальных» параметров модели, но и гиперпараметры должны быть исправлены. С моей точки зрения приложения, между параметрами и гиперпарамерами нет большой разницы: оба являются частью модели , и их необходимо оценивать / определять во время обучения.
    Я предполагаю, что разница между ними связана с разницей между тем, кто разрабатывает новые алгоритмы обучения, которые обычно описывают класс алгоритмов обучения вместе с некоторыми параметрами управления ( гиперпараметрами).) которые трудно / невозможно исправить (или, по крайней мере, исправить то, как они должны быть определены / оценены) без знания приложения / предметной области.

Подход 1: требовать стабильных результатов оптимизации

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

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

  1. суррогатные модели по-прежнему равны (или эквивалентны) между собой, но не до окончательной модели, речь идет об известном пессимистическом смещении перекрестной проверки.

  2. Если также суррогатная модель не равна / эквивалентна друг другу, у нас возникают проблемы с нестабильностью .

Для результатов оптимизации внутреннего цикла это означает, что если оптимизация стабильна, то при выборе гиперпараметров нет конфликта . И если наблюдается значительный разброс результатов внутренней перекрестной проверки, оптимизация не является стабильной . Нестабильные учебные ситуации имеют гораздо худшие проблемы, чем просто решение, какой из наборов гиперпараметров выбрать, и я действительно рекомендую отступить в этом случае и начать процесс моделирования заново.

Однако здесь есть исключение: в оптимизации может быть несколько локальных минимумов, дающих равную производительность для практических целей. Требование также, чтобы выбор между ними был стабильным, может быть ненужным сильным требованием - но я не знаю, как выйти из этой дилеммы.

Обратите внимание, что если не все модели дают одинаковый набор параметров выигрыша, вы не должны использовать оценки внешнего цикла в качестве ошибки обобщения здесь:

  • п
    (Представьте, что кто-то сказал вам, что они провели перекрестную проверку на модели с C = 1 и линейным ядром, и вы обнаружите, что некоторые расщепления были оценены с помощью ядра rbf!)
  • Но если не будет принято никакого решения, поскольку все разбиения дают одинаковые параметры, это нарушит независимость во внешнем цикле: тестовые данные каждого разбиения уже вошли в решение, какой набор параметров выигрывает, так как он обучал данные во всех других разбиениях и, таким образом, использовал оптимизировать параметры.

Подход 2: рассматривать настройку гиперпараметра как часть обучения модели

Этот подход соединяет перспективы «разработчика алгоритма обучения» и прикладного пользователя алгоритма обучения.

Разработчик алгоритма обучения предоставляет «голый» алгоритм обучения model = train_naked (trainingdata, hyperparameters). Как прикладной пользователь нуждается, tunedmodel = train_tuned (trainingdata)который также заботится об исправлении гиперпараметров.

train_tuned может быть реализован, например, путем оборачивания оптимизатора на основе перекрестной проверки вокруг голого алгоритма обучения train_naked .

train_tuned затем может использоваться как любой другой алгоритм обучения, который не требует ввода гиперпараметра, например, его вывода tunedmodel может быть подвергнут перекрестной проверке. Теперь гиперпараметры проверяются на их стабильность так же, как «нормальные» параметры должны проверяться на стабильность как часть оценки перекрестной проверки.

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


Какая разница?

Возможно, мы получим разные окончательные модели, использующие эти два подхода:

  • окончательная модель в подходе 1 будет train_naked (all data, hyperparameters from optimization)
  • в то время как в подходе 2 будет использоваться train_tuned (all data)и - поскольку при этом снова выполняется оптимизация гиперпараметра для большого набора данных - это может привести к другому набору гиперпараметров.

Но опять-таки применяется та же логика: если мы обнаружим, что конечная модель имеет существенно отличающиеся параметры от суррогатных моделей перекрестной проверки, это является признаком нарушения предположения 1. ИМХО, опять же, у нас нет конфликта, а скорее проверка того, оправданы ли наши (неявные) предположения. И если это не так, мы в любом случае не должны ставить слишком много на хорошую оценку производительности этой окончательной модели.


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


Пример ириса

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

Однако, с точки зрения приложения, вывод заключается в том, что не имеет значения, какой из 4 наборов параметров вы выберете - что не так уж и плохо: вы нашли сравнительно стабильное плато параметров. В этом заключается преимущество правильной вложенной проверки настроенной модели: хотя вы не можете утверждать, что это оптимальная модель, вы все равно можете утверждать, что модель, построенная на целых данных с использованием подхода 2, будет иметь точность около 97% (95% доверительный интервал для 145 правильных из 150 тестовых случаев: 92 - 99%)

Обратите внимание, что подход 1 также не так далек, как кажется - см. Ниже: ваша оптимизация случайно упустила сравнительно явного «победителя» из-за связей (на самом деле это еще один явный признак проблемы размера выборки).

Хотя я недостаточно глубоко разбираюсь в SVM, чтобы «увидеть», что C = 1 должен быть хорошим выбором, я бы остановился на более строгом линейном ядре. Кроме того, как вы делали оптимизацию, нет ничего плохого в выборе выигравшего набора параметров, даже если вы знаете, что все наборы параметров приводят к практически одинаковой производительности.

В будущем, однако, подумайте, дает ли ваш опыт приблизительные предположения о том, какую производительность вы можете ожидать, и примерно какую модель будет хорошим выбором. Затем создайте эту модель (с фиксированными вручную гиперпараметрами) и рассчитайте доверительный интервал для ее производительности. Используйте это, чтобы решить, имеет ли смысл оптимизация вообще. (Могу добавить, что я в основном работаю с данными, где получить еще 10 независимых случаев непросто - если вы находитесь в поле с большими независимыми размерами выборки, все выглядит намного лучше для вас)

длинная версия:

Что касается примера результатов на irisнаборе данных. irisимеет 150 случаев, SVM с сеткой 2 х 2 параметра (2 ядра, 2 порядка для штрафаC ).

Внутренний цикл имеет сплит 129 (2x) и 132 (6x) случаев. «Лучший» набор параметров нерешительности между линейной или RBF ядра, как с C = 1. Однако, внутренние точности испытаний все ( в том числе всегда Loosing C = 10) в течение 94 - 98,5% наблюдаемая точность. Наибольшее различие, которое мы имеем в одном из разделений, составляет 3 против 8 ошибок для RBF с C = 1 против 10.

Нет, это существенная разница. Я не знаю, как извлечь прогнозы для отдельных случаев в резюме, но даже предполагая, что 3 ошибки были разделены, а модель C = 10 сделала дополнительные 5 ошибок:

> table (rbf1, rbf10)
         rbf10
rbf1      correct wrong
  correct     124     5
  wrong         0     3

> mcnemar.exact(rbf1, rbf10)

    Exact McNemar test (with central confidence intervals)

data:  rbf1 and rbf10
b = 5, c = 0, p-value = 0.0625
alternative hypothesis: true odds ratio is not equal to 1

Помните, что в сетке 2 x 2 есть 6 парных сравнений, поэтому нам также необходимо исправить множественные сравнения.


Подход 1

В 3 из 4 внешних сплитов, где rbf «выиграл» над линейным ядром, они фактически имели одинаковую оценочную точность (я думаю, min в случае связей возвращает первый подходящий индекс).

Изменение сетки на params = {'kernel':['linear', 'rbf'],'C':[1,10]} урожайность

({'kernel': 'linear', 'C': 1}, 0.95238095238095233, 0.97674418604651159)
({'kernel': 'rbf', 'C': 1}, 0.95238095238095233, 0.98449612403100772)
({'kernel': 'linear', 'C': 1}, 1.0, 0.97727272727272729)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.96212121212121215)

Подход 2:

Вот clfваша окончательная модель. При random_state = 2rbf с C = 1 выигрывает:

In [310]: clf.grid_scores_
[...snip warning...]
Out[310]: 
[mean: 0.97333, std: 0.00897, params: {'kernel': 'linear', 'C': 1},
 mean: 0.98000, std: 0.02773, params: {'kernel': 'rbf', 'C': 1},
 mean: 0.96000, std: 0.03202, params: {'kernel': 'linear', 'C': 10},
 mean: 0.95333, std: 0.01791, params: {'kernel': 'rbf', 'C': 10}]

(случается примерно 1 в 5 раз, 1 в 6 раз linearи rbfс C = 1привязкой на ранге 1)


4
Спасибо @cbeleites! Я читал ваши ответы и в других темах, и я надеялся, что вы ответите на мой вопрос. Ваш ответ очень глубокий, но на самом деле мой вопрос сосредоточен на том, как проанализировать результаты вложенного резюме; Мне все еще немного неясно, что «делать после того, как я вложу резюме». Можете ли вы взглянуть на созданную мной записную книжку (в конце моего поста) и объяснить, что делать непрофессионалу, поскольку два разных набора гиперпараметров были определены как оптимальные во вложенном резюме? Это очень очень короткая тетрадь, обещаю!
Тяжелое дыхание

@HeavyBreathing Я прочитал ответ, и я до сих пор не понимаю, что делать после того, как я вложу резюме. Вы ясно это поняли?
stackunderflow

0

Я прочитал ваш вопрос и ответ выше 2 раза (1 раз 3 месяца назад). Я заинтересован и также хочу найти абсолютно подходящий способ сделать перекрестную проверку для моих данных. После долгих размышлений и прочтения мне кажется, что я нахожу дыры и вот мое исправление:

Чтобы объяснить мою путаницу, позвольте мне попробовать пошагово пройти выбор модели с помощью метода перекрестной проверки.

  1. Создайте внешний цикл CV с помощью K-Fold. Это будет использоваться для оценки производительности гиперпараметров, которые "выиграли" каждый внутренний цикл CV.
  2. Используйте GridSearchCV для создания внутреннего цикла CV, где в каждом внутреннем цикле GSCV проходит через все возможные комбинации пространства параметров и подбирает лучший набор параметров. (Примечание: здесь я предполагаю: данные для внутреннего цикла = данные обучения для внешнего цикла. Вы можете спросить: почему? Ответ: /programming/42228735/scikit-learn-gridsearchcv-with-multiple-repetitions/ 42230764 # 42230764 прочитайте раздел ответов Вивека Кумара, шаг 4)
  3. После того, как GSCV обнаружил «лучшие параметры» во внутреннем цикле (назовем его внутренним победителем), он тестируется с помощью набора тестов во внешнем цикле, чтобы получить оценку производительности (назовем его external_fold_score1).
  4. Затем внешний цикл обновляется до следующего сгиба в качестве набора тестов, а остальные - в качестве тренировочного набора (для оценки «внутреннего победителя» во внешнем цикле), «внутренний победитель» снова тестируется с новым набором тестов (outer_fold_score2). Затем снова внешний цикл обновляется до следующего сгиба, пока цикл не завершится. Оценки от каждого сгиба (external_fold_score 1,2 ..) будут средними, чтобы получить оценку «внутреннего победителя» для внешнего цикла (outer_score)
  5. Затем внешний цикл обновляется до следующего сгиба в качестве тестового набора, а остальные - в качестве тренировочного набора (чтобы найти следующего «внутреннего победителя», и повторяется 1–4 (обратите внимание, что когда мы повторяем 1, мы не создаем новый K- сворачиваем, но мы используем один и тот же внешний Kfold каждый раз) . С каждым циклом 1-4 мы получаем «лучшие параметры» (или «внутренний победитель») с external_score. Тот, у кого лучший external_score, будет победителем победители

Обоснование:

  • В основном ваш вопрос касается того, что для внешнего цикла существует множество «выигрышных параметров». Дело в том, что вы не завершили внешний цикл, чтобы оценить и найти «внешнего победителя». Ваш четвертый шаг оценивает «внутреннего победителя» только в 1 раз во внешнем цикле, но вы не «зациклили». Поэтому мне нужно заменить его на мой 4-й шаг - «зациклить» шаг оценки во внешнем цикле и получить внешний балл (путем усреднения)
  • Ваш 5-й шаг выполнил работу «зацикливания» во внешнем цикле, но это просто для создания другого «внутреннего победителя». Это не зацикливало «оценку» этого «внутреннего победителя» во внешнем цикле

Это действительно отвечает на вопрос?
Майкл Р. Черник

0

Вы не используете вложенную перекрестную проверку для выбора гиперпараметров алгоритма, этот метод используется для оценки ошибки обобщения вашей процедуры построения модели . Где в соответствии с процедурой построения модели я планирую все шаги, которые вы применили для достижения окончательной модели, которую вы собираетесь использовать в полевых условиях.
Процедура построения модели может быть составлена из правил, которые вы применили, чтобы решить, какую предварительную обработку применить к данным, какую функцию использовать и, наконец, какие гиперпараметры использовать. Думайте об этом как своего рода «мета-алгоритм», который получает в качестве входных данных определенный набор данныхDи выдает на выходе «алгоритм», состоящий из фиксированного набора преобразований предварительной обработки, признаков и, наконец, значений гиперпараметров.

Например, скажем, у вас есть Икс,Yв качестве матрицы дизайна и цели, и вы хотите обучить классификатор:
1. который использует только первыйИкс особенности в Икс которые имеют самую высокую корреляцию с Y,
2. Вы выбираете значения гиперпараметров путем минимизации 10-кратной оценки перекрестной проверки.

Если вы примените эти два шага к конкретной паре Икс',Y' вы получите конкретный алгоритм с определенным набором функций и фиксированными гиперпараметрами, который не обязательно будет таким же, как тот, который вы получили бы для Икс,Yхотя процедура построения модели будет идентичной, то есть: шаги 1 + 2, которые не привязаны к какому-либо конкретному набору данных.
Допустим, вы сделали все вышеперечисленное, не разбив свои данные на поезд-тест, потому что у вас небольшой набор данных, как вы оцениваете ошибку обобщения только что созданного классификатора? Можете ли вы использовать лучшую ошибку, которую вы нашли в перекрестной проверке на шаге 2?
Нет , первая большая проблема заключается в шаге 1, где вы используете все данные для выбора используемых функций. Поэтому, даже если вы выполните перекрестную проверку на шаге 2, функции уже увидят и запомнят некоторую информацию, присутствующую в тестовом сгибе при каждом запуске перекрестной проверки. Результатом будет чрезмерно оптимистичная оценка ошибки теста, и это называетсясмещение выбора функции . Чтобы учесть это в своих оценках, вам нужно было бы поместить шаг выбора функции в цикл перекрестной проверки шага 2.
Хорошо, теперь мы хороши? Является ли лучшая ошибка, обнаруженная в перекрестной проверке с шагом выбора признаков внутри цикла, правильной оценкой ошибки обобщения?
В теории ответ все еще нет , проблема в том, что ваши гиперпараметры были выбраны, чтобы минимизировать ошибку перекрестной проверки для конкретного набора данных, который есть в вашем распоряжении, поэтому в определенном смысле вы подгоняете гиперпараметры к своим данным с риском переоснащение их, и это называется смещением выбора модели, Но является ли это проблемой на практике? Это зависит от конкретного применения: оно может стать более серьезным, так как переоснащение на тренировках, когда набор данных небольшой, а число гиперпараметров, которые нужно настроить, относительно велико. Чтобы учесть это при оценке ошибки обобщения, вы должны применить вложенную перекрестную проверку, как вы описали, которая затем даст вам правильную оценку вашей ошибки обобщения.
Наконец, чтобы ответить на ваш последний вопрос, после получения справедливой оценки вашей ошибки обобщения «процедуры построения модели» с вложенной перекрестной проверкой, вы просто применили бы процедуру (шаг 1 + 2) ко всему вашему набору данных, получая модель с фиксированным набором функции и установить значения гиперпараметров, но помните, что ошибка, которую мы ожидаем, что эта модель будет иметь на невидимых данных, является вложенной оценкой перекрестной проверки .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.