svmtrain fitcsvm example ejemplo code autoscale matlab machine-learning classification libsvm svm

matlab - fitcsvm - Clasificación de clases múltiples en libsvm



svm matlab example (1)

Estoy trabajando con libsvm y debo implementar la clasificación de multiclasses con uno versus todos .

¿Cómo puedo hacerlo?
¿ libsvm versión de libsvm 2011 usa esto?

Creo que mi pregunta no es muy clara. si libsvm no usa automáticamente uno versus todos, usaré un svm para cada clase, de lo contrario, ¿cómo puedo definir estos parámetros en la función svmtrain ? Leí README de libsvm.


De acuerdo con la documentación oficial de libsvm (Sección 7):

LIBSVM implementa el enfoque "uno contra uno" para la clasificación de clases múltiples. Si k es el número de clases, entonces se construyen k(k-1)/2 clasificadores y cada uno entrena datos de dos clases.

En la clasificación utilizamos una estrategia de votación: cada clasificación binaria se considera una votación en la que se pueden emitir los votos para todos los puntos de datos x; al final, un punto se designa para estar en una clase con el número máximo de votos.

En el enfoque de uno contra todos , creamos tantos clasificadores binarios como clases, cada uno entrenado para separar una clase del resto. Para predecir una nueva instancia, elegimos el clasificador con el mayor valor de función de decisión.

Como mencioné antes, la idea es entrenar k modelos SVM, cada uno separando una clase del resto. Una vez que tenemos esos clasificadores binarios, usamos los resultados de probabilidad (la opción -b 1 ) para predecir nuevas instancias seleccionando la clase con la probabilidad más alta.

Considere el siguiente ejemplo:

%# Fisher Iris dataset 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));

Aquí está mi implementación para el enfoque de uno contra todos para SVM multiclasmo:

%# train one-against-all models model = cell(numLabels,1); for k=1:numLabels model{k} = svmtrain(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