# Rapport INT22
<sub>*Ducousso Soline et Etienne Turc*</sub>
## Comparaison de classificateurs
Nous avons étudié les classificateurs suivants dans le but de tester leurs performances évaluées par validation croisée (coupe en tiers pour MNIST et en 10 pour Titanic) :
1. Un classifieur linéaire binaire (SGDClassifier)
2. Un classifieur k-plus proches voisins (KNeighborsClassifier)
3. Un classifieur par arbre de décision (DecisionTreeClassifier)
4. Un classifieur par forêt aléatoire « random forest » (RandomForestClassifier)
Concrètement, nous avons généré ces classifieurs grâce aux données MNIST ou les données du titanic. Pour ce faire, nous prenons une proportion des données (2/3 pour MNIST et 9/10 pour les données du titanic) et générons nos classifieurs grâce à ces échantillions et aux fonctions déjà présente de sklearn (librairie python).
Une fois qu'ils sont générés, nous évaluons leurs performances sur les données non utilisées. Cela permet donc de créer 3, ou 10 suivant la base de donnée utilisée, classifieurs différents pour une seule méthode. La performance de la méthode est donc ensuite la moyenne des performances indiviuelles.
À noter que nous avons en fait, 3 bases de données, la MNIST originale, la MNIST augmentée et celle du titanic. La MNIST augmentée est obtenu par translation des images de la base de donnée MNIST dans les 4 directions de l'espace.
Nous avons regroupé ces performances dans le tableau ci-dessous.
| Classifieurs | MNIST |MNIST Augmenté| Titanic |
| :----: |:----:|:----:|:----:|
| SGDClassifier | 0.959 | 0.940 | 0.623|
| KNeighborsClassifier |0.994 | 0.997 | 0.724 |
| DecisionTreeClassifier |0.931 | 0.926| 0.769|
| RandomForestClassifier |0.984 | 0.987 | 0.786 |
Concernant les données MNIST, nous pouvons constaté que le classifieur le plus performant est KNeighborsClassifier. Cela s'explique par le fait que cette méthode se comporte comme si elle évalue les ressemblances graphiques avec les images qu'elle connait et qu'elle a déjà classé. C'est ainsi que les humains reconnaissent les chiffres, en les comparants à des références que l'on a à l'esprit.
Ce classifieur n'est plus le meilleur pour les données du Titanic car le format de données s'y prête moins, peut-être que seulement quelques paramètres sont importants, et leurs variations peut avoir des effets plus notable.
La Random Forest est un très bon classifieur pour les deux bases de données. La force du nombre est bien illustrée ici, où de nombreux arbres de décisions très simples et très variés donnent en moyenne le bon résultat.
Le classifieur linéaire est meilleur pour les données MNIST que l'arbre de décision, alors que l'inverse est vrai pour les données Titanic. Il ne semble donc pas y avoir de séparatice linéaire simple qui permette de déterminer si un individu va survivre au nauffrage du Titanic. Cependant, les survivants sont mieux identifiés par un ensemble de règles, par exemple les femmes et les enfants ont sans doute plus survécus.
A l'inverse, un ensemble de règles a moins de sens pour déterminer s'il s'agit de chiffre 5 qu'une séparatice de l'espace, isolant toutes les images semblables représentants le chiffre 5.
De façon générale, augmenter la base de données MNIST n'a pas amélioré les performances des classifieurs (ou non significativement). Le surplus de données étants générées par une translation d'un pixel dans une direction, l'image ajoutée est en réalité très proche de celle d'origine. Le phénomène à l'oeuvre s'apparente alors à de la sur-interprétation.
<sub>*De plus, augmenter la base de données MNIST est donc plutôt un gaspillage de resource qui se traduit en particulier par la création d'un radiateur lorsque l'on test KNeighborsClassifier sur la base de données augmentés (entre 4 heures et une nuit de calcul sur 16 coeurs).*</sub>
## Etude sur les données Titanic
Nous avons utilisé les données du titanic afin de générer des arbres de décision ayant pour but de prédire si un passager a survécu ou non.
Pour cela, nous n'avons pas pris en compte les données relatives au numéro de cabine ni le lieu de l'embarquation car il y avait trop de valeure manquante. Pour l'attribut Age, nous avons remplacé les valeurs manquantes par la moyenne de l'âge des passagers.
Une fois ces données traitées, nous générons des arbres de décision avec la fonction DecisionTreeClassifier de sklearn de profondeur maximale variant de 1 à 5.
Nous évaluons ensuite sa perfomance. Pour cela, nous générons en fait 10 arbres de décisions avec 9/10 des données. Puis nous évaluons son taux de bonne prédiction sur le 1/10 des données restante. On prend ensuite la moyenne, ce qui nous donne la performance de ce type de méthode pour ce jeu de donné pour une profondeur maximale donnée.
Nous avons fait de même avec la fonction RandomForestClassifier de sklearn qui crée un classifieur avec la méthode des forêts aléatoires. À noter que pour ce cas-ci, nous avons fait varier la profondeure maximale des arbres de 1 à 10.
Nous avons regroupé les résultats dans les 2 tableaux ci-dessous en fonction du classifieur choisi.
#### Influence de la profondeur maximale sur les arbre de décision
| Profondeur maximale |1|2|3|4|5|
| :----: |:----:|:----:|:----:|:----:|:----: |
| Perfomance | 0.787| 0.779| 0.809|0.801|0.804|
Nous remarquons que pour une profondeur maximale de 1 ou de 2, les arbres de décisions sont un peu moins bons, puis pour une profondeur supérieure ou égale à 3, les performances sont sensiblements identiques. Donc au-delà d'une profondeur maximale de 3, l'augmenter n'améliore pas les performances.
#### Influence de la profondeur maximale sur les forêts aléatoires
| Profondeur maximale |1|2|3|4|5|
| :----: |:----:|:----:|:----:|:----:|:----: |
| Perfomance | 0.776 | 0.787| 0.810|0.815|0.820|
| **Profondeur maximale** |**6**|**7**|**8**|**9**|**10**|
| Perfomance |0.819|0.820|0.816|0.819|0.815|
Nous pouvons noter un comportement similaire que pour les arbres de décisions, c'est-à-dire que la performance augmente petit à petit de 1 à 4, puis les performances sont stationnaires au-delà d'une profondeur maximale de 5.
Nous pouvons suputer une légère baisse de performance à partir d'une profondeur maximale de 8, suggérant de la sur-interprétation des données.
## Code
Vous pouvez retrouver les scripts associés à ce DM à cette adresse [https://gitlab.data-ensta.fr/ducousso/int22](https://gitlab.data-ensta.fr/ducousso/int22)
- mnist.py contient le script permettant de générer tous les classifieurs pour les données MNIST et MNIST augmentées.
- titanic.py contient le script permettant de générer tous les classifieurs pour les données du titanic.
- decision_tree_titanic contient le script permettant de générer tous les arbres de décision et les forêts aléatoires pour les données du titanic et ce pour une profondeur variant respectivement de 1 à 5 et de 1 à 10.