2013-12-04 2 views
1

Я работаю над MATLAB LIBSVM на некоторое время, чтобы сделать прогноз. У меня есть набор данных, из которых я использую 75% для обучения, 15% для поиска лучших параметров и оставшихся для тестирования. Код приведен ниже.Выполнение дополнительной проверки в LIBSVM matlab

trainX and trainY are the input and output training instances 
testValX and testValY are the validation dataset I use 
for j = 1:100 
    for jj = 1:10 
     model(j,jj) = svmtrain(trainY,trainX,... 
     ['-s 3 -t 2 -c ' num2str(j) ' -p 0.001 -g ' num2str(jj) '-v 5']); 
     [predicted_label, ~, ~]=svmpredict(testValY,... 
     testValX,model(j,jj)); 
     MSE(j,jj) = sum(((predicted_label-testValY).^2)/2); 
    end 
end 
[min_val,min_indi] = min(MSE(:)); 
best_predicted_model_rbf(i) = model(min_indi); 

Вопрос в том, является ли это правильным. Я создаю модельную матрицу с разными значениями c и g. Я использую ключ -v, который является ключевым здесь. Из предсказанных моделей я использую набор данных проверки для прогнозирования, а там - среднюю квадратную ошибку. Используя этот MSE, я выбираю лучшие c и g. Поскольку я использую -v, который возвращает результат с проверкой перекрестных ссылок, является ли процедура правильной?

ответ

3

Во-первых, я думаю, что есть небольшая проблема с показанным кодом, а это то, что num2str(jj) '-v 5']); не имеет пробела перед -v. Это может привести к тому, что этот флаг не будет считан. В другом вопросе вы заявили, что это «иногда возвращает модель», что и произойдет, если этот флаг не был прочитан. Если флаг считывается, вы должны получить только номер, а не модель, когда используется флаг «-v».

Во-вторых, похоже, что вы делаете здесь две разные вещи, одна из которых была бы разумной сама по себе. При вызове svmtrain с '-v' выполняется перекрестная проверка на обучающем наборе. Это не должно возвращать модель, она должна просто вернуть оценку mse. Вы можете использовать эти оценки, чтобы определить, какая настройка параметров лучше всего, а затем обучить одну модель с этим параметром во всех данных обучения.

В любом случае, вы вызываете svmpredict (y, x, model) на проверочный набор проверки, testValX, но при вызове svmtrain с '-v' модель должна быть просто скаляром в этой точке. Чтобы этот вызов работал правильно, вы должны получить модель из svmtrain без '-v', чтобы она была структурой. Остальная часть того, что вы делаете, имеет смысл для этого случая, когда вы выполняете проверку на наличие проверки с помощью testValX.

+0

Это замечательный улов @Dthal. Я понял, что если перед -v нет пробела, флаг не учитывается. спасибо – ChanChow

Смежные вопросы