Выбор параметров и перекрестная проверка в k-кратном порядке
У меня есть один набор данных, и мне нужно выполнить перекрестную проверку, например, 10-кратную перекрестную проверку для всего набора данных. Я хотел бы использовать ядро радиальной базисной функции (RBF) с выбором параметров (для ядра RBF есть два параметра: C и гамма). Обычно люди выбирают гиперпараметры SVM, используя набор dev, а затем используют лучшие гиперпараметры на основе набора dev и применяют его к тестовому набору для оценок. Однако в моем случае исходный набор данных разделен на 10 подмножеств. Последовательно проверяется одно подмножество с использованием классификатора, обученного на оставшихся 9 подмножествах. Очевидно, что у нас нет фиксированных данных о тренировках и тестах. Как мне сделать выбор гиперпараметров в этом случае?
1 ответ
Ваши данные разбиты именно на эти 10 разделов по определенной причине? Если вы не можете объединить / снова перемешать их вместе, выполните регулярную (повторную) перекрестную проверку, чтобы выполнить поиск по сетке параметров. Например, с использованием 10 разделов и 10 повторов дает в общей сложности 100 обучающих и оценочных комплектов. Теперь они используются для обучения и оценки всех наборов параметров, поэтому вы получите 100 результатов для каждого набора параметров, который вы попробовали. Средняя производительность для набора параметров может быть вычислена из этих 100 результатов для набора.
Этот процесс уже встроен в большинство инструментов ML, как в этом коротком примере на R, с использованием caret
библиотека:
library(caret)
library(lattice)
library(doMC)
registerDoMC(3)
model <- train(x = iris[,1:4],
y = iris[,5],
method = 'svmRadial',
preProcess = c('center', 'scale'),
tuneGrid = expand.grid(C=3**(-3:3), sigma=3**(-3:3)), # all permutations of these parameters get evaluated
trControl = trainControl(method = 'repeatedcv',
number = 10,
repeats = 10,
returnResamp = 'all', # store results of all parameter sets on all partitions and repeats
allowParallel = T))
# performance of different parameter set (e.g. average and standard deviation of performance)
print(model$results)
# visualization of the above
levelplot(x = Accuracy~C*sigma, data = model$results, col.regions=gray(100:0/100), scales=list(log=3))
# results of all parameter sets over all partitions and repeats. From this the metrics above get calculated
str(model$resample)
После того, как вы оценили сетку гиперпараметров, вы можете выбрать разумный набор параметров ("выбор модели", например, путем выбора хорошо работающей, но все еще приемлемой, сложной модели).
Кстати: я бы порекомендовал повторную перекрестную проверку по перекрестной проверке, если это возможно (в конечном итоге, используя более 10 повторов, но детали зависят от вашей проблемы); и, как уже рекомендовано @ christian-cerri, хорошей дополнительной идеей будет наличие дополнительного невидимого набора тестов, который используется для оценки производительности вашей окончательной модели на новых данных.