2009-12-24 25 views
35

In ogni libro ed esempio, mostrano sempre solo la classificazione binaria (due classi) e il nuovo vettore può appartenere a una qualsiasi classe.Come classificare in più classi usando Support Vector Machines (SVM)

Qui il problema è che ho 4 classi (c1, c2, c3, c4). Ho dati di allenamento per 4 classi.

Per nuovo vettore l'uscita dovrebbe essere come

C1 80% (vincitore)

c2 10%

c3 6%

c4 4%

Come fare t il suo? Sto pensando di usare libsvm (perché è più popolare). Non ne so molto. Se qualcuno di voi l'ha usato in precedenza, per favore, dimmi i comandi specifici che dovrei usare.

risposta

3

È sempre possibile ridurre un problema di classificazione multi-classe a un problema binario scegliendo in modo casuale partizioni casuali dell'insieme di classi. Questo non è necessariamente meno efficace o efficiente rispetto all'apprendimento di tutto in una volta, poiché i problemi di sub-apprendimento richiedono meno esempi poiché il problema di partizionamento è minore. (Potrebbe richiedere al massimo un tempo di ordine costante di più, ad esempio il doppio del tempo). Può anche portare a un apprendimento più accurato.

Non lo raccomando necessariamente, ma è una risposta alla tua domanda ed è una tecnica generale che può essere applicata a qualsiasi algoritmo di apprendimento binario.

11

I metodi comunemente utilizzati sono One vs. Rest e One vs. One. Nel primo caso si ottengono n classificatori e la classe risultante con il punteggio più alto Nella seconda classe la classe risultante è ottenuta con il voto di maggioranza di tutti i classificatori.

AFAIR, libsvm supporta entrambe le strategie di multiclasse.

+3

ho pensato libsvm supporta solo una contro uno. Ma funziona davvero bene, però. –

30

LibSVM utilizza l'approccio one-to-one per problemi di apprendimento multi-classe. Da FAQ:

D: Quale metodo utilizza libsvm per SVM multi-classe? Perché non usi il metodo "1 contro il riposo"?

È uno contro uno. L'abbiamo scelto dopo aver fatto il seguente confronto: C.-W. Hsu e C.-J. Lin. A comparison of methods for multi-class support vector machines, Transazioni IEEE su reti neurali, 13 (2002), 415-425.

"1 contro il resto" è un buon metodo la cui prestazione è paragonabile a "1 contro 1". Facciamo quest'ultimo semplicemente perché il suo tempo di allenamento è più breve.

0

Non ha un interruttore specifico (comando) per la previsione multi-classe. gestisce automaticamente la previsione multi-classe se il set di dati di allenamento contiene più di due classi.

0

Niente di speciale rispetto alla previsione binaria.vedere il seguente esempio per la previsione a 3 classi basata su SVM.

install.packages("e1071") 
library("e1071") 
data(iris) 
attach(iris) 
## classification mode 
# default with factor response: 
model <- svm(Species ~ ., data = iris) 
# alternatively the traditional interface: 
x <- subset(iris, select = -Species) 
y <- Species 
model <- svm(x, y) 
print(model) 
summary(model) 
# test with train data 
pred <- predict(model, x) 
# (same as:) 
pred <- fitted(model) 
# Check accuracy: 
table(pred, y) 
# compute decision values and probabilities: 
pred <- predict(model, x, decision.values = TRUE) 
attr(pred, "decision.values")[1:4,] 
# visualize (classes by color, SV by crosses): 
plot(cmdscale(dist(iris[,-5])), 
    col = as.integer(iris[,5]), 
    pch = c("o","+")[1:150 %in% model$index + 1]) 
0
data=load('E:\dataset\scene_categories\all_dataset.mat'); 
    meas = data.all_dataset; 
    species = data.dataset_label; 
    [g gn] = grp2idx(species);      %# nominal class to numeric 

%# split training/testing sets 
[trainIdx testIdx] = crossvalind('HoldOut', species, 1/10); 
%# 1-vs-1 pairwise models 
num_labels = length(gn); 
clear gn; 
num_classifiers = num_labels*(num_labels-1)/2; 
pairwise = zeros(num_classifiers ,2); 
row_end = 0; 
for i=1:num_labels - 1 
    row_start = row_end + 1; 
    row_end = row_start + num_labels - i -1; 
    pairwise(row_start : row_end, 1) = i; 
    count = 0; 
    for j = i+1 : num_labels   
     pairwise(row_start + count , 2) = j; 
     count = count + 1; 
    end  
end 
clear row_start row_end count i j num_labels num_classifiers; 
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), ... 
       'Autoscale',true, 'Showplot',false, 'Method','QP', ... 
       'BoxConstraint',2e-1, 'Kernel_Function','rbf', 'RBF_Sigma',1); 

    %# 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) 
+5

puoi aggiungere qualche descrizione per aiutare l'utente a capirlo? la tua risposta ha meno valore se è solo il codice:/ – goto

+0

all_dataset.mat ha 15 classi, io uso svm multi-classificazione basato sulla costruzione di ons vs un classificatore svm binario. – lin0Xu

Problemi correlati