Estimação de Covariância por Encolhimento

Beginner

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

Introdução

Este laboratório demonstra como realizar a estimação de covariância utilizando técnicas de regularização, como métodos de encolhimento, para reduzir a variância do estimador, bem como como escolher o equilíbrio entre viés e variância. Vamos comparar três abordagens para definir o parâmetro de regularização.

Dicas da Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para praticar.

Às vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Gerar Dados de Amostra

Geramos dados de amostra com 40 características e 20 amostras. Usamos a função np.random.normal() para criar uma distribuição normal.

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)

Calcular a Probabilidade nos Dados de Teste

Calculamos a probabilidade logarítmica negativa nos dados de teste utilizando a classe ShrunkCovariance do módulo sklearn.covariance e a função log_likelihood do módulo scipy.linalg. Abrangemos uma gama de valores possíveis para o coeficiente de encolhimento e calculamos a probabilidade para cada valor.

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))

Comparar Diferentes Abordagens para Definir o Parâmetro de Regularização

Comparamos três abordagens para definir o parâmetro de regularização: validação cruzada, Ledoit-Wolf e 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)

Plotar Resultados

Plotamos a probabilidade de dados não vistos para diferentes valores do parâmetro de encolhimento e mostramos as escolhas feitas pela validação cruzada, as estimativas LedoitWolf e OAS.

import matplotlib.pyplot as plt

fig = plt.figure()
plt.title("Covariância regularizada: probabilidade e coeficiente de encolhimento")
plt.xlabel("Parâmetro de regularização: coeficiente de encolhimento")
plt.ylabel("Erro: probabilidade logarítmica negativa nos dados de teste")

plt.loglog(shrinkages, negative_logliks, label="Probabilidade logarítmica negativa")

plt.plot(plt.xlim(), 2 * [loglik_real], "--r", label="Probabilidade da covariância real")

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="Estimativa Ledoit-Wolf",
)

plt.vlines(
    oa.shrinkage_, ymin, -loglik_oa, color="purple", linewidth=3, label="Estimativa OAS"
)

plt.vlines(
    cv.best_estimator_.shrinkage,
    ymin,
    -cv.best_estimator_.score(X_test),
    color="cyan",
    linewidth=3,
    label="Melhor estimativa da validação cruzada",
)

plt.ylim(ymin, ymax)
plt.xlim(xmin, xmax)
plt.legend()

plt.show()

Resumo

Neste laboratório, aprendemos como realizar a estimação de covariância utilizando técnicas de regularização, como métodos de encolhimento. Comparámos três abordagens para definir o parâmetro de regularização: validação cruzada, Ledoit-Wolf e OAS. Plotamos a probabilidade de dados não vistos para diferentes valores do parâmetro de encolhimento e mostramos as escolhas feitas pelas estimativas de validação cruzada, LedoitWolf e OAS.