Relevancia de la estimación robusta de covarianza y las distancias de Mahalanobis

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

En este laboratorio, exploraremos el uso de la estimación de covarianza robusta con distancias de Mahalanobis en datos distribuidos gaussianamente. La distancia de Mahalanobis es una medida de la distancia entre un punto y una distribución. Se define como la distancia entre un punto y la media de la distribución, escalada por la inversa de la matriz de covarianza de la distribución. Para datos distribuidos gaussianamente, la distancia de Mahalanobis se puede utilizar para calcular la distancia de una observación al modo de la distribución. Compararemos el rendimiento del estimador de Determinante de Covarianza Mínima (MCD), un estimador robusto de covarianza, con el estimador de Máxima Verosimilitud de Covarianza estándar (MLE) en el cálculo de las distancias de Mahalanobis de un conjunto de datos contaminado.

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 cargar. 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 resolveremos rápidamente el problema 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/AdvancedDataAnalysisandDimensionalityReductionGroup -.-> sklearn/covariance("Covariance Estimators") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/covariance -.-> lab-49207{{"Relevancia de la estimación robusta de covarianza y las distancias de Mahalanobis"}} ml/sklearn -.-> lab-49207{{"Relevancia de la estimación robusta de covarianza y las distancias de Mahalanobis"}} end

Generar datos

Primero, generamos un conjunto de datos de 125 muestras y 2 características. Ambas características se distribuyen gaussianamente con una media de 0. Sin embargo, la característica 1 tiene una desviación estándar igual a 2 y la característica 2 tiene una desviación estándar igual a 1. A continuación, reemplazamos 25 muestras con muestras atípicas gaussianas donde la característica 1 tiene una desviación estándar igual a 1 y la característica 2 tiene una desviación estándar igual a 7.

import numpy as np

## for consistent results
np.random.seed(7)

n_samples = 125
n_outliers = 25
n_features = 2

## generate Gaussian data of shape (125, 2)
gen_cov = np.eye(n_features)
gen_cov[0, 0] = 2.0
X = np.dot(np.random.randn(n_samples, n_features), gen_cov)
## add some outliers
outliers_cov = np.eye(n_features)
outliers_cov[np.arange(1, n_features), np.arange(1, n_features)] = 7.0
X[-n_outliers:] = np.dot(np.random.randn(n_outliers, n_features), outliers_cov)

Ajustar los estimadores de covarianza MCD y MLE a los datos

Ajustaremos los estimadores de covarianza basados en MCD y MLE a nuestros datos e imprimiremos las matrices de covarianza estimadas. Tenga en cuenta que la varianza estimada de la característica 2 es mucho más alta con el estimador basado en MLE (7.5) que con el estimador robusto MCD (1.2). Esto muestra que el estimador robusto basado en MCD es mucho más resistente a las muestras atípicas, que se diseñaron para tener una varianza mucho mayor en la característica 2.

from sklearn.covariance import EmpiricalCovariance, MinCovDet

## fit a MCD robust estimator to data
robust_cov = MinCovDet().fit(X)
## fit a MLE estimator to data
emp_cov = EmpiricalCovariance().fit(X)
print(
    "Estimated covariance matrix:\nMCD (Robust):\n{}\nMLE:\n{}".format(
        robust_cov.covariance_, emp_cov.covariance_
    )
)

Graficar los contornos de las distancias de Mahalanobis

Graficaremos los contornos de las distancias de Mahalanobis calculadas por ambos métodos. Observe que las distancias de Mahalanobis basadas en el robusto MCD se ajustan mucho mejor a los puntos negros de los valores atípicos, mientras que las distancias basadas en MLE están más influenciadas por los puntos rojos de los valores atípicos.

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(10, 5))
## Plot data set
inlier_plot = ax.scatter(X[:, 0], X[:, 1], color="black", label="inliers")
outlier_plot = ax.scatter(
    X[:, 0][-n_outliers:], X[:, 1][-n_outliers:], color="red", label="outliers"
)
ax.set_xlim(ax.get_xlim()[0], 10.0)
ax.set_title("Mahalanobis distances of a contaminated data set")

## Create meshgrid of feature 1 and feature 2 values
xx, yy = np.meshgrid(
    np.linspace(plt.xlim()[0], plt.xlim()[1], 100),
    np.linspace(plt.ylim()[0], plt.ylim()[1], 100),
)
zz = np.c_[xx.ravel(), yy.ravel()]
## Calculate the MLE based Mahalanobis distances of the meshgrid
mahal_emp_cov = emp_cov.mahalanobis(zz)
mahal_emp_cov = mahal_emp_cov.reshape(xx.shape)
emp_cov_contour = plt.contour(
    xx, yy, np.sqrt(mahal_emp_cov), cmap=plt.cm.PuBu_r, linestyles="dashed"
)
## Calculate the MCD based Mahalanobis distances
mahal_robust_cov = robust_cov.mahalanobis(zz)
mahal_robust_cov = mahal_robust_cov.reshape(xx.shape)
robust_contour = ax.contour(
    xx, yy, np.sqrt(mahal_robust_cov), cmap=plt.cm.YlOrBr_r, linestyles="dotted"
)

## Add legend
ax.legend(
    [
        emp_cov_contour.collections[1],
        robust_contour.collections[1],
        inlier_plot,
        outlier_plot,
    ],
    ["MLE dist", "MCD dist", "inliers", "outliers"],
    loc="upper right",
    borderaxespad=0,
)

plt.show()

Comparar las distancias de Mahalanobis MLE y MCD

Destacaremos la capacidad de las distancias de Mahalanobis basadas en MCD para distinguir valores atípicos. Tomamos la raíz cúbica de las distancias de Mahalanobis, lo que produce distribuciones aproximadamente normales. Luego, graficamos los valores de las muestras de valores atípicos y valores atípicos con diagramas de caja. La distribución de las muestras de valores atípicos está más separada de la distribución de las muestras de valores atípicos para las distancias de Mahalanobis basadas en el robusto MCD.

fig, (ax1, ax2) = plt.subplots(1, 2)
plt.subplots_adjust(wspace=0.6)

## Calculate cubic root of MLE Mahalanobis distances for samples
emp_mahal = emp_cov.mahalanobis(X - np.mean(X, 0)) ** (0.33)
## Plot boxplots
ax1.boxplot([emp_mahal[:-n_outliers], emp_mahal[-n_outliers:]], widths=0.25)
## Plot individual samples
ax1.plot(
    np.full(n_samples - n_outliers, 1.26),
    emp_mahal[:-n_outliers],
    "+k",
    markeredgewidth=1,
)
ax1.plot(np.full(n_outliers, 2.26), emp_mahal[-n_outliers:], "+k", markeredgewidth=1)
ax1.axes.set_xticklabels(("inliers", "outliers"), size=15)
ax1.set_ylabel(r"$\sqrt[3]{\rm{(Mahal. dist.)}}$", size=16)
ax1.set_title("Using non-robust estimates\n(Maximum Likelihood)")

## Calculate cubic root of MCD Mahalanobis distances for samples
robust_mahal = robust_cov.mahalanobis(X - robust_cov.location_) ** (0.33)
## Plot boxplots
ax2.boxplot([robust_mahal[:-n_outliers], robust_mahal[-n_outliers:]], widths=0.25)
## Plot individual samples
ax2.plot(
    np.full(n_samples - n_outliers, 1.26),
    robust_mahal[:-n_outliers],
    "+k",
    markeredgewidth=1,
)
ax2.plot(np.full(n_outliers, 2.26), robust_mahal[-n_outliers:], "+k", markeredgewidth=1)
ax2.axes.set_xticklabels(("inliers", "outliers"), size=15)
ax2.set_ylabel(r"$\sqrt[3]{\rm{(Mahal. dist.)}}$", size=16)
ax2.set_title("Using robust estimates\n(Minimum Covariance Determinant)")

plt.show()

Resumen

En este laboratorio, aprendimos sobre la estimación robusta de covarianza con distancias de Mahalanobis en datos distribuidos gaussianamente. Comparamos el rendimiento de los estimadores de covarianza basados en MCD y MLE al calcular las distancias de Mahalanobis de un conjunto de datos contaminado. Observamos que el estimador robusto basado en MCD es mucho más resistente a las muestras atípicas y que las distancias de Mahalanobis basadas en MCD son mejores para distinguir valores atípicos.