Подтвердить что ты не робот

Переподготовка после проверки креста с помощью libsvm

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

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

Btw я применяя 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 и гаммы, я использую этот код, который доступен в FAQ LIBSVM

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 и используем эту модель для прогнозирования? две аналогичные точности?

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

Еще один вопрос: в точности перекрестной проверки, каково значение C и гамма тогда?

Граф что-то вроде этого enter image description here

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

4b9b3361

Ответ 1

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

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

Это не сложно реализовать: создайте сетку значений с помощью 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

Ответ 2

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