two tutorial support rpubs machine for ejemplos dummies code classifier machine-learning svm libsvm

machine learning - tutorial - Cómo hacer una clasificación de clase múltiple usando Support Vector Machines(SVM)



support vector machine tutorial (7)

LibSVM utiliza el enfoque de uno contra uno para problemas de aprendizaje de clase múltiple. De las FAQ :

P: ¿Qué método usa libsvm para SVM de múltiples clases? ¿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. Una comparación de métodos para máquinas de vectores de soporte multiclase, 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.

En cada libro y ejemplo siempre muestran solo una clasificación binaria (dos clases) y el nuevo vector puede pertenecer a cualquier clase.

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

Para un vector nuevo, la salida debería ser como

C1 80% (el ganador)

c2 10%

c3 6%

c4 4%

¿Como hacer esto? 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.


Los métodos más utilizados son One vs. Rest y One vs. One. En el primer caso, obtienes n clasificadores y la clase resultante con el puntaje más alto. 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.


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])


No tiene un interruptor (comando) específico 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.


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.



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)