(Я уверен, что я написал большую часть этого уже в некотором ответе - но не могу найти это прямо сейчас. Если кто-то наткнется на этот ответ, пожалуйста, свяжите его). Здесь я вижу два немного разных подхода, которые, на мой взгляд, разумны.
Но сначала немного терминологии:
- Исходя из прикладной области, (приспособленная / обученная) модель для меня готова к использованию. Т.е. модель содержит всю информацию, необходимую для генерации прогнозов для новых данных. Таким образом, модель содержит также гиперпараметры . Как вы увидите, эта точка зрения тесно связана с подходом 2 ниже.
- OTOH, алгоритм обучения в моем опыте не очень хорошо определен в следующем смысле: чтобы получить (подогнанную) модель, нужно сделать не только - давайте назовем это «первичной подгонкой» - «нормальных» параметров модели, но и гиперпараметры должны быть исправлены. С моей точки зрения приложения, между параметрами и гиперпарамерами нет большой разницы: оба являются частью модели , и их необходимо оценивать / определять во время обучения.
Я предполагаю, что разница между ними связана с разницей между тем, кто разрабатывает новые алгоритмы обучения, которые обычно описывают класс алгоритмов обучения вместе с некоторыми параметрами управления ( гиперпараметрами).) которые трудно / невозможно исправить (или, по крайней мере, исправить то, как они должны быть определены / оценены) без знания приложения / предметной области.
Подход 1: требовать стабильных результатов оптимизации
При таком подходе «обучение модели» является подбором «нормальных» параметров модели, и задаются гиперпараметры . Например, внутренняя перекрестная проверка обеспечивает оптимизацию гиперпараметра.
Здесь решающий шаг / предположение для решения дилеммы, чей набор гиперпараметров должен быть выбран, состоит в том, чтобы потребовать, чтобы оптимизация была устойчивой . Перекрестная проверка для целей проверки предполагает, что все суррогатные модели достаточно похожи на окончательную модель (полученную с помощью того же алгоритма обучения, примененного ко всему набору данных), что позволяет рассматривать их как равные (как между собой, так и с конечной моделью). Если это предположение нарушается и
суррогатные модели по-прежнему равны (или эквивалентны) между собой, но не до окончательной модели, речь идет об известном пессимистическом смещении перекрестной проверки.
Если также суррогатная модель не равна / эквивалентна друг другу, у нас возникают проблемы с нестабильностью .
Для результатов оптимизации внутреннего цикла это означает, что если оптимизация стабильна, то при выборе гиперпараметров нет конфликта . И если наблюдается значительный разброс результатов внутренней перекрестной проверки, оптимизация не является стабильной . Нестабильные учебные ситуации имеют гораздо худшие проблемы, чем просто решение, какой из наборов гиперпараметров выбрать, и я действительно рекомендую отступить в этом случае и начать процесс моделирования заново.
Однако здесь есть исключение: в оптимизации может быть несколько локальных минимумов, дающих равную производительность для практических целей. Требование также, чтобы выбор между ними был стабильным, может быть ненужным сильным требованием - но я не знаю, как выйти из этой дилеммы.
Обратите внимание, что если не все модели дают одинаковый набор параметров выигрыша, вы не должны использовать оценки внешнего цикла в качестве ошибки обобщения здесь:
- п
(Представьте, что кто-то сказал вам, что они провели перекрестную проверку на модели с 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 = 2
rbf с 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)