注意
转到末尾 下载完整的示例代码。或通过JupyterLite或Binder在浏览器中运行此示例
真实数据集上的异常值检测#
此示例说明了在真实数据集上进行稳健协方差估计的必要性。它对于异常值检测和更好地理解数据结构都很有用。
我们从葡萄酒数据集中选择了两个包含两个变量的数据集,以说明可以使用几种异常值检测工具进行何种分析。为了便于可视化,我们使用的是二维示例,但应该意识到,在高维情况下,情况并非如此简单,正如我们将要指出的那样。
在下面的两个示例中,主要结果是,作为非稳健估计量的经验协方差估计受到观测值异质结构的极大影响。虽然稳健协方差估计能够关注数据分布的主要模式,但它坚持数据应服从高斯分布的假设,导致对数据结构的一些偏差估计,但仍然在某种程度上是准确的。单类SVM不假设数据分布的任何参数形式,因此可以更好地模拟数据的复杂形状。
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause
第一个示例#
第一个示例说明了最小协方差行列式稳健估计器如何在存在异常点时帮助集中在相关集群上。在这里,经验协方差估计被主集群之外的点歪曲了。当然,一些筛选工具会指出存在两个集群(支持向量机、高斯混合模型、单变量异常值检测……)。但是,如果这是一个高维示例,那么这些方法就无法轻易应用。
from sklearn.covariance import EllipticEnvelope
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.svm import OneClassSVM
estimators = {
"Empirical Covariance": EllipticEnvelope(support_fraction=1.0, contamination=0.25),
"Robust Covariance (Minimum Covariance Determinant)": EllipticEnvelope(
contamination=0.25
),
"OCSVM": OneClassSVM(nu=0.25, gamma=0.35),
}
import matplotlib.lines as mlines
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
X = load_wine()["data"][:, [1, 2]] # two clusters
fig, ax = plt.subplots()
colors = ["tab:blue", "tab:orange", "tab:red"]
# Learn a frontier for outlier detection with several classifiers
legend_lines = []
for color, (name, estimator) in zip(colors, estimators.items()):
estimator.fit(X)
DecisionBoundaryDisplay.from_estimator(
estimator,
X,
response_method="decision_function",
plot_method="contour",
levels=[0],
colors=color,
ax=ax,
)
legend_lines.append(mlines.Line2D([], [], color=color, label=name))
ax.scatter(X[:, 0], X[:, 1], color="black")
bbox_args = dict(boxstyle="round", fc="0.8")
arrow_args = dict(arrowstyle="->")
ax.annotate(
"outlying points",
xy=(4, 2),
xycoords="data",
textcoords="data",
xytext=(3, 1.25),
bbox=bbox_args,
arrowprops=arrow_args,
)
ax.legend(handles=legend_lines, loc="upper center")
_ = ax.set(
xlabel="ash",
ylabel="malic_acid",
title="Outlier detection on a real data set (wine recognition)",
)
第二个示例#
第二个示例显示了最小协方差行列式协方差稳健估计器集中在数据分布主要模式的能力:尽管由于香蕉形分布难以估计协方差,但位置似乎得到了很好的估计。无论如何,我们可以去除一些异常观测值。单类SVM能够捕获真实的数据结构,但困难在于调整其核带宽参数,以便在数据散点矩阵的形状和过度拟合数据的风险之间取得良好的平衡。
X = load_wine()["data"][:, [6, 9]] # "banana"-shaped
fig, ax = plt.subplots()
colors = ["tab:blue", "tab:orange", "tab:red"]
# Learn a frontier for outlier detection with several classifiers
legend_lines = []
for color, (name, estimator) in zip(colors, estimators.items()):
estimator.fit(X)
DecisionBoundaryDisplay.from_estimator(
estimator,
X,
response_method="decision_function",
plot_method="contour",
levels=[0],
colors=color,
ax=ax,
)
legend_lines.append(mlines.Line2D([], [], color=color, label=name))
ax.scatter(X[:, 0], X[:, 1], color="black")
ax.legend(handles=legend_lines, loc="upper center")
ax.set(
xlabel="flavanoids",
ylabel="color_intensity",
title="Outlier detection on a real data set (wine recognition)",
)
plt.show()
脚本的总运行时间:(0 分钟 0.424 秒)
相关示例
比较用于玩具数据集异常值检测的异常检测算法
使用局部异常因子 (LOF) 进行异常值检测
具有协方差椭球的线性判别分析和二次判别分析
稳健与经验协方差估计