Le jeu de données (dataset) dont vous disposez constitue une ressource précieuse. Il faut pouvoir l’utiliser à bon escient, afin de pouvoir à la fois choisir un modèle et l'entraîner (ce que nous avons fait dans le chapitre pratique précédent), mais aussi de pouvoir tester la qualité de ce modèle.
Voyons cela de plus près !
Echantillonnez les données
La première question à se poser est : est-ce que l'on va utiliser toutes les données d'exemple dont on dispose ?
En effet, s'il s’avère qu’on a beaucoup de données d’entraînement et/ou que l’algorithme d’apprentissage est lourd, il est possible qu’utiliser toutes les données prenne énormément de temps et/ou de ressources hardware. Dans ce cas, il faut naturellement échantillonner et ne récupérer qu’un petit pourcentage du dataset qui servira au travail de modélisation pour aller plus vite. On parle d'étape de sampling en anglais.
Ça ne sert à rien d'utiliser toutes les données pour tester des modèles et se retrouver à attendre à chaque fois plusieurs minutes au lieu de quelques secondes, n'est-ce pas ? 😇
Le problème lorsque l'on effectue un échantillonnage, c'est que l’on doit être bien sûr que cet échantillon est représentatif de toutes les données. En effet, dans l’exemple des loyers par exemple, si je ne récupère que des données qui proviennent d'Ile-de-France, je serai forcément biaisé pour mes prédictions de loyer qui proviennent d'autres régions. Il faut donc s’assurer de piocher les données de manière uniforme sur toute la population que l'on souhaite considérer.

Pour effectuer un échantillon, c'est assez simple. Une technique est de récupérer des identifiants tirés aléatoirement grâce à la fonction de la librairie Python "Numpy" randint
.
sample = np.random.randint(data_size, size=int(data_size*0.1) )
sampled_data = data.iloc[sample]
Mettez de côté une partie des données pour tester votre modèle
Comme nous l’avons vu, l’entraînement d’un modèle revient à mesurer l’erreur de la sortie de l’algorithme avec les données d’exemple et chercher à la minimiser.
Un premier piège à éviter est donc d'évaluer la qualité de votre modèle final à l'aide des mêmes données qui ont servi pour l'entraînement. En effet, le modèle est complètement optimisé pour les données à l'aide desquelles il a été créé. L'erreur sera précisément minimum sur ces données. Alors que l'erreur sera toujours plus élevée sur des données que le modèle n'aura jamais vues !
Pour minimiser ce problème, la meilleure approche est de séparer dès le départ notre jeu de données en deux parties distinctes :
Le training set, qui va nous permettre d’entraîner notre modèle et sera utilisé par l’algorithme d’apprentissage. C'est celui dont on a parlé depuis le début.
Le testing set, qui permet de mesurer l’erreur du modèle final sur des données qu’il n’a jamais vues. On va simplement passer ces données comme s'il s'agissait de données que l’on n'a encore jamais rencontrées (comme cela va se passer ensuite en pratique pour prédire de nouvelles données) et mesurer la performance de notre modèle sur ces données. On appelle aussi cela held-out data, pour souligner que ce sont des données auxquelles on ne va pas toucher avant la toute fin pour pouvoir être bien sûr que le modèle fonctionne.
C'est à vous de définir la proportion du dataset que vous souhaitez allouer à chaque partie. En général, les données sont séparées avec les proportions suivantes : 80 % pour le training set et 20 % pour le testing set.
On peut cette fois utiliser la fonction de scikit-learn train_test_split
qui prend en paramètre la proportion désirée :
from sklearn.model_selection import train_test_split
xtrain, xtest, ytrain, ytest = train_test_split(X, y, train_size=0.8)
Pourquoi ne pas utiliser toutes les données pour l’entraînement et réutiliser ensuite toutes les données pour tester le modèle ?
En fait, il s’avère que si l'on entraîne le modèle avec des données, il va naturellement être plus performant sur ces données-là. Ce qui nous intéresse, c’est de mesurer sa performance sur des données qu’il n’a jamais vues, puisque c’est ce qui va se passer en pratique. Cette performance est appelée la généralisation du modèle : sa capacité à effectuer des prédictions de qualité sur des situations jamais rencontrées. On étudiera ça plus en détail dans la prochaine partie de ce cours. 😀
En résumé
On a maintenant une meilleure idée de la manière dont on peut correctement exploiter nos données :
S’il y en a beaucoup, on travaille d'abord uniquement avec un échantillon représentatif de la population pour pouvoir aller plus vite.
On sépare dès le départ en deux parties notre jeu de données : un training set pour créer le modèle et un testing set pour tester la qualité du modèle.