library(ggplot2)
library(tidyr)
library(dplyr)
set.seed(123)
n <- 10000
p <- 5
theta_true <- c(-2,-1,0,1,2)
L’objectif de ce TP est d’étudier le comportement d’un estimateur en ligne basé sur le gradient dans les cadres :
On s’intéressera à la convergence de l’estimateur \(\theta_i\) vers le vrai paramètre \(\theta\) et à l’évolution de l’erreur quadratique.
On considère le modèle
\[ Y_i = X_i^T \theta + \varepsilon_i, \]
avec :
On note \(n = 10000\).
Générer un échantillon \((X_i, Y_i)_{i=1,\dots,n}\).
Écrire une fonction R qui ressorte l’ensemble des estimateurs \(\theta_i\), pour \(i = 0, \ldots, n-1\), définis par la descente de gradient stochastique : \[ \theta_{i+1} = \theta_{i} + \gamma_{i+1} \nabla_\theta \left( (Y_{i+1} - X_{i+1}^T\theta_{i}\right)X_{i+1}. \]
Tracer l’évolution de l’erreur quadratique \(\|\theta_i-\theta\|^2\) pour un échantillon.
Répéter l’expérience sur 50 échantillons indépendants et tracer l’erreur quadratique moyenne.
On se place dans le cadre de la régression logistique, i.e. \[ \mathbb{P}(Y_i=1|X_i)=\sigma(X_i^T\theta), \quad \sigma(t)=\frac{1}{1+e^{-t}}. \]
On rappelle que l’algorithme de gradient stochastique est alors défini pour tout \(i=0, \ldots ,n-1\) par \[ \theta_{i+1} = \theta_{i} + \gamma_{t+1} \left( Y_{i+1} - \sigma \left( X_{i+1}^{T}\theta_{i} \right)\right) X_{i+1} \]
Le code suivante permet de générer un échantillon de taille \(n\) pour un \(\theta\) donné.
sigmoid <- function(t) 1/(1+exp(-t))
X <- matrix(rnorm(n*p), n, p)
prob <- sigmoid(X %*% theta_true)
Y <- rbinom(n,1,prob)
Écrire une fonction R qui ressorte l’ensemble des estimateurs
Tracer l’évolution de l’erreur quadratique \(\|\theta_i-\theta\|^2\) pour un échantillon.
La base de données MNIST (Modified National Institute of Standards and Technology) est une base de référence très utilisée en apprentissage automatique et en reconnaissance de formes. Elle est composée d’images de chiffres manuscrits allant de 0 à 9 et sert fréquemment de jeu de données “standard” pour tester et comparer des méthodes de classification.
La base MNIST contient : - 60 000 images d’apprentissage - 10 000 images de test
Chaque observation correspond à une image en niveaux de gris de taille 28 × 28 pixels. Les images sont généralement représentées sous forme vectorielle : chaque image est transformée en un vecteur de 784 variables, correspondant aux intensités des pixels, avec des valeurs comprises entre 0 et 255.
L’objectif principal est de construire un modèle capable de prédire le chiffre manuscrit représenté sur une image à partir des valeurs des pixels. Il s’agit donc d’un problème de classification supervisée, le plus souvent : - multiclasse, avec 10 classes (chiffres de 0 à 9), - ou parfois binaire, par exemple pour distinguer un chiffre donné des autres.
Ici, on se placera dans le cadre binaire, i.e. on ne considèrera ques les chiffres 0 et 1 et on appliquera la régression logistique pour faire de la prévision.
Le code suivant permet d’extraire les données d’entrainement :
library(dslabs)
mnist <- read_mnist()
data_train=mnist$train
I=which(data_train$label == 0 | data_train$label == 1)
Y_train=data_train$labels[I]
X_train=data_train$images[I,]
On obtient ce type d’images pour les données MNIST :
par(mfrow = c(1, 2), mar = c(1, 1, 2, 1))
img1 <- matrix(X_train[1, ], 28, 28, byrow = TRUE)
img2 <- matrix(X_train[2, ], 28, 28, byrow = TRUE)
image(
img1[, 28:1],
col = gray.colors(256),
axes = FALSE,
asp = 1,
main = paste("Label =", Y_train[1])
)
image(
img2[, 28:1],
col = gray.colors(256),
axes = FALSE,
asp = 1,
main = paste("Label =", Y_train[2])
)
Dans ce qui suit, on se place dans le cadre de la régression logistique, i.e. on suppose \[ Y_{i} | X_{i} \sim \mathcal{B}\left(\sigma \left( \theta^{T}X_{i} \right) \right) . \]
Estimer le paramètre \(\theta\) à l’aide de l’algorithme de gradient stochastique.
Pour prédire \(Y_{i}\), on considère l’estimateur \(\hat{\theta}\), et la prévision \(\hat{Y}_{i} = 1\) si \(\sigma \left( X_{i}^{T}\hat{\theta}\right) \geq 1/2\) et \(0\) sinon. Calculer vos prévision sur les données d’entraînement, puis visualiser l’erreur de prévision avec la fonction table avant de calculer le taux de bonnes prévisions.
Le code suivant permet d’extraire les données test.
data_test=mnist$test
J=which(data_test$label == 0 | data_test$label == 1)
Y_test=data_test$labels[J]
X_test=data_test$images[J,]
Calculer les prédictions pour les données tests. Attention, il ne faut pas rééstimer \(\theta\) mais conserver l’estimateur précédent.