使用局部離群因子(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秒)