頑健な共分散推定とマハラノビス距離の関連性

Machine LearningMachine LearningBeginner
今すぐ練習

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

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、ガウス分布データに対するマハラノビス距離を用いた頑健共分散推定の使用方法を検討します。マハラノビス距離は、点と分布との距離の尺度です。これは、点と分布の平均との距離を、分布の共分散行列の逆行列でスケーリングしたものとして定義されます。ガウス分布データの場合、マハラノビス距離を用いて、観測値から分布の最頻値までの距離を計算することができます。汚染されたデータセットのマハラノビス距離を計算する際に、共分散の頑健推定器である最小共分散決定(MCD)推定器と、標準の共分散最大尤度推定器(MLE)の性能を比較します。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebookを使って練習しましょう。

Jupyter Notebookの読み込みには数秒かかる場合があります。Jupyter Notebookの制限により、操作の検証は自動化できません。

学習中に問題がある場合は、Labbyにお問い合わせください。セッション終了後にフィードバックを提供してください。すぐに問題を解決いたします。


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{{"頑健な共分散推定とマハラノビス距離の関連性"}} ml/sklearn -.-> lab-49207{{"頑健な共分散推定とマハラノビス距離の関連性"}} end

データの生成

まず、125個のサンプルと2つの特徴量からなるデータセットを生成します。両方の特徴量は平均0のガウス分布に従います。ただし、特徴量1の標準偏差は2で、特徴量2の標準偏差は1です。次に、25個のサンプルをガウス型の外れ値サンプルに置き換えます。ここでは、特徴量1の標準偏差は1で、特徴量2の標準偏差は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)

データにMCDとMLE共分散推定器を適合させる

MCDとMLEに基づく共分散推定器をデータに適合させ、推定された共分散行列を表示します。MLEに基づく推定器(7.5)による特徴量2の推定分散は、MCDの頑健推定器(1.2)によるものよりもはるかに高いことに注意してください。これは、MCDに基づく頑健推定器が、特徴量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_
    )
)

マハラノビス距離の等高線を描画する

両方の方法で計算されたマハラノビス距離の等高線を描画します。頑健なMCDに基づくマハラノビス距離が内包点の黒点にはるかに良くフィットしているのに対し、MLEに基づく距離は外れ点の赤点の影響を受けやすいことに注意してください。

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

MLEとMCDのマハラノビス距離を比較する

MCDに基づくマハラノビス距離による外れ値の識別能力を強調します。マハラノビス距離の立方根をとることで、おおよそ正規分布が得られます。そして、箱ひげ図を用いて内包点と外れ点のサンプルの値を描画します。頑健な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()

まとめ

この実験では、ガウス分布データに対するマハラノビス距離を用いた頑健な共分散推定について学びました。汚染されたデータセットのマハラノビス距離を計算する際の、MCDとMLEに基づく共分散推定器の性能を比較しました。MCDに基づく頑健推定器は外れ値サンプルに対してはるかに強く、MCDに基づくマハラノビス距離は外れ値を識別するのに優れていることが観察されました。