はじめに
この実験では、ガウス分布データに対するマハラノビス距離を用いた頑健共分散推定の使用方法を検討します。マハラノビス距離は、点と分布との距離の尺度です。これは、点と分布の平均との距離を、分布の共分散行列の逆行列でスケーリングしたものとして定義されます。ガウス分布データの場合、マハラノビス距離を用いて、観測値から分布の最頻値までの距離を計算することができます。汚染されたデータセットのマハラノビス距離を計算する際に、共分散の頑健推定器である最小共分散決定(MCD)推定器と、標準の共分散最大尤度推定器(MLE)の性能を比較します。
VM のヒント
VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。
Jupyter Notebook の読み込みには数秒かかる場合があります。Jupyter Notebook の制限により、操作の検証は自動化できません。
学習中に問題がある場合は、Labby にお問い合わせください。セッション終了後にフィードバックを提供してください。すぐに問題を解決いたします。
データの生成
まず、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 に基づくマハラノビス距離は外れ値を識別するのに優れていることが観察されました。