Estimation de covariance par rétrécissement

Beginner

This tutorial is from open-source community. Access the source code

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.