Detección de anomalías con Isolation Forest

Machine LearningMachine LearningBeginner
Practicar Ahora

This tutorial is from open-source community. Access the source code

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

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.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/inspection("Inspection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-49171{{"Detección de anomalías con Isolation Forest"}} sklearn/model_selection -.-> lab-49171{{"Detección de anomalías con Isolation Forest"}} sklearn/inspection -.-> lab-49171{{"Detección de anomalías con Isolation Forest"}} ml/sklearn -.-> lab-49171{{"Detección de anomalías con Isolation Forest"}} end

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.