使用局部离群因子(LOF)进行离群检测

局部离群因子(LOF)算法是一种无监督的异常检测方法,可计算给定数据点相对于其邻居的局部密度偏差。它认为密度远低于其邻居的样本为异常值。本示例说明如何使用LOF进行离群值检测,这是scikit-learn中此估计器的默认用例。请注意,将LOF用于离群值检测时,它没有预测predict,decision_function和score_samples方法。有关离群值检测和新颖性检测之间的区别以及如何使用LOF进行新颖性检测的详细信息,请参见《用户指南》。

通常将所考虑的邻居数量(参数n_neighbors)设置为:

​ 1)大于群集必须包含的最小样本数,以便其他样本可以是相对于该群集的局部离群值,以及

​ 2)小于最大关闭数可能是局部异常值的样本。在实践中,此类信息通常不可用,并且采用n_neighbors = 20似乎通常效果很好。

输入:

import matplotlib.pyplot as plt
from sklearn.neighbors import LocalOutlierFactor

print(__doc__)

np.random.seed(42)

# 制造训练数据
X_inliers = 0.3 * np.random.randn(1002)
X_inliers = np.r_[X_inliers + 2, X_inliers - 2]

# 制造一些离群值
X_outliers = np.random.uniform(low=-4, high=4, size=(202))
X = np.r_[X_inliers, X_outliers]

n_outliers = len(X_outliers)
ground_truth = np.ones(len(X), dtype=int)
ground_truth[-n_outliers:] = -1

# 拟合模型以进行离群值检测(默认)
clf = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
# 使用fit_predict计算训练样本的预测标签(当使用LOF进行离群值检测时,估计器没有预测,decision_function和score_samples方法)。
y_pred = clf.fit_predict(X)
n_errors = (y_pred != ground_truth).sum()
X_scores = clf.negative_outlier_factor_

plt.title("Local Outlier Factor (LOF)")
plt.scatter(X[:, 0], X[:, 1], color='k', s=3., label='Data points')
# plot circles with radius proportional to the outlier scores
radius = (X_scores.max() - X_scores) / (X_scores.max() - X_scores.min())
plt.scatter(X[:, 0], X[:, 1], s=1000 * radius, edgecolors='r',
            facecolors='none', label='Outlier scores')
plt.axis('tight')
plt.xlim((-55))
plt.ylim((-55))
plt.xlabel("prediction errors: %d" % (n_errors))
legend = plt.legend(loc='upper left')
legend.legendHandles[0]._sizes = [10]
legend.legendHandles[1]._sizes = [20]
plt.show()

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