2.4 Quantification vectorielle

Un des désavantages de la méthode des k plus proches voisins est que l’on doit conserver toutes les données du set d’apprentissage et confronter systématiquement tout nouvel individu à l’ensemble des cas de ce set. L’idée sous-jacente à la quantification vectorielle (learning vector quantization en anglais, LVQ en abrégé) est que les données initiales peuvent sans doute être synthétisées : des individus proches dans l’espace de Malahanobis peuvent être remplacés par des “individus moyens ou centroïdes” tout en apportant à peu près le même effet. Du coup, nous réduisons la quantité d’information à conserver et nous accélérons les calculs dans les phases de test et déploiement.

Une étape supplémentaire dans le calcul du classifieur est introduite. Le set d’apprentissage initial est résumé en un dictionnaire ou codebook en anglais, dans lequel les groupes initiaux sont remplacés par un ou plusieurs centroïdes. Ces centroïdes sont, en quelque sorte, des “portraits robots” des différents classes et ils résument les caractéristiques des individus appartenant à ces classes. La classification supervisée se fait par une méthode similaire aux k plus proches voisins mais en utilisant les centroïdes du dictionnaire en lieu et place des individus du set d’apprentissage.

En plus du paramètre k, il faut donc également définir size, le nombre de centroïdes qui seront calculés dans le dictionnaire. Il est possible de calculer librement les différents centroïdes en fonction de la dispersion des données, ou bien d’imposer que le même nombre de centroïdes soit calculé pour chaque classe.

Un exemple fictif et visuel de classification par quantification vectorielle à deux classes (rouge et bleue) résumée via un dictionnaire (“codebook”) de taille size = 6. Ce dictionnaire est ensuite utilisé comme référence pour déterminer la classe de l’individu inconnu en gris par k plus proches voisins avec k = 3. On en déduit qu’il s’agit probablement d’un individu de la classe rouge ici puisque deux centroïdes rouges sont plus proches contre un seul bleu.

2.4.1 Pima avec LVQ

Voyons ce que cela donne sur nos données pima1 et pima2, en utilisant la fonction mlLvq() de {mlearning} qui utilise les arguments size = pour la taille du dictionnaire et k.nn = pour le nombre de proches voisins à considérer ensuite :

library(mlearning)
pima1_lvq <- mlLvq(data = pima1, diabetes ~ ., k.nn = 3, size = 30)
set.seed(846)
pima1_lvq_conf <- confusion(cvpredict(pima1_lvq, cv.k = 10), pima1$diabetes)
plot(pima1_lvq_conf)

summary(pima1_lvq_conf)
# 392 items classified with 297 true positives (error = 24.2%)
# 
# Global statistics on reweighted data:
# Error rate: 24.2%, F(micro-average): 0.715, F(macro-average): 0.711
# 
#        Fscore    Recall Precision Specificity       NPV       FPR       FNR
# neg 0.8269581 0.8664122 0.7909408   0.5384615 0.6666667 0.4615385 0.1335878
# pos 0.5957447 0.5384615 0.6666667   0.8664122 0.7909408 0.1335878 0.4615385
#           FDR       FOR     LRPT      LRNT     LRPS      LRNS    BalAcc
# neg 0.2090592 0.3333333 1.877226 0.2480916 2.372822 0.3135889 0.7024369
# pos 0.3333333 0.2090592 4.030769 0.5327008 3.188889 0.4214391 0.7024369
#           MCC    Chisq       Bray Auto Manu A_M  TP FP FN  TN
# neg 0.4304338 72.62711 0.03188776  287  262  25 227 60 35  70
# pos 0.4304338 72.62711 0.03188776  105  130 -25  70 35 60 227

Nous avons choisis arbitrairement de prendre un dictionnaire de taille 30 et 3 plus proches voisins. Avec ces valeurs, nous avons 24% d’erreur, ce qui nous situe entre k-NN et ADL en terme de performances. Essayez par vous-même d’autres valeurs de size = et k.nn = pour optimiser encore ce résultat.

Avec pima2, une taille de dictionnaire de 30 toujours et trois plus proches voisins, nous obtenons également 24% d’erreur :

library(mlearning)
pima2_lvq <- mlLvq(data = pima2, diabetes ~ ., k.nn = 3, size = 30)
set.seed(25)
pima2_lvq_conf <- confusion(cvpredict(pima2_lvq, cv.k = 10), pima2$diabetes)
plot(pima2_lvq_conf)

summary(pima2_lvq_conf)
# 724 items classified with 549 true positives (error = 24.2%)
# 
# Global statistics on reweighted data:
# Error rate: 24.2%, F(micro-average): 0.723, F(macro-average): 0.72
# 
#        Fscore    Recall Precision Specificity       NPV       FPR       FNR
# neg 0.8234107 0.8589474 0.7906977   0.5662651 0.6778846 0.4337349 0.1410526
# pos 0.6170678 0.5662651 0.6778846   0.8589474 0.7906977 0.1410526 0.4337349
#           FDR       FOR     LRPT      LRNT     LRPS      LRNS    BalAcc
# neg 0.2093023 0.3221154 1.980351 0.2490929 2.454703 0.3087580 0.7126062
# pos 0.3221154 0.2093023 4.014566 0.5049610 3.238782 0.4073812 0.7126062
#           MCC    Chisq       Bray Auto Manu A_M  TP  FP  FN  TN
# neg 0.4463709 144.2548 0.02831492  516  475  41 408 108  67 141
# pos 0.4463709 144.2548 0.02831492  208  249 -41 141  67 108 408
À vous de jouer !

Réalisez l’assignation C02Ga_ml2, partie II.

Si vous êtes un utilisateur non enregistré ou que vous travaillez en dehors d’un cours, faites un “fork” de ce dépôt.

Voyez les explications dans le fichier README.md, partie II.