---
title: "04 Validation croisée"
author: Pierre-Edouard Portier
date: mars 2022
output: beamer_presentation
---

```{r, include=FALSE}
source("01_intro.R", local = knitr::knit_global())
source("04_validation_croisee.R", local = knitr::knit_global())
```

# Principe de la validation croisée

- Quelle valeur pour l'__hyperparamètre__ $\lambda$ ?

$$\hat{\boldsymbol\beta} = \left( \mathbf{X}^T\mathbf{X} + \lambda \mathbf{I}_{n\times n} \right)^{-1} \mathbf{X}^T \mathbf{y}$$

- __Validation croisée__ par partition du jeu de données
  - __entraînement__ : estimer $\hat{\boldsymbol\beta}$ de chaque modèle
  - __validation__ : choisir le modèle qui commet la plus faible erreur
  - __test__ : estimer l'erreur du modèle retenu

# Validation croisée à K plis

- Partitionner le jeu de données en entraînement et test
- Partitionner le jeu d'entraînement en K plis disjoints
- Pour chaque valeur $\lambda_i$ de l'hyperparamètre $\lambda$
  - Apprendre K modèles $M[\lambda_i,k]$ avec $k \in [1\dots K]$
  - Entraîner $M[\lambda_i,k]$ sur les plis $1,2,\dots,k-1,k+1,\dots,K]$
  - Tester $M[\lambda_i,k]$ sur le pli $k$
  - Faire la moyenne des erreurs commises par les $K$ modèles $M[\lambda_i,\cdot]$ sur les jeux de test
- Choisir la valeur $\lambda_{best}$ qui correspond à la plus faible erreur
- Apprendre, sur tout le jeu d'entrâinement, un modèle avec l'hyperparamètre $\lambda_{best}$
- Tester ce modèle sur le jeu de test

# Moyenne des erreurs absolues pour différentes valeurs de $\lambda$

```{r, echo=FALSE}
set.seed(1123)
N <- 100
deg1 <- 8
data = gendat(N,0.2)
splitres <- splitdata(data,0.8)
entr <- splitres$entr
test <- splitres$test
lambdas <- c(1E-8, 1E-7, 1E-6, 1E-5, 1E-4, 1E-3, 1E-2, 1E-1, 1)
reskfold <- kfoldridge(K = 10, lambdas = lambdas, data = entr, degre = deg1)
boxplot(reskfold$maes, xlab="lambda", ylab="MAE")
```

# Meilleur poly de degré `r deg1` pour $\lambda=$ `r reskfold$lambda` sur l'entraînement

```{r, echo=FALSE}
plt(entr,f)
pltpoly(reskfold$coef)
```

# Meilleur poly de degré `r deg1` pour $\lambda=$ `r reskfold$lambda` sur le test

```{r, echo=FALSE}
testpred <- polyeval(reskfold$coef, test$X)
testmae <- mean(abs(testpred - test$Y))
plt(test,f)
pltpoly(reskfold$coef)
```

- Erreur absolue moyenne de `r testmae` sur le jeu de test