Scikit Learn - Detecção de anomalias

Aqui, aprenderemos sobre o que é detecção de anomalias no Sklearn e como ela é usada na identificação dos pontos de dados.

A detecção de anomalias é uma técnica usada para identificar pontos de dados no conjunto de dados que não se ajustam bem ao restante dos dados. Ele tem muitas aplicações nos negócios, como detecção de fraude, detecção de intrusão, monitoramento da integridade do sistema, vigilância e manutenção preditiva. As anomalias, também chamadas de outlier, podem ser divididas nas seguintes três categorias -

  • Point anomalies - Ocorre quando uma instância de dados individual é considerada anômala em relação ao restante dos dados.

  • Contextual anomalies- Esse tipo de anomalia é específico do contexto. Ocorre se uma instância de dados for anômala em um contexto específico.

  • Collective anomalies - Ocorre quando uma coleção de instâncias de dados relacionadas é anômala em relação ao conjunto de dados inteiro em vez de valores individuais.

Métodos

Dois métodos a saber outlier detection e novelty detectionpode ser usado para detecção de anomalias. É necessário ver a distinção entre eles.

Detecção de outlier

Os dados de treinamento contêm outliers que estão longe do resto dos dados. Esses outliers são definidos como observações. Essa é a razão, os estimadores de detecção de outliers sempre tentam ajustar a região com dados de treinamento mais concentrados, ignorando as observações desviantes. Também é conhecido como detecção de anomalia não supervisionada.

Detecção de novidade

Ele se preocupa com a detecção de um padrão não observado em novas observações que não está incluído nos dados de treinamento. Aqui, os dados de treinamento não são poluídos pelos outliers. Também é conhecido como detecção de anomalia semissupervisionada.

Há um conjunto de ferramentas de ML, fornecidas pelo scikit-learn, que podem ser usadas tanto para detecção de outliers quanto para detecção de novidades. Essas ferramentas primeiro implementam a aprendizagem de objetos a partir dos dados de forma não supervisionada, usando o método fit () da seguinte forma -

estimator.fit(X_train)

Agora, as novas observações seriam classificadas como inliers (labeled 1) ou outliers (labeled -1) usando o método predict () da seguinte maneira -

estimator.fit(X_test)

O estimador calculará primeiro a função de pontuação bruta e, em seguida, o método de previsão fará uso do limite nessa função de pontuação bruta. Podemos acessar esta função de pontuação bruta com a ajuda descore_sample método e pode controlar o limite por contamination parâmetro.

Nós também podemos definir decision_function método que define outliers como valor negativo e inliers como valor não negativo.

estimator.decision_function(X_test)

Algoritmos Sklearn para detecção de outlier

Vamos começar entendendo o que é um envelope elíptico.

Ajustando um envelope elíptico

Este algoritmo assume que os dados regulares vêm de uma distribuição conhecida, como a distribuição Gaussiana. Para detecção de outliers, o Scikit-learn fornece um objeto chamadocovariance.EllipticEnvelop.

Este objeto ajusta uma estimativa de covariância robusta aos dados e, portanto, ajusta uma elipse aos pontos de dados centrais. Ele ignora os pontos fora do modo central.

Parâmetros

A tabela a seguir consiste nos parâmetros usados ​​por sklearn. covariance.EllipticEnvelop método -

Sr. Não Parâmetro e Descrição
1

store_precision - Booleano, opcional, padrão = Verdadeiro

Podemos especificá-lo se a precisão estimada for armazenada.

2

assume_centered - Booleano, opcional, padrão = False

Se definirmos como False, ele calculará a localização robusta e a covariância diretamente com a ajuda do algoritmo FastMCD. Por outro lado, se definido como True, ele irá computar o suporte de localização robusta e covariana.

3

support_fraction - flutuar em (0., 1.), opcional, padrão = Nenhum

Este parâmetro informa ao método a proporção de pontos a serem incluídos no suporte das estimativas de MCD brutas.

4

contamination - flutuar em (0., 1.), opcional, padrão = 0,1

Ele fornece a proporção de outliers no conjunto de dados.

5

random_state - int, instância RandomState ou Nenhum, opcional, padrão = nenhum

Este parâmetro representa a semente do número pseudoaleatório gerado que é usado ao embaralhar os dados. A seguir estão as opções -

  • int - Neste caso, random_state é a semente usada pelo gerador de números aleatórios.

  • RandomState instance- Nesse caso, random_state é o gerador de números aleatórios.

  • None - Nesse caso, o gerador de número aleatório é a instância RandonState usada por np.random.

Atributos

A tabela a seguir consiste nos atributos usados ​​por sklearn. covariance.EllipticEnvelop método -

Sr. Não Atributos e descrição
1

support_ - tipo matriz, forma (n_samples,)

Ele representa a máscara das observações usadas para calcular estimativas robustas de localização e forma.

2

location_ - tipo matriz, forma (n_features)

Ele retorna a localização robusta estimada.

3

covariance_ - tipo array, forma (n_features, n_features)

Ele retorna a matriz de covariância robusta estimada.

4

precision_ - tipo array, forma (n_features, n_features)

Ele retorna a matriz pseudo inversa estimada.

5

offset_ - flutuar

É usado para definir a função de decisão a partir das pontuações 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])

Floresta de Isolamento

No caso de um conjunto de dados de alta dimensão, uma maneira eficiente de detecção de valores discrepantes é usar florestas aleatórias. O scikit-learn forneceensemble.IsolationForestmétodo que isola as observações ao selecionar aleatoriamente uma característica. Em seguida, ele seleciona aleatoriamente um valor entre os valores máximo e mínimo dos recursos selecionados.

Aqui, o número de divisões necessárias para isolar uma amostra é equivalente ao comprimento do caminho do nó raiz ao nó final.

Parâmetros

A tabela a seguir consiste nos parâmetros usados ​​por sklearn. ensemble.IsolationForest método -

Sr. Não Parâmetro e Descrição
1

n_estimators - int, opcional, padrão = 100

Ele representa o número de estimadores de base no conjunto.

2

max_samples - int ou float, opcional, padrão = “auto”

Ele representa o número de amostras a serem retiradas de X para treinar cada estimador de base. Se escolhermos int como seu valor, ele extrairá amostras de max_samples. Se escolhermos float como seu valor, ele desenhará max_samples ∗ .shape [0] samples. E, se escolhermos auto como seu valor, ele desenhará max_samples = min (256, n_samples).

3

support_fraction - flutuar em (0., 1.), opcional, padrão = Nenhum

Este parâmetro informa ao método a proporção de pontos a serem incluídos no suporte das estimativas de MCD brutas.

4

contamination - automático ou flutuante, opcional, padrão = automático

Ele fornece a proporção de outliers no conjunto de dados. Se definirmos como padrão, ou seja, automático, ele determinará o limite como no papel original. Se definido como flutuante, a faixa de contaminação estará na faixa de [0,0.5].

5

random_state - int, instância RandomState ou Nenhum, opcional, padrão = nenhum

Este parâmetro representa a semente do número pseudoaleatório gerado que é usado ao embaralhar os dados. A seguir estão as opções -

  • int - Neste caso, random_state é a semente usada pelo gerador de números aleatórios.

  • RandomState instance- Nesse caso, random_state é o gerador de números aleatórios.

  • None - Nesse caso, o gerador de número aleatório é a instância RandonState usada por np.random.

6

max_features - int ou float, opcional (padrão = 1.0)

Ele representa o número de recursos a serem extraídos de X para treinar cada estimador de base. Se escolhermos int como seu valor, ele desenhará os recursos max_features. Se escolhermos float como seu valor, ele desenhará amostras max_features * X.shape [].

7

bootstrap - Booleano, opcional (padrão = Falso)

Sua opção padrão é False, o que significa que a amostragem seria realizada sem substituição. E por outro lado, se definido como True, significa que as árvores individuais são ajustadas em um subconjunto aleatório dos dados de treinamento amostrados com substituição.

8

n_jobs - int ou nenhum, opcional (padrão = nenhum)

Ele representa o número de trabalhos a serem executados em paralelo para fit() e predict() métodos ambos.

9

verbose - int, opcional (padrão = 0)

Este parâmetro controla o detalhamento do processo de construção da árvore.

10

warm_start - Bool, opcional (padrão = False)

Se warm_start = true, podemos reutilizar a solução de chamadas anteriores para ajustar e adicionar mais estimadores ao conjunto. Mas se for definido como falso, precisamos ajustar uma floresta totalmente nova.

Atributos

A tabela a seguir consiste nos atributos usados ​​por sklearn. ensemble.IsolationForest método -

Sr. Não Atributos e descrição
1

estimators_ - lista de DecisionTreeClassifier

Fornecendo a coleção de todos os subestimadores ajustados.

2

max_samples_ - inteiro

Ele fornece o número real de amostras usadas.

3

offset_ - flutuar

É usado para definir a função de decisão a partir das pontuações brutas. decision_function = score_samples -offset_

Implementation Example

O script Python abaixo usará sklearn. ensemble.IsolationForest método para ajustar 10 árvores em dados fornecidos

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
)

Fator Outlier Local

O algoritmo Local Outlier Factor (LOF) é outro algoritmo eficiente para realizar detecção de valores discrepantes em dados de alta dimensão. O scikit-learn forneceneighbors.LocalOutlierFactormétodo que calcula uma pontuação, denominado fator de outlier local, refletindo o grau de anomalia das observações. A lógica principal desse algoritmo é detectar as amostras que possuem uma densidade substancialmente menor que suas vizinhas. É por isso que ele mede o desvio de densidade local de determinados pontos de dados em relação a seus vizinhos.

Parâmetros

A tabela a seguir consiste nos parâmetros usados ​​por sklearn. neighbors.LocalOutlierFactor método

Sr. Não Parâmetro e Descrição
1

n_neighbors - int, opcional, padrão = 20

Ele representa o número de vizinhos usados ​​por padrão para a consulta de vizinhos. Todas as amostras seriam usadas se.

2

algorithm - opcional

Qual algoritmo a ser usado para calcular os vizinhos mais próximos.

  • Se você escolher ball_tree, ele usará o algoritmo BallTree.

  • Se você escolher kd_tree, ele usará o algoritmo KDTree.

  • Se você escolher brute, ele usará o algoritmo de busca de força bruta.

  • Se você escolher auto, ele decidirá o algoritmo mais apropriado com base no valor que passamos para o método fit ().

3

leaf_size - int, opcional, padrão = 30

O valor deste parâmetro pode afetar a velocidade de construção e consulta. Também afeta a memória necessária para armazenar a árvore. Este parâmetro é passado para algoritmos BallTree ou KdTree.

4

contamination - automático ou flutuante, opcional, padrão = automático

Ele fornece a proporção de outliers no conjunto de dados. Se definirmos como padrão, ou seja, automático, ele determinará o limite como no papel original. Se definido como flutuante, a faixa de contaminação estará na faixa de [0,0.5].

5

metric - string ou chamável, padrão

Ele representa a métrica usada para cálculo de distância.

6

P - int, opcional (padrão = 2)

É o parâmetro para a métrica de Minkowski. P = 1 é equivalente a usar distância_de_manhattan, ou seja, L1, enquanto P = 2 é equivalente a usar distância_euclidiana, ou seja, L2.

7

novelty - Booleano, (padrão = Falso)

Por padrão, o algoritmo LOF é usado para detecção de outlier, mas pode ser usado para detecção de novidade se definirmos novidade = verdadeiro.

8

n_jobs - int ou nenhum, opcional (padrão = nenhum)

Ele representa o número de trabalhos a serem executados em paralelo para os métodos fit () e Predict ().

Atributos

A tabela a seguir consiste nos atributos usados ​​por sklearn.neighbors.LocalOutlierFactor método -

Sr. Não Atributos e descrição
1

negative_outlier_factor_ - matriz numpy, forma (n_samples,)

Fornecendo LOF oposto dos exemplos de treinamento.

2

n_neighbors_ - inteiro

Ele fornece o número real de vizinhos usados ​​para consultas de vizinhos.

3

offset_ - flutuar

É usado para definir os rótulos binários das pontuações brutas.

Implementation Example

O script Python fornecido abaixo usará sklearn.neighbors.LocalOutlierFactor método para construir a classe NeighboursClassifier a partir de qualquer array correspondente ao nosso conjunto de dados

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

Agora, podemos perguntar a partir desse classificador construído se é o ponto mais próximo a [0,5, 1., 1,5] usando o seguinte script python -

print(neigh.kneighbors([[.5, 1., 1.5]])

Output

(array([[1.7]]), array([[1]], dtype = int64))

SVM de uma classe

O SVM de uma classe, introduzido por Schölkopf et al., É a detecção de outlier não supervisionada. Também é muito eficiente em dados de alta dimensão e estima o suporte de uma distribuição de alta dimensão. É implementado noSupport Vector Machines módulo no Sklearn.svm.OneClassSVMobjeto. Para definir uma fronteira, ele requer um kernel (mais usado é o RBF) e um parâmetro escalar.

Para melhor compreensão, vamos ajustar nossos dados com svm.OneClassSVM objeto -

Exemplo

from sklearn.svm import OneClassSVM
X = [[0], [0.89], [0.90], [0.91], [1]]
OSVMclf = OneClassSVM(gamma = 'scale').fit(X)

Agora, podemos obter o score_samples para os dados de entrada da seguinte forma -

OSVMclf.score_samples(X)

Resultado

array([1.12218594, 1.58645126, 1.58673086, 1.58645127, 1.55713767])