Estimation de covariance robuste et pertinence des distances de Mahalanobis

Machine LearningMachine LearningBeginner
Pratiquer maintenant

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

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, nous explorerons l'utilisation d'une estimation de covariance robuste avec des distances de Mahalanobis sur des données distribuées selon une loi normale. La distance de Mahalanobis est une mesure de la distance entre un point et une distribution. Elle est définie comme la distance entre un point et la moyenne de la distribution, mise à l'échelle par l'inverse de la matrice de covariance de la distribution. Pour des données distribuées selon une loi normale, la distance de Mahalanobis peut être utilisée pour calculer la distance d'une observation au mode de la distribution. Nous comparerons les performances de l'estimateur de déterminant de covariance minimum (MCD), un estimateur robuste de covariance, avec l'estimateur maximum de vraisemblance (MLE) de covariance standard dans le calcul des distances de Mahalanobis d'un ensemble de données contaminé.

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 au carnet Jupyter pour pratiquer.

Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter ait fini de charger. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter.

Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez des commentaires après la session, et nous résoudrons rapidement le problème pour vous.


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{{"Estimation de covariance robuste et pertinence des distances de Mahalanobis"}} ml/sklearn -.-> lab-49207{{"Estimation de covariance robuste et pertinence des distances de Mahalanobis"}} end

Générer des données

Tout d'abord, nous générons un ensemble de données de 125 échantillons et 2 caractéristiques. Les deux caractéristiques sont distribuées selon une loi normale avec une moyenne de 0. Cependant, la caractéristique 1 a un écart-type égal à 2 et la caractéristique 2 a un écart-type égal à 1. Ensuite, nous remplaçons 25 échantillons par des échantillons aberrants gaussiens où la caractéristique 1 a un écart-type égal à 1 et la caractéristique 2 a un écart-type égal à 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)

Ajuster les estimateurs de covariance MCD et MLE aux données

Nous ajusterons les estimateurs de covariance basés sur MCD et MLE à nos données et afficherons les matrices de covariance estimées. Remarquez que la variance estimée de la caractéristique 2 est beaucoup plus élevée avec l'estimateur basé sur MLE (7,5) que celle de l'estimateur robuste MCD (1,2). Cela montre que l'estimateur robuste basé sur MCD est beaucoup plus résistant aux échantillons aberrants, qui ont été conçus pour avoir une variance beaucoup plus élevée dans la caractéristique 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_
    )
)

Tracer les contours des distances de Mahalanobis

Nous tracerons les contours des distances de Mahalanobis calculées par les deux méthodes. Remarquez que les distances de Mahalanobis basées sur MCD robuste s'ajustent beaucoup mieux aux points noirs des données valides, tandis que les distances basées sur MLE sont plus influencées par les points rouges des données aberrantes.

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

#Comparer les distances de Mahalanobis MLE et MCD

Nous mettrons en évidence la capacité des distances de Mahalanobis basées sur MCD à distinguer les données aberrantes. Nous prenons la racine cubique des distances de Mahalanobis, ce qui donne des distributions approximativement normales. Ensuite, nous traçons les valeurs des échantillons de données valides et des échantillons aberrants avec des diagrammes en boîte. La distribution des échantillons aberrants est plus séparée de la distribution des échantillons de données valides pour les distances de Mahalanobis basées sur MCD robuste.

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

Sommaire

Dans ce laboratoire, nous avons appris à estimer la covariance robuste avec les distances de Mahalanobis sur des données distribuées selon une loi normale. Nous avons comparé les performances des estimateurs de covariance basés sur MCD et MLE dans le calcul des distances de Mahalanobis d'un ensemble de données contaminé. Nous avons observé que l'estimateur robuste basé sur MCD est beaucoup plus résistant aux échantillons aberrants et que les distances de Mahalanobis basées sur MCD sont meilleures pour distinguer les données aberrantes.