Courbe ROC
Contents
Input
- c1 étiquette de la première classe
- c2 étiquette de la seconde classe
- ytest1 étiquettes réelles des données testées
- proba matrice contenant les probablité d'appartenance à la classe prédite, une colonne par classe, sortie de libsvm
- predict_label vecteur contenant les étiquettes prédites par libsvm
function courbeROC(c1,c2,ytest1,proba,predict_label)
Calcul de la matrice de confusion de départ, pour l'affichage sur la courbe du point correspondant au SVM classique (choix de la classe d'appartenance pour un seuil de 0.5).
MCBase = matriceConfusion(ytest1,predict_label,c1,c2);
Evalutation par courbe ROC
Pour la classe c1
NbTest = 100; ROC = zeros(2,NbTest); Var = linspace(0,1,NbTest); for i = 1:NbTest prediction = c2*ones(size(ytest1)); prediction(proba(:,1)>Var(i)) = c1; MC = matriceConfusion(ytest1,prediction,c1,c2); ROC(1,i) = 1-(MC(1,1)./(MC(1,1)+MC(1,2))); ROC(2,i) = (MC(2,2)./(MC(2,1)+MC(2,2))); end
Affichage de la courbe
figure; plot(ROC(1,:),ROC(2,:),'r-+'); title(['Courbe ROC Classe ',num2str(c1)]); hold on; plot(Var,Var,'b-');
Affichage du SVM seul
ROCBase(1) = 1-(MCBase(1,1)./(MCBase(1,1)+MCBase(1,2))); ROCBase(2) = (MCBase(2,2)./(MCBase(2,1)+MCBase(2,2))); plot(ROCBase(1),ROCBase(2),'gd','MarkerSize',10,'LineWidth',2); legend('SVM Probabilité','Aléatoire','SVM Seul',0);
Pour la classe c2
ROC = zeros(2,NbTest); for i = 1:NbTest prediction = c1*ones(size(ytest1)); prediction(proba(:,2)>Var(i)) = c2; MC = matriceConfusion(ytest1,prediction,c1,c2); ROC(2,i) = (MC(1,1)./(MC(1,1)+MC(1,2))); ROC(1,i) = 1-(MC(2,2)./(MC(2,1)+MC(2,2))); end
Affichage de la courbe
figure; plot(ROC(1,:),ROC(2,:),'r-+'); title(['Courbe ROC Classe ',num2str(c2)]); hold on; plot(Var,Var,'b-');
Affichage du SVM seul
ROCBase(2) = (MCBase(1,1)./(MCBase(1,1)+MCBase(1,2))); ROCBase(1) = 1-(MCBase(2,2)./(MCBase(2,1)+MCBase(2,2))); plot(ROCBase(1),ROCBase(2),'gd','MarkerSize',10,'LineWidth',2); legend('SVM Probabilité','Aléatoire','SVM Seul',0);
end