В настоящее время я запутался в реализации SVM с кросс-валидацией с использованием Matlab. В stackoverflow есть много сообщений, в которых упоминаются фрагменты информации о SVM и его перекрестная проверка; однако, нет полного примера, даже используя простейшие наборы данных "fishiris".
Я кратко изложил эти сообщения с проблемами следующим образом:
а. Бинарный и многоуровневый SVM: Ответил поддержка векторных машин в Matlab но без примера перекрестной проверки.
б. Перекрестная проверка с использованием SVM: Пример 10-кратной классификации SVM в MATLAB но без примера многоуровневого SVM.
с. Один-против-один и один против всех SVM: 1-против-1 можно найти по адресу поддержка векторных машин в Matlab 1-против-все можно найти по адресу Классификация нескольких классов в libsvm Multi-Class SVM (один против всех) Нет примера перекрестной проверки
д. libSVM и Matlab встроенный SVM (статистический инструментарий) Частично полный пример использования libSVM можно найти в 10-кратная перекрестная проверка в SVN с одним и тем же (с использованием LibSVM)
е. Оптимизация параметров Переподготовка после перекрестной проверки с помощью libsvm
Но все очень сложно для изучения и, в конечном итоге, развертывания SVM для их реальной проблемы, и это проблематично и ошибочно, просто глядя на эти предыдущие сообщения. По крайней мере, я глуп, чтобы решить проблему головоломки.
Почему мы не собираемся создавать легко понятные коды для SVM со следующими функциями?
а. Просто используйте данные "fisheriris".
В. Может использоваться для двоичной и многоуровневой задачи (ловушки могут быть выбраны как двоичные).
С. Внедрить перекрестное подтверждение.
Д. Реализуйте как "один против одного", так и "один против всех".
Е. Две версии с использованием libSVM и Matlab встроенных SVM соответственно. Поскольку svmtrain является одним и тем же именем для обоих пакетов, я предлагаю изменить его на libsvmtrain и MEX перед использованием. Мы также можем сравнить эти два метода.
F. В настоящее время из-за разделения данных обучения/тестирования результаты не всегда воспроизводимы. Можем ли мы это исправить?
F. (Необязательно) Добавить оптимизацию параметров.
G. (Необязательно) Добавить анализ ROC.
Мой старт - это некоторые коды, например:
#% libSVM version_1
clc; clear all;
load fisheriris
[~,~,labels] = unique(species); % Labels: 1/2/3
data = zscore(meas); % Scale features
numInst = size(data,1);
numLabels = max(labels);
%# Split training/testing
idx = randperm(numInst);
numTrain = 100;
numTest = numInst - numTrain;
trainData = data(idx(1:numTrain),:);
testData = data(idx(numTrain+1:end),:);
trainLabel = labels(idx(1:numTrain));
testLabel = labels(idx(numTrain+1:end));
%# Train one-against-all models
model = cell(numLabels,1);
for k=1:numLabels
model{k} = libsvmtrain(double(trainLabel==k), trainData, '-c 1 -g 0.2 -b 1');
end
%# Get probability estimates of test instances using each model
prob = zeros(numTest,numLabels);
for k=1:numLabels
[~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');
prob(:,k) = p(:,model{k}.Label==1); % Probability of class==k
end
% Predict the class with the highest probability
[~,pred] = max(prob,[],2);
acc = sum(pred == testLabel) ./ numel(testLabel); % Accuracy
C = confusionmat(testLabel, pred); % Confusion matrix
#
% Matlab build-in SVM version_1
clc; clear all;
load fisheriris
[g, gn] = grp2idx(species); % Nominal class to numeric
% Split training and testing sets
[trainIdx, testIdx] = crossvalind('HoldOut', species, 1/3);
pairwise = nchoosek(1:length(gn),2); % 1-vs-1 pairwise models
svmModel = cell(size(pairwise,1),1); % Store binary-classifers
predTest = zeros(sum(testIdx),numel(svmModel)); % Store binary predictions
%# classify using one-against-one approach, SVM with 3rd degree poly kernel
for k=1:numel(svmModel)
%# get only training instances belonging to this pair
idx = trainIdx & any( bsxfun(@eq, g, pairwise(k,:)) , 2 );
%# train
svmModel{k} = svmtrain(meas(idx,:), g(idx), ...
'BoxConstraint',2e-1, 'Kernel_Function','polynomial', 'Polyorder',3);
%# test
predTest(:,k) = svmclassify(svmModel{k}, meas(testIdx,:));
end
pred = mode(predTest,2); % Voting: clasify as the class receiving most votes
%# performance
cmat = confusionmat(g(testIdx),pred);
acc = 100*sum(diag(cmat))./sum(cmat(:));
fprintf('SVM (1-against-1):\naccuracy = %.2f%%\n', acc);
fprintf('Confusion Matrix:\n'), disp(cmat)
Пожалуйста, не стесняйтесь добавлять свои, пока мы не закончим все миссии. Кто-то может также создать проект кода Google для нас, чтобы закончить это.
Большое спасибо.