Detección de valores atípicos con Local Outlier Factor (LOF)

El algoritmo Local Outlier Factor (LOF) es un método de detección de anomalías no supervisado que calcula la desviación de la densidad local de un punto de datos dado con respecto a sus vecinos. Considera como valores atípicos las muestras que tienen una densidad sustancialmente inferior a la de sus vecinos. Este ejemplo muestra cómo utilizar LOF para la detección de valores atípicos, que es el caso de uso por defecto de este estimador en scikit-learn. Ten en cuenta que cuando LOF se utiliza para la detección de valores atípicos no tiene los métodos predict, decision_function y score_samples. Consulta el Manual de usuario: para más detalles sobre la diferencia entre la detección de valores atípicos y la detección de novedades y cómo usar LOF para la detección de novedades.

El número de vecinos considerado (parámetro n_neighbors) suele ser 1) mayor que el número mínimo de muestras que debe contener un conglomerado, de modo que otras muestras puedan ser valores atípicos locales en relación con este conglomerado, y 2) menor que el número máximo de muestras cercanas que pueden ser potencialmente valores atípicos locales. En la práctica, esta información no suele estar disponible, y tomar n_neighbors=20 parece funcionar bien en general.

Local Outlier Factor (LOF)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import LocalOutlierFactor

print(__doc__)

np.random.seed(42)

# Generate train data
X_inliers = 0.3 * np.random.randn(100, 2)
X_inliers = np.r_[X_inliers + 2, X_inliers - 2]

# Generate some outliers
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))
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

# fit the model for outlier detection (default)
clf = LocalOutlierFactor(n_neighbors=20, contamination=0.1)
# use fit_predict to compute the predicted labels of the training samples
# (when LOF is used for outlier detection, the estimator has no predict,
# decision_function and score_samples methods).
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((-5, 5))
plt.ylim((-5, 5))
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()

Tiempo total de ejecución del script: (0 minutos 0.099 segundos)

Galería generada por Sphinx-Gallery