Estimación de covarianza por encogimiento

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demuestra cómo realizar la estimación de covarianza utilizando técnicas de regularización como los métodos de encogimiento para reducir la varianza del estimador, así como cómo elegir la compensación sesgo-varianza. Compararemos tres enfoques para establecer el parámetro de regularización.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje sus comentarios después de la sesión y lo resolveremos rápidamente para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup(["Advanced Data Analysis and Dimensionality Reduction"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/covariance("Covariance Estimators") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/model_selection -.-> lab-49096{{"Estimación de covarianza por encogimiento"}} sklearn/covariance -.-> lab-49096{{"Estimación de covarianza por encogimiento"}} ml/sklearn -.-> lab-49096{{"Estimación de covarianza por encogimiento"}} end

Generar datos de muestra

Generamos datos de muestra con 40 características y 20 muestras. Utilizamos la función np.random.normal() para crear una distribución 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 la verosimilitud en los datos de prueba

Calculamos la log-verosimilitud negativa en los datos de prueba utilizando la clase ShrunkCovariance del módulo sklearn.covariance y la función log_likelihood del módulo scipy.linalg. Recorremos una gama de valores posibles del coeficiente de encogimiento y calculamos la verosimilitud 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 enfoques para establecer el parámetro de regularización

Comparamos tres enfoques para establecer el parámetro de regularización: validación cruzada, Ledoit-Wolf y 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)

Graficar los resultados

Graficamos la verosimilitud de datos no vistos para diferentes valores del parámetro de encogimiento y mostramos las elecciones mediante validación cruzada, estimaciones de LedoitWolf y OAS.

import matplotlib.pyplot as plt

fig = plt.figure()
plt.title("Covarianza regularizada: verosimilitud y coeficiente de encogimiento")
plt.xlabel("Parámetro de regularización: coeficiente de encogimiento")
plt.ylabel("Error: log-verosimilitud negativa en los datos de prueba")

plt.loglog(shrinkages, negative_logliks, label="Log-verosimilitud negativa")

plt.plot(plt.xlim(), 2 * [loglik_real], "--r", label="Verosimilitud de la covarianza 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="Estimación de Ledoit-Wolf",
)

plt.vlines(
    oa.shrinkage_, ymin, -loglik_oa, color="purple", linewidth=3, label="Estimación de OAS"
)

plt.vlines(
    cv.best_estimator_.shrinkage,
    ymin,
    -cv.best_estimator_.score(X_test),
    color="cyan",
    linewidth=3,
    label="Mejor estimación por validación cruzada",
)

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

plt.show()

Resumen

En este laboratorio, aprendimos cómo realizar la estimación de covarianza utilizando técnicas de regularización como los métodos de encogimiento. Comparamos tres enfoques para establecer el parámetro de regularización: validación cruzada, Ledoit-Wolf y OAS. Graficamos la verosimilitud de datos no vistos para diferentes valores del parámetro de encogimiento y mostramos las elecciones mediante validación cruzada, estimaciones de LedoitWolf y OAS.