1

Bonjour, J'ai formé un classificateur dans Matlab et je voudrais tester sa précision. J'ai trouvé beaucoup de fonctions pour le faire et je laisse perplexe sur ce qu'il faut utiliser ...test classificateur de performance matlab

au moment:

% train my classifier 
svmStruct = fitcsvm(Xtrain,Ytrain,'KernelFunction','linear','Standardize',true); 

% predict the output of an unknown input <- this part takes a lot of time 
IDX_svm = zeros(size(Xtest,1),1); 
for j = 1 : size(Xtest,1)  
    IDX_svm(j) = predict(svmStruct,Xtest(j,:));  
end 

%compute performaces 
TABLE = confusionmat(Ytest,IDX_svm); 
sum_diag = 0; 
for j = 1 : size(TABLE,2) 
    sum_diag = sum_diag + TABLE(j,j); 
end 
error_rate = 1-(sum_diag/sum(sum(TABLE,2))); 

Répondre

1

La précision est simplement défini comme le rapport entre les étiquettes correctement prédit et le nombre total d'étiquettes dans l'ensemble de test/validation. Ainsi, au lieu d'utiliser la matrice de confusion, si vous avez le test étiquettes vecteur (Ytest je suppose) et les étiquettes prédites vecteur (IDX_svm je suppose), vous pouvez simplement exécuter

Accuracy=sum(IDX_svm==Ytest)/length(Ytest) 

Accuracy sera dans la gamme [0; 1], que vous pouvez l'échelle en pourcentage en multipliant simplement par 100.

le taux d'erreur, bien sûr, est défini selon l'une des opérations suivantes:

  • Si vous avez déjà évalué l'exactitude
    • 1-Accuracy si Accuracy est dans la gamme [0; 1]
    • 100-Accuracy si Accuracy est donnée en pourcentage
  • Si vous voulez évaluer seulement le taux d'erreur
    • le rapport entre la dans étiquettes correctement prédites et le nombre total d'étiquettes dans l'ensemble de test/validation: ErrorRate=sum(IDX_svm~=Ytest)/length(Ytest). Cette valeur sera dans la gamme [0; 1]
    • multipliant le résultat ci-dessus par 100 donnera le taux d'erreur en pourcentage

Ce sont des définitions standard et ils travaillent pour chaque classificateur, non seulement la SVM.

Aussi, je recommande d'éviter la fonction predict() dans une boucle. Dans ce cas, vous appelez plusieurs fois le predict() et chaque appel classe un seul point. Cela ralentit votre code. Comme vous le faites maintenant, predict() peut prendre toute la matrice de test en entrée et renvoie le vecteur d'étiquette entier afin que vous n'ayez pas à préallouer et à écrire chaque élément d'un tel vecteur dans une boucle for. Et vous appelez predict() qu'une seule fois. Vous pouvez essayer quelque chose comme

IDX_svm=predict(svmStruct,Xtest);