2009-12-24 19 views
35

In jedem Buch und Beispiel zeigen sie immer nur binäre Klassifizierung (zwei Klassen) und neue Vektor kann zu jeder Klasse gehören.Wie man Mehrklassenklassifizierung mit Support Vector Machines (SVM) macht

Hier ist das Problem, ich habe 4 Klassen (C1, C2, C3, C4). Ich habe Trainingsdaten für 4 Klassen.

Für neuen Vektor sollte die Ausgabe wie

C1 80% (Sieger)

c2 10%

c3 6%

c4 4%

seine

Wie t zu tun seine? Ich plane, libsvm zu benutzen (weil es am populärsten ist). Ich weiß nicht viel darüber. Wenn einer von euch es früher benutzt hat, sagt mir bitte, welche Befehle ich benutzen soll.

Antwort

3

Sie können ein Klassifikationsproblem mit mehreren Klassen immer auf ein binäres Problem reduzieren, indem Sie zufällige Partitionen der Klassen rekursiv auswählen. Dies ist nicht notwendigerweise weniger effektiv oder effizient als das Lernen auf einmal, da die Unterlernprobleme weniger Beispiele erfordern, da das Partitionierungsproblem kleiner ist. (Es kann höchstens eine konstante Ordnungszeit mehr erfordern, beispielsweise zweimal so lang). Es kann auch zu genauerem Lernen führen.

Ich empfehle nicht unbedingt, aber es ist eine Antwort auf Ihre Frage, und ist eine allgemeine Technik, die auf jeden binären Lernalgorithmus angewendet werden kann.

11

Häufig verwendete Methoden sind One vs. Rest und One vs. One. Im ersten Fall erhalten Sie n Klassifikatoren und die resultierende Klasse mit der höchsten Punktzahl In der zweiten Klasse wird die resultierende Klasse durch Mehrheitswahl aller Klassifizierer erhalten.

AFAIR, libsvm unterstützt beide Strategien der Multiclass.

+3

Ich dachte LIBSVM unterstützt nur eine gegen eins. Aber es funktioniert wirklich gut. –

30

LibSVM verwendet den One-on-One-Ansatz für Lernprobleme mit mehreren Klassen. Von der FAQ:

F: Welche Methode verwendet libsvm für SVM Multi-Klasse? Warum benutzt du nicht die Methode "1 gegen den Rest"?

Es ist eins gegen eins. Wir haben es nach dem folgenden Vergleich gewählt: C.-W. Hsu und C.-J. Lin. A comparison of methods for multi-class support vector machines, IEEE Transactions on Neural Networks, 13 (2002), 415-425.

"1-gegen-den-Rest" ist eine gute Methode, deren Leistung mit "1 gegen 1" vergleichbar ist. Wir machen das letztere, weil seine Trainingszeit kürzer ist.

0

Es hat keinen bestimmten Schalter (Befehl) für Multi-Class-Vorhersage. Wenn Ihr Trainingsdatenset mehr als zwei Klassen enthält, behandelt es automatisch die Vorhersage mehrerer Klassen.

0

Nichts besonderes im Vergleich zur binären Vorhersage.Sehen Sie sich das folgende Beispiel für die 3-Klassen-Vorhersage basierend auf SVM an.

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

können Sie eine Beschreibung hinzufügen, um dem Benutzer das Verständnis zu erleichtern? Ihre Antwort hat weniger Wert, wenn es nur der Code ist:/ – goto

+0

all_dataset.mat hat 15 Klassen, ich benutze Multi-Klassifikations-SVM basierend auf dem Konstruieren gegen einen binären SVM-Klassifikator. – lin0Xu

Verwandte Themen