Validation croisée (cross-validation)

Il est acquis qu'un modèle doit être évalué sur une base de test différente de celle utilisée pour l'apprentissage. Mais la performance est peut-être juste l'effet d'une aubaine et d'un découpage particulièrement avantageux. Pour être sûr que le modèle est robuste, on recommence plusieurs fois. On appelle cela la validation croisée ou cross validation).

On découpe la base de données en cinq segments de façon aléatoire. On en utilise 4 pour l'apprentissage et 1 pour tester. On recommander 5 fois. Si le modèle est robuste, les cinq de scores de test seront sensiblement égaux.

On utilise un modèle des plus proches voisins.

Nous allons utiliser la fonction cross_val_score.

Le score par défaut est $R^2$ :

Si on souhaite utiliser score un autre score :

Ou plusieurs à la fois :

On obtient bien les mêmes résultats mais ils sont bien différents de ceux obtenus avec train_est_split et reproduits ci-dessous.

Ca doit mettre la puce à l'oreille. De plus, étonnamment, le score $R^2$ est identique pour les tirages si on réexecute le code une seconde fois pour la validation croisée alors qu'il est différent pour une seconde répartition apprentissage test :

Les résultats sont rigoureusement identique pour la validation croisée.

C'est quelque peu suspect, très suspect en fait, en statistique, c'est quasi miraculeux pour un nombre aussi volatile. Cela ne peut être dû au fait que la fonction fait exactement les mêmes découpages. Mettons un peu plus d'aléatoire :

On retrouve les mêmes scores que pour train_test_split. Comment l'interpréter ? La raison la plus probable est que la validation croisée implémenté par scikit-learn n'est par défaut pas aléatoire. Cela explique qu'on retrouve les mêmes résultats sur deux exécutions. Il reste à expliquer le fait que les chiffres sont nettement mauvais pour le premier code et meilleur pour ce second code.

Et si les vins n'étaient pas mélangés dans la base avec des vins rouges au début et blancs vers la fin ?

Les éléments sont clairements triés par couleur et la validation croisée par défaut découpe selon cet ordre. Cela signifie presque que le modèle essaye de prédire la note d'un vin rouge en s'appuyant sur des vins blancs et cela ne marche visiblement pas. La validation croisée ne retourne pas de modèle mais cela peut être contourné avec GridSearchCV.