Scikit Learn: detección de anomalías
Aquí, aprenderemos sobre qué es la detección de anomalías en Sklearn y cómo se utiliza en la identificación de los puntos de datos.
La detección de anomalías es una técnica que se utiliza para identificar puntos de datos en un conjunto de datos que no se ajusta bien al resto de los datos. Tiene muchas aplicaciones en los negocios, como detección de fraude, detección de intrusiones, monitoreo del estado del sistema, vigilancia y mantenimiento predictivo. Las anomalías, que también se denominan valores atípicos, se pueden dividir en las siguientes tres categorías:
Point anomalies - Ocurre cuando una instancia de datos individual se considera anómala con el resto de los datos.
Contextual anomalies- Este tipo de anomalía es específico del contexto. Ocurre si una instancia de datos es anómala en un contexto específico.
Collective anomalies - Ocurre cuando una colección de instancias de datos relacionados es anómala con el conjunto de datos completo en lugar de valores individuales.
Métodos
Dos métodos a saber outlier detection y novelty detectionse puede utilizar para la detección de anomalías. Es necesario ver la distinción entre ellos.
Detección de valores atípicos
Los datos de entrenamiento contienen valores atípicos que están lejos del resto de los datos. Estos valores atípicos se definen como observaciones. Esa es la razón, los estimadores de detección de valores atípicos siempre intentan ajustarse a la región que tiene los datos de entrenamiento más concentrados mientras ignoran las observaciones desviadas. También se conoce como detección de anomalías no supervisada.
Detección de novedades
Se ocupa de detectar un patrón no observado en nuevas observaciones que no se incluye en los datos de entrenamiento. Aquí, los datos de entrenamiento no están contaminados por valores atípicos. También se conoce como detección de anomalías semi-supervisada.
Hay un conjunto de herramientas de aprendizaje automático, proporcionadas por scikit-learn, que se pueden utilizar tanto para la detección de valores atípicos como para la detección de novedades. Estas herramientas primero implementan el aprendizaje de objetos a partir de los datos de una manera no supervisada mediante el uso del método fit () de la siguiente manera:
estimator.fit(X_train)
Ahora, las nuevas observaciones se ordenarían como inliers (labeled 1) o outliers (labeled -1) utilizando el método predict () de la siguiente manera:
estimator.fit(X_test)
El estimador primero calculará la función de puntuación bruta y luego el método de predicción hará uso del umbral en esa función de puntuación bruta. Podemos acceder a esta función de puntuación sin procesar con la ayuda descore_sample método y puede controlar el umbral mediante contamination parámetro.
También podemos definir decision_function método que define los valores atípicos como valor negativo y los inliers como valor no negativo.
estimator.decision_function(X_test)
Algoritmos de Sklearn para la detección de valores atípicos
Comencemos por comprender qué es una envoltura elíptica.
Colocación de una envolvente elíptica
Este algoritmo asume que los datos regulares provienen de una distribución conocida como la distribución gaussiana. Para la detección de valores atípicos, Scikit-learn proporciona un objeto llamadocovariance.EllipticEnvelop.
Este objeto ajusta una estimación de covarianza robusta a los datos y, por lo tanto, ajusta una elipse a los puntos de datos centrales. Ignora los puntos fuera del modo central.
Parámetros
La siguiente tabla consta de los parámetros utilizados por sklearn. covariance.EllipticEnvelop método -
No Señor | Descripción de parámetros |
---|---|
1 | store_precision - Booleano, opcional, predeterminado = Verdadero Podemos especificarlo si se almacena la precisión estimada. |
2 | assume_centered - Booleano, opcional, predeterminado = Falso Si lo configuramos como Falso, calculará la ubicación robusta y la covarianza directamente con la ayuda del algoritmo FastMCD. Por otro lado, si se establece en True, calculará el soporte de ubicación robusta y covariana. |
3 | support_fraction - flotar en (0., 1.), opcional, predeterminado = Ninguno Este parámetro le dice al método qué proporción de puntos se incluirán en el apoyo de las estimaciones brutas de MCD. |
4 | contamination - flotar en (0., 1.), opcional, predeterminado = 0.1 Proporciona la proporción de valores atípicos en el conjunto de datos. |
5 | random_state - int, instancia de RandomState o None, opcional, predeterminado = ninguno Este parámetro representa la semilla del número pseudoaleatorio generado que se usa mientras se barajan los datos. Las siguientes son las opciones:
|
Atributos
La siguiente tabla consta de los atributos utilizados por sklearn. covariance.EllipticEnvelop método -
No Señor | Atributos y descripción |
---|---|
1 | support_ - tipo matriz, forma (n_samples,) Representa la máscara de las observaciones que se utilizan para calcular estimaciones sólidas de ubicación y forma. |
2 | location_ - forma de matriz (n_features) Devuelve la ubicación robusta estimada. |
3 | covariance_ - tipo matriz, forma (n_features, n_features) Devuelve la matriz de covarianza robusta estimada. |
4 | precision_ - tipo matriz, forma (n_features, n_features) Devuelve la matriz pseudo inversa estimada. |
5 | offset_ - flotar Se utiliza para definir la función de decisión a partir de las puntuaciones brutas. decision_function = score_samples -offset_ |
Implementation Example
import numpy as np^M
from sklearn.covariance import EllipticEnvelope^M
true_cov = np.array([[.5, .6],[.6, .4]])
X = np.random.RandomState(0).multivariate_normal(mean = [0, 0], cov=true_cov,size=500)
cov = EllipticEnvelope(random_state = 0).fit(X)^M
# Now we can use predict method. It will return 1 for an inlier and -1 for an outlier.
cov.predict([[0, 0],[2, 2]])
Output
array([ 1, -1])
Bosque de aislamiento
En el caso de un conjunto de datos de alta dimensión, una forma eficaz de detectar valores atípicos es utilizar bosques aleatorios. El scikit-learn proporcionaensemble.IsolationForestmétodo que aísla las observaciones mediante la selección aleatoria de una característica. Posteriormente, selecciona aleatoriamente un valor entre los valores máximo y mínimo de las características seleccionadas.
Aquí, el número de divisiones necesarias para aislar una muestra es equivalente a la longitud de la ruta desde el nodo raíz hasta el nodo de terminación.
Parámetros
La siguiente tabla consta de los parámetros utilizados por sklearn. ensemble.IsolationForest método -
No Señor | Descripción de parámetros |
---|---|
1 | n_estimators - int, opcional, predeterminado = 100 Representa el número de estimadores base en el conjunto. |
2 | max_samples - int o float, opcional, predeterminado = "auto" Representa el número de muestras que se extraerán de X para entrenar a cada estimador base. Si elegimos int como su valor, extraerá muestras de max_samples. Si elegimos float como su valor, extraerá max_samples ∗ .shape [0] samples. Y, si elegimos auto como su valor, dibujará max_samples = min (256, n_samples). |
3 | support_fraction - flotar en (0., 1.), opcional, predeterminado = Ninguno Este parámetro le dice al método qué proporción de puntos se incluirán en el apoyo de las estimaciones brutas de MCD. |
4 | contamination - automático o flotante, opcional, predeterminado = automático Proporciona la proporción de valores atípicos en el conjunto de datos. Si lo configuramos por defecto, es decir, automático, determinará el umbral como en el papel original. Si se configura para flotar, el rango de contaminación estará en el rango de [0,0.5]. |
5 | random_state - int, instancia de RandomState o None, opcional, predeterminado = ninguno Este parámetro representa la semilla del número pseudoaleatorio generado que se usa mientras se barajan los datos. Las siguientes son las opciones:
|
6 | max_features - int o float, opcional (predeterminado = 1.0) Representa el número de características que se extraerán de X para entrenar a cada estimador base. Si elegimos int como su valor, dibujará características de max_features. Si elegimos float como su valor, extraerá muestras de max_features * X.shape []. |
7 | bootstrap - Booleano, opcional (predeterminado = Falso) Su opción predeterminada es False, lo que significa que el muestreo se realizaría sin reemplazo. Y, por otro lado, si se establece en Verdadero, significa que los árboles individuales se ajustan a un subconjunto aleatorio de los datos de entrenamiento muestreados con reemplazo. |
8 | n_jobs - int o None, opcional (predeterminado = None) Representa el número de trabajos que se ejecutarán en paralelo para fit() y predict() métodos ambos. |
9 | verbose - int, opcional (predeterminado = 0) Este parámetro controla la verbosidad del proceso de construcción del árbol. |
10 | warm_start - Bool, opcional (predeterminado = falso) Si warm_start = true, podemos reutilizar la solución de llamadas anteriores para ajustar y podemos agregar más estimadores al conjunto. Pero si se establece en falso, necesitamos adaptar un bosque completamente nuevo. |
Atributos
La siguiente tabla consta de los atributos utilizados por sklearn. ensemble.IsolationForest método -
No Señor | Atributos y descripción |
---|---|
1 | estimators_ - lista de DecisionTreeClassifier Proporcionar la colección de todos los subestimadores ajustados. |
2 | max_samples_ - entero Proporciona el número real de muestras utilizadas. |
3 | offset_ - flotar Se utiliza para definir la función de decisión a partir de las puntuaciones brutas. decision_function = score_samples -offset_ |
Implementation Example
La secuencia de comandos de Python a continuación utilizará sklearn. ensemble.IsolationForest método para ajustar 10 árboles en datos dados
from sklearn.ensemble import IsolationForest
import numpy as np
X = np.array([[-1, -2], [-3, -3], [-3, -4], [0, 0], [-50, 60]])
OUTDClf = IsolationForest(n_estimators = 10)
OUTDclf.fit(X)
Output
IsolationForest(
behaviour = 'old', bootstrap = False, contamination='legacy',
max_features = 1.0, max_samples = 'auto', n_estimators = 10, n_jobs=None,
random_state = None, verbose = 0
)
Factor de valor atípico local
El algoritmo Local Outlier Factor (LOF) es otro algoritmo eficiente para realizar la detección de valores atípicos en datos de gran dimensión. El scikit-learn proporcionaneighbors.LocalOutlierFactormétodo que calcula una puntuación, denominada factor de valor atípico local, que refleja el grado de anomalía de las observaciones. La lógica principal de este algoritmo es detectar las muestras que tienen una densidad sustancialmente menor que sus vecinas. Es por eso que mide la desviación de la densidad local de puntos de datos dados con respecto a sus vecinos.
Parámetros
La siguiente tabla consta de los parámetros utilizados por sklearn. neighbors.LocalOutlierFactor método
No Señor | Descripción de parámetros |
---|---|
1 | n_neighbors - int, opcional, predeterminado = 20 Representa el número de vecinos que se utilizan de forma predeterminada para la consulta de vecinos. Todas las muestras se utilizarían si. |
2 | algorithm - opcional Qué algoritmo se utilizará para calcular los vecinos más cercanos.
|
3 | leaf_size - int, opcional, predeterminado = 30 El valor de este parámetro puede afectar la velocidad de construcción y consulta. También afecta la memoria necesaria para almacenar el árbol. Este parámetro se pasa a los algoritmos BallTree o KdTree. |
4 | contamination - automático o flotante, opcional, predeterminado = automático Proporciona la proporción de valores atípicos en el conjunto de datos. Si lo configuramos por defecto, es decir, automático, determinará el umbral como en el papel original. Si se configura para flotar, el rango de contaminación estará en el rango de [0,0.5]. |
5 | metric - cadena o invocable, predeterminado Representa la métrica utilizada para el cálculo de la distancia. |
6 | P - int, opcional (predeterminado = 2) Es el parámetro de la métrica de Minkowski. P = 1 es equivalente a usar manhattan_distance, es decir, L1, mientras que P = 2 es equivalente a usar euclidean_distance, es decir, L2. |
7 | novelty - Booleano, (predeterminado = Falso) De forma predeterminada, el algoritmo LOF se utiliza para la detección de valores atípicos, pero se puede utilizar para la detección de novedades si establecemos novedad = verdadero. |
8 | n_jobs - int o None, opcional (predeterminado = None) Representa el número de trabajos que se ejecutarán en paralelo para los métodos fit () y predict () ambos. |
Atributos
La siguiente tabla consta de los atributos utilizados por sklearn.neighbors.LocalOutlierFactor método -
No Señor | Atributos y descripción |
---|---|
1 | negative_outlier_factor_ - matriz numpy, forma (n_samples,) Proporcionar LOF opuesto a las muestras de entrenamiento. |
2 | n_neighbors_ - entero Proporciona el número real de vecinos utilizados para consultas de vecinos. |
3 | offset_ - flotar Se utiliza para definir las etiquetas binarias a partir de las puntuaciones brutas. |
Implementation Example
La secuencia de comandos de Python que se proporciona a continuación utilizará sklearn.neighbors.LocalOutlierFactor método para construir la clase NeighborsClassifier a partir de cualquier matriz correspondiente a nuestro conjunto de datos
from sklearn.neighbors import NearestNeighbors
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
LOFneigh = NearestNeighbors(n_neighbors = 1, algorithm = "ball_tree",p=1)
LOFneigh.fit(samples)
Output
NearestNeighbors(
algorithm = 'ball_tree', leaf_size = 30, metric='minkowski',
metric_params = None, n_jobs = None, n_neighbors = 1, p = 1, radius = 1.0
)
Example
Ahora, podemos preguntarle a este clasificador construido cuál es el punto más cercano a [0.5, 1., 1.5] usando el siguiente script de Python:
print(neigh.kneighbors([[.5, 1., 1.5]])
Output
(array([[1.7]]), array([[1]], dtype = int64))
SVM de una clase
La SVM de una clase, presentada por Schölkopf et al., Es la detección de valores atípicos no supervisada. También es muy eficiente en datos de alta dimensión y estima el soporte de una distribución de alta dimensión. Se implementa en elSupport Vector Machines módulo en el Sklearn.svm.OneClassSVMobjeto. Para definir una frontera, se requiere un kernel (el más utilizado es RBF) y un parámetro escalar.
Para una mejor comprensión, ajustemos nuestros datos con svm.OneClassSVM objeto -
Ejemplo
from sklearn.svm import OneClassSVM
X = [[0], [0.89], [0.90], [0.91], [1]]
OSVMclf = OneClassSVM(gamma = 'scale').fit(X)
Ahora, podemos obtener las muestras de puntuación para los datos de entrada de la siguiente manera:
OSVMclf.score_samples(X)
Salida
array([1.12218594, 1.58645126, 1.58673086, 1.58645127, 1.55713767])