Le but de ce TP est d'utiliser les SVM en classification binaire pour faire la discrimination entre deux classes de points distribués selon un damier. Ensuite, une version multiclasse sera étudiée de façon à pouvoir apprendre à différencier chaque classe de toutes les autres.
Téléchargez et dezippez l'archive dans votre répertoire de travail.
gdataset.m
Créez des données d'apprentissage et de test (200 points d'apprentissage, 1000 en test) et affichez-les. Le mode à utiliser est 'checkers'. Il est possible de faire varier le mélange des classes à l'aide du paramètre $\sigma$ : plus il est grand, plus les classes se recouvreront. Dans les expériences suivantes, vous pourrez faire varier ce taux de mélange afin d'augmenter la difficulté de l'apprentissage.
En premier lieu, nous allons explorer les possibilités et les réglages du SVM.
Lancez le SVM en faisant varier "à la main" ce paramètre afin d'en visualiser les effets. Pour cela, utilisez les commandes suivantes :
SD = simpleData(xapp,yapp); % creer l'objet des donnees
SD.kernelType = 'rbf'; % choisir le noyau
SD.kernelParam = 0.5; % fixer le parametre du noyau
C=100; % fixer le parametre de tolérance aux erreurs
SM = simpleModelCSVM(SD,C); % creer l'objet SVM avec les données
SM.train; % apprendre le SVM
[ypred perf] = SM.test(xtest,ytest); % tester le SVM appris
disp(['Test perf : ', num2str(perf), '%']);
[ypredApp prefApp] = SM.test(xapp,yapp); % tester la qualité de l'apprentissage
disp(['App perf : ', num2str(perfApp), '%']);
figure;
SM.print2D(); % afficher le résultat (uniquemenent données en 2D)
Observez l'influence de la grandeur de ce paramètre sur la fidélité de la solution aux données d'apprentissage.
Pour traiter le problème multiclasses, une pratique courante consiste à entrainer des classifieur binaire "1 contre 1" (classe 1 contre classe 2, puis 1 contre 3, 1 contre 4, 2 contre 3, etc...) et de faire voter tous les classifieurs pour chaque exemple de test afin de déterminer sa classe.
Sur le problème checkers multiclasses (4 classes), essayez l'apprentissage 1 contre 1
SMt = SM.train1vs1(); % apprentissage 1 contre 1 (SMt contient tous les classifieurs binaires)
[ypred,perf1vs1] = SM.test1vs1(SMt,xtest,ytest);
disp(['Test perf 1 vs 1: ', num2str(perf1vs1), '%']);
[ypred,perfApp1vs1] = SM.test1vs1(SMt,xapp,yapp);
disp(['App perf 1 vs 1: ', num2str(perfApp1vs1), '%']);
SM.print2DMulti(SMt);