在数据分析中,异常检测是一个重要的步骤,它有助于识别和处理那些不符合预期模式的数据点。此外,深入理解数据的结构对于数据科学家来说同样至关重要。本文将通过葡萄酒数据集的两个变量子集来展示如何使用不同的异常检测工具进行分析。虽然这里使用的是二维示例以便于可视化,但需要指出的是,在高维数据中,情况要复杂得多。
在下面的两个例子中,可以看到经验协方差估计作为非稳健估计,非常容易受到观测数据异质性结构的影响。尽管稳健协方差估计能够集中关注数据分布的主要模式,但它仍然假设数据应该是高斯分布的,这导致了对数据结构的一些有偏估计,尽管在某种程度上仍然是准确的。单类支持向量机(OCSVM)不假设数据分布的任何参数形式,因此能够更好地模拟数据的复杂形状。
第一个例子展示了最小协方差行列式稳健估计器如何在存在异常点时帮助集中关注相关聚类。在这里,经验协方差估计被主聚类之外的点所扭曲。当然,一些筛选工具可能会指出存在两个聚类(支持向量机、高斯混合模型、单变量异常检测等)。但如果这是一个高维示例,那么这些工具就不容易应用了。
from sklearn.covariance import EllipticEnvelope
from sklearn.inspection import DecisionBoundaryDisplay
from sklearn.svm import OneClassSVM
import matplotlib.pyplot as plt
from sklearn.datasets import load_wine
# 定义估计器
estimators = {
"经验协方差": EllipticEnvelope(support_fraction=1.0, contamination=0.25),
"稳健协方差(最小协方差行列式)": EllipticEnvelope(contamination=0.25),
"OCSVM": OneClassSVM(nu=0.25, gamma=0.35),
}
# 加载数据
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="葡萄酒识别数据集上的异常检测")
plt.show()
在这个例子中,使用了最小协方差行列式稳健估计器来关注数据的主要聚类。尽管由于数据的异质性结构,经验协方差估计被扭曲,但稳健估计器能够集中关注数据的主要模式。单类支持向量机(OCSVM)不假设数据分布的任何参数形式,因此能够更好地模拟数据的复杂形状。
第二个例子展示了最小协方差行列式稳健估计器如何集中关注数据分布的主要模式:尽管由于数据的香蕉形状分布,协方差估计较为困难,但位置似乎被很好地估计了。无论如何,可以摆脱一些异常观测。单类支持向量机能够捕捉到真实的数据结构,但难点在于调整其核带宽参数,以便在数据散布矩阵的形状和过拟合数据的风险之间取得良好的折衷。
# 加载数据
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()
在这个例子中,使用了最小协方差行列式稳健估计器来关注数据分布的主要模式。尽管由于数据的香蕉形状分布,协方差估计较为困难,但位置似乎被很好地估计了。单类支持向量机能够捕捉到真实的数据结构,但难点在于调整其核带宽参数,以便在数据散布矩阵的形状和过拟合数据的风险之间取得良好的折衷。