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: p> J'aurais peut-être fait des erreurs. J'aimerais entendre des commentaires. Merci. P> 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. P> p>
3 Réponses :
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: P>
TrainingLabel Code> pour la formation? À mon avis, devrait-il être Modèle = SVMTRAIN (NewClass, Trainvec, '-C 1-g 0.00154'); Code>? Li>
- 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 code> Switch in LibSvm pour activer la production de probabilité améliorera également la précision. LI>
ol>
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) code> plutôt que
testlabel code > 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/...
%# 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
Au lieu d'estimations de probabilité, vous pouvez également utiliser les valeurs de décision comme suit pour atteindre le même objectif. p> p>
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' code> (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