Introducción
En este laboratorio, revisaremos el proceso de uso del Isolation Forest para la detección de anomalías. Comenzaremos generando un conjunto de datos con dos clusters y algunos valores atípicos, luego entrenaremos un modelo de Isolation Forest para identificar los valores atípicos. Finalmente, visualizaremos el límite de decisión del modelo para ver cómo separa los valores normales de los valores atípicos.
Consejos sobre la VM
Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.
A veces, es posible que tenga que esperar algunos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.
Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje comentarios después de la sesión y resolveremos rápidamente el problema para usted.
Generación de datos
Generaremos un conjunto de datos con dos clusters y algunos valores atípicos. Los clusters se generarán mediante la extracción de muestras aleatorias de la distribución normal estándar. Uno de ellos será esférico y el otro ligeramente deformado. Los valores atípicos se generarán mediante la extracción de muestras aleatorias de una distribución uniforme.
import numpy as np
from sklearn.model_selection import train_test_split
n_samples, n_outliers = 120, 40
rng = np.random.RandomState(0)
covariance = np.array([[0.5, -0.1], [0.7, 0.4]])
cluster_1 = 0.4 * rng.randn(n_samples, 2) @ covariance + np.array([2, 2]) ## general
cluster_2 = 0.3 * rng.randn(n_samples, 2) + np.array([-2, -2]) ## spherical
outliers = rng.uniform(low=-4, high=4, size=(n_outliers, 2))
X = np.concatenate([cluster_1, cluster_2, outliers])
y = np.concatenate(
[np.ones((2 * n_samples), dtype=int), -np.ones((n_outliers), dtype=int)]
)
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
Visualizar el conjunto de datos
Podemos visualizar los clusters resultantes para ver cómo se ve el conjunto de datos.
import matplotlib.pyplot as plt
scatter = plt.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor="k")
handles, labels = scatter.legend_elements()
plt.axis("square")
plt.legend(handles=handles, labels=["outliers", "inliers"], title="true class")
plt.title("Gaussian inliers with \nuniformly distributed outliers")
plt.show()
Entrenar el modelo
Entrenaremos un modelo de Isolation Forest con los datos de entrenamiento.
from sklearn.ensemble import IsolationForest
clf = IsolationForest(max_samples=100, random_state=0)
clf.fit(X_train)
Graficar el límite de decisión discreto
Usaremos la clase DecisionBoundaryDisplay para visualizar un límite de decisión discreto. El color de fondo representa si se predice que una muestra en esa área dada es un valor atípico o no. La gráfica de dispersión muestra las etiquetas reales.
import matplotlib.pyplot as plt
from sklearn.inspection import DecisionBoundaryDisplay
disp = DecisionBoundaryDisplay.from_estimator(
clf,
X,
response_method="predict",
alpha=0.5,
)
disp.ax_.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor="k")
disp.ax_.set_title("Binary decision boundary \nof IsolationForest")
plt.axis("square")
plt.legend(handles=handles, labels=["outliers", "inliers"], title="true class")
plt.show()
Graficar el límite de decisión de la longitud del camino
Al establecer response_method="decision_function", el fondo de DecisionBoundaryDisplay representa la medida de normalidad de una observación. Tal puntuación se da por la longitud del camino promediada sobre un bosque de árboles aleatorios, que a su vez se da por la profundidad de la hoja (o equivalentemente el número de divisiones) requeridas para aislar una muestra dada.
disp = DecisionBoundaryDisplay.from_estimator(
clf,
X,
response_method="decision_function",
alpha=0.5,
)
disp.ax_.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor="k")
disp.ax_.set_title("Path length decision boundary \nof IsolationForest")
plt.axis("square")
plt.legend(handles=handles, labels=["outliers", "inliers"], title="true class")
plt.colorbar(disp.ax_.collections[1])
plt.show()
Resumen
En este laboratorio, aprendimos cómo usar Isolation Forest para la detección de anomalías. Generamos un conjunto de datos con dos clusters y algunos valores atípicos, entrenamos un modelo de Isolation Forest para identificar los valores atípicos y visualizamos el límite de decisión del modelo para ver cómo separa los valores normales y los valores atípicos.