鲁棒协方差估计与异常检测

在实际数据集中进行鲁棒协方差估计的必要性不仅体现在异常检测上,还有助于更好地理解数据结构。本文选取了葡萄酒数据集中的两组变量,通过这些变量的分析,展示了使用多种异常检测工具可以进行的分析类型。为了可视化的目的,以二维示例进行工作,但需要注意的是,在高维情况下,情况并非如此简单,这一点将在后文指出。

在下面的两个示例中,主要结果表明,经验协方差估计作为一种非鲁棒的估计,受到观测数据异质结构的高度影响。尽管鲁棒协方差估计能够集中关注数据分布的主要模式,但它仍然坚持数据应为高斯分布的假设,从而在一定程度上产生了对数据结构的有偏估计,但仍然具有一定的准确性。单类支持向量机(One-Class SVM)不假设数据分布的任何参数形式,因此能够更好地模拟数据的复杂形状。

第一个示例

第一个示例说明了当存在异常点时,最小协方差行列式鲁棒估计器如何帮助集中关注相关聚类。在这里,经验协方差估计被主聚类之外的点所偏斜。当然,一些筛选工具可能会指出存在两个聚类(支持向量机、高斯混合模型、单变量异常检测等)。但如果这是一个高维示例,那么这些工具将无法如此轻易地应用。

from sklearn.covariance import EllipticEnvelope from sklearn.inspection import DecisionBoundaryDisplay from sklearn.svm import OneClassSVM estimators = { "经验协方差": EllipticEnvelope(support_fraction=1.0, contamination=0.25), "鲁棒协方差(最小协方差行列式)": EllipticEnvelope(contamination=0.25), "OCSVM": OneClassSVM(nu=0.25, gamma=0.35), } import matplotlib.pyplot as plt from sklearn.datasets import load_wine X = load_wine()["data"][:, [1, 2]] # 两个聚类 fig, ax = plt.subplots() colors = ["tab:blue", "tab:orange", "tab:red"] # 使用不同的分类器学习异常检测的边界 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="灰分", ylabel="苹果酸", title="实际数据集上的异常检测(葡萄酒识别)")

第二个示例

第二个示例展示了最小协方差行列式鲁棒估计器在数据分布的主要模式上的集中能力:尽管由于香蕉形分布,协方差估计较为困难,但位置似乎被很好地估计了,尽管如此,仍然可以摆脱一些异常观测。单类SVM能够捕捉到真实的数据结构,但困难在于调整其核带宽参数,以便在数据散射矩阵的形状和过度拟合数据的风险之间获得良好的折衷。

X = load_wine()["data"][:, [6, 9]] # "香蕉"形 fig, ax = plt.subplots() colors = ["tab:blue", "tab:orange", "tab:red"] # 使用不同的分类器学习异常检测的边界 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="黄酮类化合物", ylabel="颜色强度", title="实际数据集上的异常检测(葡萄酒识别)") plt.show()

脚本的总运行时间:(0分钟0.409秒)

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485