2009-12-24 11 views
35

En cada libro y ejemplo siempre muestran solo la clasificación binaria (dos clases) y el nuevo vector puede pertenecer a cualquier clase.Cómo hacer la clasificación de clases múltiples usando máquinas de vectores de soporte (SVM)

Aquí el problema es que tengo 4 clases (c1, c2, c3, c4). Tengo datos de entrenamiento para 4 clases.

Para nuevo vector de la salida debería ser como

C1 80% (el ganador)

c2 10%

c3 6%

c4 4%

Cómo hacer t ¿su? Estoy planeando usar libsvm (porque es el más popular). No sé mucho sobre eso. Si alguno de ustedes lo usó anteriormente, por favor díganme los comandos específicos que se supone que debo usar.

Respuesta

3

Siempre puede reducir un problema de clasificación de clases múltiples a un problema binario eligiendo particiones aleatorias del conjunto de clases, recursivamente. Esto no es necesariamente menos eficaz o eficiente que aprender todo de una vez, ya que los problemas de subaprendizaje requieren menos ejemplos ya que el problema de partición es más pequeño. (Puede requerir como mucho un tiempo de orden constante más, por ejemplo, el doble de tiempo). También puede conducir a un aprendizaje más preciso.

No estoy necesariamente recomendando esto, pero es una respuesta a su pregunta, y es una técnica general que se puede aplicar a cualquier algoritmo de aprendizaje binario.

11

Los métodos comúnmente utilizados son One vs. Rest y One vs. One. En el primer caso obtiene n clasificadores y la clase resultante con la puntuación más alta En la segunda clase, la clase resultante se obtiene por mayoría de votos de todos los clasificadores.

AFAIR, libsvm admite ambas estrategias de multiclass.

+3

pensé libsvm sólo admite uno contra uno. Pero funciona realmente bien, sin embargo. –

30

LibSVM utiliza el enfoque one-on-one para problemas de aprendizaje de clase múltiple. De FAQ:

P: ¿Qué método usa libsvm para la clase múltiple de SVM? ¿Por qué no usas el método "1 contra el resto"?

Es uno-contra-uno. Lo elegimos después de hacer la siguiente comparación: C.-W. Hsu y C.-J. Lin. A comparison of methods for multi-class support vector machines, IEEE Transactions on Neural Networks, 13 (2002), 415-425.

"1-contra-el resto" es un buen método cuyo rendimiento es comparable a "1-contra-1". Hacemos esto último simplemente porque su tiempo de entrenamiento es más corto.

0

No tiene un interruptor específico (comando) para la predicción multiclase. maneja automáticamente la predicción multiclase si su conjunto de datos de entrenamiento contiene más de dos clases.

0

Nada especial comparado con la predicción binaria.vea el siguiente ejemplo para la predicción de 3 clases basada en 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

puede agregar cualquier descripción para ayudar al usuario a entenderlo? su respuesta tiene menos valor si es solo el código:/ – goto

+0

all_dataset.mat tiene 15 clases, utilizo svm de clasificación múltiple basado en la construcción de ons frente a un clasificador svm binario. – lin0Xu

Cuestiones relacionadas