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 construyenk(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