Переподготовка после перекрестной проверки с помощью libsvm - PullRequest
17 голосов
/ 28 января 2012

Я знаю, что перекрестная проверка используется для выбора хороших параметров.После их нахождения мне нужно заново обучить все данные без опции -v.

Но проблема, с которой я сталкиваюсь, заключается в том, что после обучения с опцией -v я получаю точность перекрестной проверки (например, 85%).Там нет модели, и я не могу видеть значения C и гамма.В таком случае, как мне переобучиться?

Кстати, я применяю 10-кратную перекрестную проверку.например,

optimization finished, #iter = 138
nu = 0.612233
obj = -90.291046, rho = -0.367013
nSV = 165, nBSV = 128
Total nSV = 165
Cross Validation Accuracy = 98.1273%

Нужна помощь ...

Чтобы получить лучшую C и гамму, я использую этот код, который доступен в LIBSVM FAQ

bestcv = 0;
for log2c = -6:10,
  for log2g = -6:3,
    cmd = ['-v 5 -c ', num2str(2^log2c), ' -g ', num2str(2^log2g)];
    cv = svmtrain(TrainLabel,TrainVec, cmd);
    if (cv >= bestcv),
      bestcv = cv; bestc = 2^log2c; bestg = 2^log2g;
    end
    fprintf('(best c=%g, g=%g, rate=%g)\n',bestc, bestg, bestcv);
  end
end

Другой вопрос: похожа ли точность перекрестной проверки после использования опции -v на ту, которую мы получаем, когда тренируемся без опции -v и используем эту модель для прогнозирования?похожи ли две точности?

Еще один вопрос: перекрестная проверка в основном повышает точность модели, избегая переобучения.Таким образом, он должен иметь модель на месте, прежде чем он сможет улучшить.Я прав?Кроме того, если у меня другая модель, то точность перекрестной проверки будет другой?Прав ли я?

Еще один вопрос: в чем же тогда заключается точность кросс-проверки?

График примерно такой enter image description here

Тогда значения C равны 2, а гамма = 0,0078125.Но когда я переучиваю модель с новыми параметрами.Значение не совпадает с 99,63%.Может ли быть какая-то причина?Заранее спасибо ...

Ответы [ 2 ]

31 голосов
/ 29 января 2012

Опция -v здесь на самом деле предназначена для того, чтобы избежать проблемы переоснащения (вместо использования целых данных для обучения, проведите N-кратную тренировку перекрестной проверки на N-1 сгибах и тестирование наоставшийся сгиб, по одному, затем сообщите среднюю точность).Таким образом, он возвращает только точность перекрестной проверки (при условии, что у вас есть проблема классификации, в противном случае среднеквадратичная ошибка для регрессии) в виде скалярного числа вместо фактической модели SVM.

Если вы хотите выполнить выбор модели,вам нужно реализовать поиск по сетке с использованием перекрестной проверки (аналогично скрипту grid.py helper python), чтобы найти лучшие значения C и gamma.

Thisне должно быть сложно реализовать: создать сетку значений, используя MESHGRID, выполнить итерацию по всем парам (C,gamma) обучение модели SVM с, скажем, 5-кратной перекрестной проверкой и выбор значений с наилучшей CV-точностью ...

Пример:

%# read some training data
[labels,data] = libsvmread('./heart_scale');

%# grid of parameters
folds = 5;
[C,gamma] = meshgrid(-5:2:15, -15:2:3);

%# grid search, and cross-validation
cv_acc = zeros(numel(C),1);
for i=1:numel(C)
    cv_acc(i) = svmtrain(labels, data, ...
                    sprintf('-c %f -g %f -v %d', 2^C(i), 2^gamma(i), folds));
end

%# pair (C,gamma) with best accuracy
[~,idx] = max(cv_acc);

%# contour plot of paramter selection
contour(C, gamma, reshape(cv_acc,size(C))), colorbar
hold on
plot(C(idx), gamma(idx), 'rx')
text(C(idx), gamma(idx), sprintf('Acc = %.2f %%',cv_acc(idx)), ...
    'HorizontalAlign','left', 'VerticalAlign','top')
hold off
xlabel('log_2(C)'), ylabel('log_2(\gamma)'), title('Cross-Validation Accuracy')

%# now you can train you model using best_C and best_gamma
best_C = 2^C(idx);
best_gamma = 2^gamma(idx);
%# ...

contour_plot

1 голос
/ 27 февраля 2012

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

...