11
votes

SVM multi-classes (un contre tout)

Je sais que libsvm permet uniquement une classification à une vs-une en matière de SVM multi-classes. Cependant, je voudrais le modifier un peu pour effectuer une classification un contre-all. J'ai essayé de jouer un contre-tout ci-dessous. Est-ce la bonne approche?

Le code: xxx

J'aurais peut-être fait des erreurs. J'aimerais entendre des commentaires. Merci.

deuxième partie: Comme le dit Grapeot: J'ai besoin de faire une mise en commun (ou de voter comme une solution simplifiée) pour proposer la réponse finale. Je ne sais pas comment le faire. J'ai besoin d'aide pour cela; J'ai vu le fichier python mais je ne suis toujours pas très sûr. J'ai besoin d'aide.


3 commentaires

Quelle est la question exactement? Vous vous demandez comment effectuer une classification sur une VS-VS avec Libsvm? Le programme émet-il le résultat que vous attendez? BTW, les paramètres de libsvm doivent être '- C 1-g 0.00153' (vous avez manqué à la fin de la citation unique).


J'ai édité la question ...


@Lakesh: J'ai posté une réponse à une question similaire, vous trouverez peut-être utile: Stackoverflow.com/a/9049808/97160


3 Réponses :


4
votes

Du code que je peux voir que vous essayez d'abord de tourner les étiquettes en "certaines classes" vs "pas de cette classe", puis invoquer libsvm à faire de la formation et de tester. Quelques questions et suggestions:

  1. Pourquoi utilisez-vous l'original TrainingLabel pour la formation? À mon avis, devrait-il être Modèle = SVMTRAIN (NewClass, Trainvec, '-C 1-g 0.00154'); ?
  2. Avec un mécanisme de formation modifié, vous devez également modifier la partie de prédiction, telle que l'utilisation de Sum-Fooling pour déterminer l'étiquette finale. Utilisation de -B Switch in LibSvm pour activer la production de probabilité améliorera également la précision.

10 commentaires

merci beaucoup ... BTW, savez-vous comment faire un vs on en utilisant libsvm? Je ne sais pas comment le faire ...


Il suffit de mettre des étiquettes autres que 0 <=> 1 ou -1 <=> 1 comme entrée est bonne. Libsvm le reconnaîtra et essaie de faire une classification multi-classes.


btw il me donne cette erreur lorsque je le change à NewClass: Erreur: la matrice de l'étiquette et une matrice d'instance doit être un fichier de modèle double doit être un tableau de struct.


Quand je change NewClass = C1; à NewClass = Double (C1);, ça me donne 0% de classification


Peut-être que vous pouvez suivre pour vérifier la valeur de C1? Est-ce que 1 et 0?


Une mise en œuvre officielle en Python de Python à Python sur la base de la libsvm peut être trouvée sur le site Web: csie.ntu.edu.tw/~cjlin/libsvmTools/multilabel


Si vous souhaitez calculer la précision de la classification directement à partir de Libsvm, assurez-vous que la vérité au sol versée à SVMPRACT est correcte, c'est-à-dire qu'ils devraient être comme (testlabel == ITR) plutôt que testlabel eux-mêmes. Ou vous pouvez écrire votre propre implémentation pour calculer la précision / rappel.


Encore une fois merci. Désolé de vous avoir dérangé .. L'étiquette de prédéfinie est 0 et 1. Ne devrait-il pas être en nombre que j'utilise comme 1 à 6?


Oui, c'est par conception. Notez que vous résolvez le problème par une série de classificateurs binaires. Par conséquent, la sortie du SVMS est binaire, mais vous devez faire une somme de somme (ou vote comme solution simplifiée) pour proposer la réponse finale. Vous pouvez consulter le fichier Python mentionné précédemment. :)


@grapeot s'il vous plaît pouvez-vous m'aider ici? merci beaucoup Stackoverflow.com/questions/654449934/...



10
votes
%# Fisher Iris dataset
load fisheriris
[~,~,labels] = unique(species);   %# labels: 1/2/3
data = zscore(meas);              %# scale features
numInst = size(data,1);
numLabels = max(labels);

%# split training/testing
idx = randperm(numInst);
numTrain = 100; numTest = numInst - numTrain;
trainData = data(idx(1:numTrain),:);  testData = data(idx(numTrain+1:end),:);
trainLabel = labels(idx(1:numTrain)); testLabel = labels(idx(numTrain+1:end));
%# train one-against-all models
model = cell(numLabels,1);
for k=1:numLabels
    model{k} = svmtrain(double(trainLabel==k), trainData, '-c 1 -g 0.2 -b 1');
end

%# get probability estimates of test instances using each model
prob = zeros(numTest,numLabels);
for k=1:numLabels
    [~,~,p] = svmpredict(double(testLabel==k), testData, model{k}, '-b 1');
    prob(:,k) = p(:,model{k}.Label==1);    %# probability of class==k
end

%# predict the class with the highest probability
[~,pred] = max(prob,[],2);
acc = sum(pred == testLabel) ./ numel(testLabel)    %# accuracy
C = confusionmat(testLabel, pred)                   %# confusion matrix

0 commentaires

1
votes

Au lieu d'estimations de probabilité, vous pouvez également utiliser les valeurs de décision comme suit xxx

pour atteindre le même objectif.


0 commentaires