Peut-on prédire le salaire d'une personne en fonction de son âge ou de ses années d'étude ? C'est ce que nous allons essayer de réussir à partir d'information de recensement. Nous utiliserons le data set census income, créé en 1996 à partir d'informations de près de 100000 personnes.


Analyse du corpus

Nous avons deux fichiers csv, les données ayant déjà été découpées en deux ensembles, presque égaux, d'apprentissage et de tests. Extrait d'une ligne

50, Self-emp-not-inc, 83311, Bachelors, 13, Married-civ-spouse, Exec-managerial, Husband, White, Male, 0, 0, 13, United-States, <=50K

Et nous pouvons d'ores et déjà observer plusieurs choses.

Premièrement, nous ne disposons pas du salaire exact (en dernière colonne). Le salaire a été discrétisé , dans le sens où à la place d'un nombre nous avons à la place un label <=50K ou >50K.
Nous sommes donc sur un problème de classification binaire : à quelle classe appartient une personne : celle de ceux qui gagnent moins de 50000 USD à l'année ou les autres ?

Nous avons ensuite des colonnes numérique et d'autres non numériques (on a une chaîne de caractères comme valeur). Il va donc falloir faire un prétraitement sur ces dernières.

Prétraitement de nos données

Pour un algorithme, travailler avec des nombres est idéal. En effet, on peut facilement dire qu'un âge est plus 'grand' qu'un autre ou qu'un nombre d'années d'étude est le double d'un autre. Mais comment comparer, par exemple, les valeurs de notre avant-dernière colonne : le pays d'origine ? Lorsque nous devons travailler avec ce type de données, que nous allons appeler catégories textuelles, 2 choix sont possibles, nous pouvons continuer à travailler sur les chaines de caractères et utiliser une fonction qui calculer la distance entre 2 catégories ou essayer de passer des chaines de caractères à une représentation numérique de nos catégories, c'est cette dernière option que nous allons utiliser.

Une idée naïve, serait par exemple, d'attribuer arbitrairement un nombre à un pays :
- États-Unis : 1

- France : 2

- Pérou : 3

Cependant, un nombre à une signification, et si les USA valent 1 et le Pérou 3, cela signifie que les USA valent 3 fois plus que le Pérou ou que la France plus le Pérou vaut les États-Unis ? On voit très vite que tout ceci n'a aucun sens. On décide donc d'utiliser l'encodage one-hot :

- États-Unis : 100

- France : 010

- Pérou : 001


Dans l'exemple, ci-dessus, nous avons 3 pays et donc utilisons 3 bits. Tous les bits sont à 0, sauf un bit qui correspond au pays. Si nous revenons à nos données csv, on voit qu'il y a 42 pays différents, nous allons donc rajouter 42 nouvelles colonnes, la cellule sera égale à 1 si la personne vient du pays représenté par la colonne, sinon à zéro. Il y en plus un avantage supplémentaire, notre recensement a des données manquantes, si nous n'avons donc aucune information sur le pays, toutes les nouvelles colonnes binaires correspondant aux pays seront à 0.

Nous remplaçons donc toutes les colonnes des catégories textuelles par des groupes de nouvelles colonnes binaires.

Attention, notre ensemble de test contiendra, par exemple, peut-être moins ou peut-être plus de pays que notre ensemble d'entrainement; lors du traitement du csv de test, nous devons donc faire attention à remplacer les catégories par exactement les mêmes colonnes que l'ensemble d'entrainement et dans le même ordre. Si dans nos tests nous trouvons de nouveaux pays, ils seront ignorés et si nous avons moins de pays, nous ajoutons malgré tout les colonnes pour les pays manquants.

Le salaire est un cas particulier ou nous n'allons garder qu'une seule colonne et  allons attribuer, arbitrairement, la valeur 1 si le salaire valait >50K ou la valeur 0 si le salaire valait <=50K.

Nos données sont maintenant prêtes à être traitées. Voyons voir maintenant notre algorithme.