---
title: "ML 04 Validation croisée"
output:
  bookdown::pdf_document2:
    number_section: yes
toc: false
classoption: fleqn
---

```{r, include=FALSE}
source("ML1_01_intro.R", local = knitr::knit_global())
source("ML1_03_tikhonov.R", local = knitr::knit_global())
source("ML1_04_validation_croisee.R", local = knitr::knit_global())
```

# Principe de la validation croisée

Comment choisir la valeur du coefficient de régularisation $\alpha$ pour une régression ridge ? Notons en passant que $\alpha$ est un exemple de ce que l'on appelle un hyperparamètre car sa valeur doit être fixée avant de pouvoir apprendre les paramètres du modèle (dans notre cas, les coefficients d'un modèle linéaire).

Une possibilité est de diviser le jeu de données en deux parties, l'une utilisée pour apprendre le modèle prédictif, l'autre utilisée pour valider la qualité des prédictions sur des données qui n'ont pas été vues pendant la phase d'apprentissage. On parle de jeu d'entraînement et de jeu de validation ou de test. Cette méthode est appelée "validation croisée".

Il s'agit de tester plusieurs valeurs de l'hyperparamètre $\alpha$ sur le jeu d'entraînement et de conserver celle qui donne les meilleurs résultats sur un jeu de données de validation qui n'a pas été utilisé pour l'entraînement. Nous obtenons ainsi un modèle qui montre souvent une meilleure capacité à prédire sur de nouvelles données.

# Application de la validation croisée à la régularisation de Tikhonov

Le code source accompagnant ce chapitre comprend une fonction `xvalpart` pour diviser le jeu de données en jeu d'entraînement et jeu de test. Ensuite, la fonction `xvalridge` apprend plusieurs modèles de régression ridge sur le jeu d'entraînement pour des valeurs différentes de l'hyperparamètre $\alpha$. Elle retourne les coefficients du meilleur modèle avec la moyenne de la valeur absolue des erreurs commises par ce modèle sur le jeu de validation.

```{r}
set.seed(1123)
N <- 100
deg1 <- 8
data = gendat(N,0.2)
alphas <- c(1E-7, 1E-6, 1E-5, 1E-4, 1E-3, 1E-2, 1E-1, 1)
xvalres <- xvalridge(alphas, data, deg1, 0.8)
plt(data,f)
pltpoly(xvalres$coef)
```

Avec le code ci-dessus, nous générons un nouveau jeu de données composé de `r N` observations et nous calculons par validation croisée un polynôme de degré au plus égal à `r deg1` qui modélise au mieux ces données. La valeur de $\alpha$ retenue est : `r xvalres$alpha` et la moyenne des erreurs absolues est de `r xvalres$meanabserr`.

Testons avec un polynôme de plus petit degré...

```{r}
deg2 <- 5
xvalres <- xvalridge(alphas, data, deg2, 0.8)
plt(data,f)
pltpoly(xvalres$coef)
```

Pour un polynôme de degré `r deg2`, la valeur de $\alpha$ retenue est : `r xvalres$alpha` et la moyenne des erreurs absolues est de `r xvalres$meanabserr`. Nous remarquons que pour un espace de fonctions plus riche (polynômes de degré `r deg1` VS polynômes de degré `r deg2`), une régularisation plus importante peut-être nécessaire, en particulier pour que le modèle ne soit pas trop sensible au bruit présent dans le jeu d'apprentissage.