teoria - Ejemplo completo de SVM de clase múltiple con validación cruzada usando Matlab
svm para regresion (0)
Actualmente estoy confundido sobre la implementación de SVM con validación cruzada usando Matlab ahora. Hay muchas publicaciones en stackoverflow que mencionan datos sobre SVM y su validación cruzada; sin embargo, no existe un ejemplo completo incluso utilizando los conjuntos de datos ''fisheriris'' más simples.
He resumido esas publicaciones con los problemas de la siguiente manera:
a. SVM binario y de múltiples clases: respondido por máquinas de vectores de soporte en matlab pero sin ejemplo de validación cruzada.
segundo. Validación cruzada usando SVM: Ejemplo de clasificación de SVM de 10 veces en MATLAB pero sin ejemplo de SVM de clase múltiple.
do. SVM uno contra uno y uno contra todos: se puede encontrar 1 contra 1 en las máquinas de vectores de soporte en matlab 1-contra-todo se puede encontrar en la clasificación de clases múltiples en libsvm Multi-Class SVM (uno contra todos) ) Ningún ejemplo de validación cruzada
re. SVM incorporado de libSVM y Matlab (caja de herramientas estadística) Se puede encontrar un ejemplo parcialmente completo usando libSVM en una validación cruzada de 10 veces en SVM uno contra todos (usando LibSVM)
mi. Optimización de parámetros Reentrenamiento después de la validación cruzada con libsvm
Pero las cosas son realmente complicadas para que uno aprenda y, finalmente, implemente SVM para su problema real, y es problemático y falible con solo mirar estas publicaciones anteriores. Al menos soy estúpido para resolver el problema del rompecabezas.
¿Por qué no construimos juntos códigos fácilmente comprensibles para SVM con las siguientes características?
R. Solo usa los datos de ''fisheriris''.
B. Puede ser usado para problemas binarios y de clases múltiples (fisheriris puede ser elegido para ser binario).
C. Implementar la validación cruzada.
D. Implementar tanto uno contra uno como uno contra todos.
E. Dos versiones que usan SVM compilable libSVM y Matlab respectivamente. Como svmtrain es el mismo nombre para ambos paquetes, sugiero que lo cambiemos a libsvmtrain y MEX antes de su uso. Entonces podemos comparar estos dos métodos también.
F. Actualmente, debido a la separación de datos de entrenamiento / prueba, los resultados no siempre son reproducibles. ¿Podemos arreglar esto?
F. (Opcional) Agregar optimización de parámetros.
G. (Opcional) Agregue el análisis ROC.
Mi comienzo es algunos códigos como:
#% 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)
Por favor, siéntase libre de agregar el suyo hasta que terminemos todas las misiones. Alguien también puede crear un proyecto de código de Google para que podamos terminar esto.
Muchas gracias.