Introduction
Ce laboratoire montre comment effectuer une estimation de covariance à l'aide de techniques de régularisation telles que les méthodes de rétrécissement pour réduire la variance de l'estimateur, ainsi que comment choisir le compromis biais-variance. Nous comparerons trois approches pour définir le paramètre de régularisation.
Conseils sur la machine virtuelle
Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder à Jupyter Notebook pour la pratique.
Parfois, vous devrez peut-être attendre quelques secondes pour que Jupyter Notebook ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations de Jupyter Notebook.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous réglerons rapidement le problème pour vous.
Générer des données d'échantillonnage
Nous générons des données d'échantillonnage avec 40 caractéristiques et 20 échantillons. Nous utilisons la fonction np.random.normal() pour créer une distribution normale.
import numpy as np
n_features, n_samples = 40, 20
np.random.seed(42)
base_X_train = np.random.normal(size=(n_samples, n_features))
base_X_test = np.random.normal(size=(n_samples, n_features))
coloring_matrix = np.random.normal(size=(n_features, n_features))
X_train = np.dot(base_X_train, coloring_matrix)
X_test = np.dot(base_X_test, coloring_matrix)
Calculer la vraisemblance sur les données de test
Nous calculons la log-vraisemblance négative sur les données de test en utilisant la classe ShrunkCovariance du module sklearn.covariance et la fonction log_likelihood du module scipy.linalg. Nous parcourons une plage de valeurs possibles pour le coefficient de rétrécissement et calculons la vraisemblance pour chaque valeur.
from sklearn.covariance import ShrunkCovariance, empirical_covariance, log_likelihood
from scipy import linalg
shrinkages = np.logspace(-2, 0, 30)
negative_logliks = [
-ShrunkCovariance(shrinkage=s).fit(X_train).score(X_test) for s in shrinkages
]
real_cov = np.dot(coloring_matrix.T, coloring_matrix)
emp_cov = empirical_covariance(X_train)
loglik_real = -log_likelihood(emp_cov, linalg.inv(real_cov))
#Comparer différentes approches pour définir le paramètre de régularisation
Nous comparons trois approches pour définir le paramètre de régularisation : la validation croisée, Ledoit-Wolf et OAS.
from sklearn.model_selection import GridSearchCV
from sklearn.covariance import LedoitWolf, OAS
tuned_parameters = [{"shrinkage": shrinkages}]
cv = GridSearchCV(ShrunkCovariance(), tuned_parameters)
cv.fit(X_train)
lw = LedoitWolf()
loglik_lw = lw.fit(X_train).score(X_test)
oa = OAS()
loglik_oa = oa.fit(X_train).score(X_test)
Tracer les résultats
Nous traçons la vraisemblance des données non vues pour différentes valeurs du paramètre de rétrécissement et montrons les choix par validation croisée, estimations LedoitWolf et OAS.
import matplotlib.pyplot as plt
fig = plt.figure()
plt.title("Covariance régularisée : vraisemblance et coefficient de rétrécissement")
plt.xlabel("Paramètre de régularisation : coefficient de rétrécissement")
plt.ylabel("Erreur : log-vraisemblance négative sur les données de test")
plt.loglog(shrinkages, negative_logliks, label="Log-vraisemblance négative")
plt.plot(plt.xlim(), 2 * [loglik_real], "--r", label="Vraisemblance de la covariance réelle")
lik_max = np.amax(negative_logliks)
lik_min = np.amin(negative_logliks)
ymin = lik_min - 6.0 * np.log((plt.ylim()[1] - plt.ylim()[0]))
ymax = lik_max + 10.0 * np.log(lik_max - lik_min)
xmin = shrinkages[0]
xmax = shrinkages[-1]
plt.vlines(
lw.shrinkage_,
ymin,
-loglik_lw,
color="magenta",
linewidth=3,
label="Estimation Ledoit-Wolf",
)
plt.vlines(
oa.shrinkage_, ymin, -loglik_oa, color="purple", linewidth=3, label="Estimation OAS"
)
plt.vlines(
cv.best_estimator_.shrinkage,
ymin,
-cv.best_estimator_.score(X_test),
color="cyan",
linewidth=3,
label="Meilleure estimation par validation croisée",
)
plt.ylim(ymin, ymax)
plt.xlim(xmin, xmax)
plt.legend()
plt.show()
Sommaire
Dans ce laboratoire, nous avons appris à effectuer une estimation de covariance à l'aide de techniques de régularisation telles que les méthodes de rétrécissement. Nous avons comparé trois approches pour définir le paramètre de régularisation : la validation croisée, Ledoit-Wolf et OAS. Nous avons tracé la vraisemblance des données non vues pour différentes valeurs du paramètre de rétrécissement et montré les choix par validation croisée, estimations LedoitWolf et OAS.