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 -
|
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 -
|
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.
|
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])