web-dev-qa-db-fra.com

Comment faire une classification multi-classes à l'aide de machines à vecteurs de support (SVM)

Dans chaque livre et chaque exemple, ils ne montrent toujours qu'une classification binaire (deux classes) et le nouveau vecteur peut appartenir à une classe.

Ici le problème est que j'ai 4 classes (c1, c2, c3, c4). J'ai des données d'entraînement pour 4 cours.

Pour le nouveau vecteur, la sortie devrait être comme

C1 80% (le gagnant)

c2 10%

c3 6%

c4 4%

Comment faire ça? Je prévois d'utiliser libsvm (car c'est le plus populaire). Je ne sais pas grand chose à ce sujet. Si certains d'entre vous l'ont déjà utilisé, dites-moi les commandes spécifiques que je suis censé utiliser.

45
mlguy

LibSVM utilise l’approche one-against-one pour les problèmes d’apprentissage multi-classes. De la FAQ :

Q: Quelle méthode libsvm utilise-t-elle pour les SVM multi-classes? Pourquoi n'utilisez-vous pas la méthode "1 contre le reste"? 

C'est un contre un. Nous l'avons choisi après la comparaison suivante: C.-W. Hsu et C.-J. Lin. Comparaison des méthodes pour les machines à vecteurs de support multi-classes , IEEE Transactions on Neural Networks, 13 (2002), 415-425.

"1 contre le reste" est une bonne méthode dont les performances sont comparables à "1 contre 1". Nous faisons ce dernier simplement parce que son temps d’entraînement est plus court.

35
Oben Sonne

Les méthodes couramment utilisées sont One vs. Rest et One vs. One . Dans la première méthode, vous obtenez n classificateurs et la classe résultante aura le score le plus élevé . Dans la seconde méthode, la classe résultante est obtenue par vote majoritaire. de tous les classificateurs.

AFAIR, libsvm supporte les deux stratégies de classification multiclass.

16
Anton Kazennikov

Vous pouvez toujours réduire un problème de classification multi-classes à un problème binaire en choisissant des partitions aléatoires de l'ensemble des classes, de manière récursive. Cela n’est pas nécessairement moins efficace ou efficient que l’apprentissage simultané, car les problèmes de sous-apprentissage exigent moins d’exemples car le problème de partitionnement est plus petit. (Cela peut nécessiter au plus un temps de commande constant de plus, par exemple deux fois plus longtemps). Cela peut également conduire à un apprentissage plus précis.

Je ne le recommande pas nécessairement, mais c’est une réponse à votre question. C’est une technique générale qui peut être appliquée à n’importe quel algorithme d’apprentissage binaire.

4
Larry Watanabe

Utilisez la bibliothèque SVM Multiclass. Trouvez-le sur la page SVM de Thorsten Joachims

1
Birhanu Eshete

Il n'a pas de commutateur spécifique (commande) pour la prédiction multi-classe. il gère automatiquement la prédiction multi-classes si votre jeu de données d'apprentissage contient plus de deux classes.

0
Hamed

Rien de spécial par rapport à la prédiction binaire. voir l'exemple suivant pour la prédiction à 3 classes basée sur 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
Shicheng Guo
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)
0
lin0Xu