Codificadores automáticos para detecção de anomalias em manutenção preditiva

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


[Esteartigofoipublicadopelaprimeiravezem[Thisarticlewasfirstpublishedon R – Olá! Eu sou Nagdev, e gentilmente contribuiu para os R-blogueiros]. (Você pode relatar um problema sobre o conteúdo desta página aqui)


Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.

Autoencoders é uma versão não supervisionada da rede neural usada para codificação de dados. Essa técnica é usada principalmente para aprender a representação de dados que podem ser usados ​​para redução de dimensionalidade treinando a rede para ignorar o ruído. Os codificadores automáticos desempenham um papel importante no aprendizado não supervisionado e nas arquiteturas profundas, principalmente para o aprendizado de transferência (Pierre. B, 2012). Quando os codificadores automáticos são decodificados, eles são circuitos lineares simples que transformam entradas em saídas com menos distorção. Os auto-codificadores foram introduzidos pela primeira vez na década de 1980 para abordar a questão da propagação traseira sem treinamento e, em vez disso, usar informações como professor (Rumelhart et al., 1986). Desde então, os auto-codificadores fizeram uma alteração de fase no formulário na Máquina Restrita de Boltzman. Atualmente, os autoencodificadores são usados ​​em várias aplicações, como prever distribuições de sentimentos no Processamento de Linguagem Natural (PNL) (Socher et al., 2011a) (Socher et al., 2011b), extração de recursos (Masci et al., 2011), detecção de anomalias (Sakurada et al., 2014), reconhecimento facial (Gao et al., 2015), agrupamento (Dilokthanakul et al., 2016), classificação de imagens (Geng et al., 2015) e muitas outras aplicações.

autoencoders

Imagem: Representação simples do codificador automático

No tutorial de hoje, abordarei como usar codificadores automáticos para detecção de anomalias na manutenção preditiva.

options(warn=-1)

# load libraries
library(dplyr)
library(h2o)

Carregar dados

Aqui, estamos usando dados de um supino e podem ser baixados no meu repositório do github. Este é um dado experimental que eu criei em um laboratório para minha tese de doutorado. Há um total de quatro estados diferentes nesta máquina e eles são divididos em quatro arquivos csv diferentes. Precisamos carregar os dados primeiro. No tempo de dados, representa o tempo entre as amostras, ax é a aceleração no eixo x, ay é a aceleração no eixo y, az é a aceleração no eixo z e é o G’s. Os dados foram coletados na taxa de amostragem de 100hz.

Quatro estados diferentes da máquina foram coletados

1. Nothing attached to drill press

2. Wooden base attached to drill press

3. Imbalance created by adding weight to one end of wooden base

4. Imbalance created by adding weight to two ends of wooden base.

setwd("/home/")
#read csv files
file1 = read.csv("dry run.csv", sep=",", header =T)
file2 = read.csv("base.csv", sep=",", header =T)
file3 = read.csv("imbalance 1.csv", sep=",", header =T)
file4 = read.csv("imbalance 2.csv", sep=",", header =T)
head(file1)

Podemos observar o resumo de cada arquivo usando a função de resumo em R. Abaixo, podemos observar que dados de 66 segundos estão disponíveis. Também temos min, max e média para cada uma das variáveis.

# summary of each file
summary(file2)
      time               ax                  ay                  az          
 Min.   :  0.004   Min.   :-1.402700   Min.   :-1.693300   Min.   :-3.18930  
 1st Qu.: 27.005   1st Qu.:-0.311100   1st Qu.:-0.429600   1st Qu.:-0.57337  
 Median : 54.142   Median : 0.015100   Median :-0.010700   Median :-0.11835  
 Mean   : 54.086   Mean   : 0.005385   Mean   :-0.002534   Mean   :-0.09105  
 3rd Qu.: 81.146   3rd Qu.: 0.314800   3rd Qu.: 0.419475   3rd Qu.: 0.34815  
 Max.   :108.127   Max.   : 1.771900   Max.   : 1.515600   Max.   : 5.04610  
       aT        
 Min.   :0.0360  
 1st Qu.:0.6270  
 Median :0.8670  
 Mean   :0.9261  
 3rd Qu.:1.1550  
 Max.   :5.2950

Agregação de dados e extração de recursos

Aqui, os dados são agregados por 1 minuto e os recursos são extraídos. Os recursos são extraídos para reduzir o tamanho dos dados e armazenar apenas a representação dos dados.

file1$group = as.factor(round(file1$time))
file2$group = as.factor(round(file2$time))
file3$group = as.factor(round(file3$time))
file4$group = as.factor(round(file4$time))
#(file1,20)

#list of all files
files = list(file1, file2, file3, file4)

#loop through all files and combine
features = NULL
for (i in 1:4){
res = files[[i]] %>%
    group_by(group) %>%
    summarize(ax_mean = mean(ax),
              ax_sd = sd(ax),
              ax_min = min(ax),
              ax_max = max(ax),
              ax_median = median(ax),
              ay_mean = mean(ay),
              ay_sd = sd(ay),
              ay_min = min(ay),
              ay_may = max(ay),
              ay_median = median(ay),
              az_mean = mean(az),
              az_sd = sd(az),
              az_min = min(az),
              az_maz = max(az),
              az_median = median(az),
              aT_mean = mean(aT),
              aT_sd = sd(aT),
              aT_min = min(aT),
              aT_maT = max(aT),
              aT_median = median(aT)
             )
    features = rbind(features, res)
}

#view all features
head(features)

Criar conjunto de trem e teste

Para construir um modelo de detecção de anomalias, é necessário um conjunto de trens e testes. Aqui, a condição normal dos dados é usada para treinamento e o restante é usado para teste.

# create train and test set
train = features[1:67,2:ncol(features)]
test = features[68:nrow(features),2:ncol(features)]

Codificadores automáticos

# initialize h2o cluser
h2o.init()

O objeto R a ser convertido em um objeto H2O deve ser nomeado para que possa ser usado em análises subsequentes. Observe também que o objeto R é convertido em um objeto de dados H2O analisado e será tratado como um quadro de dados pelo H2O na análise subsequente.

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
# convert train and test to h2o object
train_h2o = as.h2o(train)
test_h2o = as.h2o(test)

A função h2o.deeplearning se encaixa nos modelos de Deep Learning do H2O dentro da R. Embora o H2O Deep Learning tenha muitos parâmetros, ele foi projetado para ser tão fácil de usar quanto os outros métodos de treinamento supervisionado em H2O. Paradas precoces, padronização automática de dados e manipulação de variáveis ​​categóricas e valores ausentes e taxas de aprendizado adaptáveis ​​(por peso) reduzem a quantidade de parâmetros que o usuário precisa especificar. Geralmente, são apenas o número e o tamanho das camadas ocultas, o número de épocas e a função de ativação e talvez algumas técnicas de regularização.

# build auto encoder model with 3 layers
model_unsup = h2o.deeplearning(x = 2:ncol(features)
                 , training_frame = train_h2o
                 , model_id = "Test01"
                 , autoencoder = TRUE
                 , reproducible = TRUE
                 , ignore_const_cols = FALSE
                 , seed = 42
                 , hidden = c(50,10,50,100,100)
                 , epochs = 100
                 , activation ="Tanh")

# view the model
model_unsup
Model Details:
==============

H2OAutoEncoderModel: deeplearning
Model ID:  Test01 
Status of Neuron Layers: auto-encoder, gaussian distribution, Quadratic loss, 19,179 weights/biases, 236.0 KB, 2,546 training samples, mini-batch size 1
  layer units  type dropout       l1       l2 mean_rate rate_rms momentum
1     1    19 Input  0.00 %       NA       NA        NA       NA       NA
2     2    50  Tanh  0.00 % 0.000000 0.000000  0.029104 0.007101 0.000000
3     3    10  Tanh  0.00 % 0.000000 0.000000  0.021010 0.006320 0.000000
4     4    50  Tanh  0.00 % 0.000000 0.000000  0.024570 0.006848 0.000000
5     5   100  Tanh  0.00 % 0.000000 0.000000  0.052482 0.018357 0.000000
6     6   100  Tanh  0.00 % 0.000000 0.000000  0.052677 0.021417 0.000000
7     7    19  Tanh      NA 0.000000 0.000000  0.025557 0.009494 0.000000
  mean_weight weight_rms mean_bias bias_rms
1          NA         NA        NA       NA
2    0.000069   0.180678  0.001542 0.017311
3    0.000008   0.187546 -0.000435 0.011542
4    0.011644   0.184633  0.000371 0.006443
5    0.000063   0.113350 -0.000964 0.008983
6    0.000581   0.100150  0.001003 0.013848
7   -0.001349   0.121616  0.006549 0.012720


H2OAutoEncoderMetrics: deeplearning
** Reported on training data. **

Training Set Metrics: 
=====================

MSE: (Extract with `h2o.mse`) 0.005829827
RMSE: (Extract with `h2o.rmse`) 0.0763533


Detecte anomalias em um conjunto de dados H2O usando um modelo de aprendizado profundo de H2O com a codificação automática treinada anteriormente.

# now we need to calculate MSE or anomaly score  
anmlt = h2o.anomaly(model_unsup
                      , train_h2o
                      , per_feature = FALSE) %>% as.data.frame()
# create a label for healthy data
anmlt$y = 

# view top data
head(anmlt)
Reconstruction.MSE y
0,001953387 0 0
0,004875430 0 0
0,002195593 0 0
0,006722837 0 0
0,001670331 0 0
0,005859846 0 0

Calcule o valor limite para as pontuações de tremanomaly. Vários métodos podem ser usados, como o cálculo dos quantis, max, mediana, min etc. Tudo depende do caso de uso. Aqui usaremos quantil com probabilidade de 99,9%.

# calculate thresholds from train data
threshold = quantile(anmlt$Reconstruction.MSE, probs = 0.999)
# calculate anomaly scores for test data
test_anmlt = h2o.anomaly(model_unsup
                      , test_h2o
                      , per_feature = FALSE) %>% as.data.frame()

# create a label for healthy data
test_anmlt$y = 1
# combine the train and test anomaly scores for visulaizatio
results = data.frame(rbind(anmlt,test_anmlt), threshold)
head(results)
Reconstruction.MSE y limite
0,001953387 0 0 0,01705935
0,004875430 0 0 0,01705935
0,002195593 0 0 0,01705935
0,006722837 0 0 0,01705935
0,001670331 0 0 0,01705935
0,005859846 0 0 0,01705935

Os resultados estão plotados abaixo. O eixo x são as observações e o eixo y é a pontuação da anomalia. Os pontos verdes são os dados treinados e vermelho são os dados de teste. Podemos observar que todos os dados que foram treinados, exceto um, estavam abaixo do limite da anomalia. Também é interessante observar o padrão de tendência crescente para as pontuações de anomalia para outro estado da máquina.

# Adjust plot sizes
options(repr.plot.width = 15, repr.plot.height = 6)
plot(results$Reconstruction.MSE, type = 'n', xlab='observations', ylab='Reconstruction.MSE', main = "Anomaly Detection Results")
points(results$Reconstruction.MSE, pch=19, col=ifelse(results$Reconstruction.MSE < threshold, "green", "red"))
abline(h=threshold, col='red', lwd=2)
resultados ae

Conclusão

O codificador automático é uma ferramenta muito poderosa e muito divertida de jogar. Eles foram utilizados na análise de imagens, reconstrução de imagens e colorização de imagens. Neste tutorial, você viu como executar a detecção de anomalias em um simples sinal de dados e poucas linhas de código. As possibilidades de usar isso são muitas. Deixe-me saber o que você pensa sobre codificadores automáticos nos comentários abaixo.

Siga meu trabalho

Github, Researchgate e LinkedIn

Informações da sessão

Abaixo estão as informações da sessão para os pacotes e suas versões usadas nesta análise.

sessionInfo()
R version 3.3.3 (2017-03-06)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux 9 (stretch)

locale:
 [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
 [4] LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
 [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
[10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] h2o_3.26.0.2 dplyr_0.8.3 

loaded via a namespace (and not attached):
 [1] Rcpp_1.0.2          magrittr_1.5        tidyselect_0.2.5   
 [4] uuid_0.1-2          R6_2.4.0            rlang_0.4.0        
 [7] tools_3.3.3         htmltools_0.3.6     assertthat_0.2.1   
[10] digest_0.6.20       tibble_2.1.3        crayon_1.3.4       
[13] IRdisplay_0.7.0     purrr_0.3.2         repr_1.0.1         
[16] base64enc_0.1-3     vctrs_0.2.0         bitops_1.0-6       
[19] RCurl_1.95-4.12     IRkernel_1.0.2.9000 zeallot_0.1.0      
[22] glue_1.3.1          evaluate_0.14       pbdZMQ_0.3-3       
[25] pillar_1.4.2        backports_1.1.4     jsonlite_1.6       
[28] pkgconfig_2.0.2

var vglnk = {key: ‘949efb41171ac6ec1bf7f206d57e90b8’};

(função (d, t) {
var s = d.createElement
s.src = ‘//cdn.viglink.com/api/vglnk.js’;
var r = d.getElementsByTagName
} (documento, ‘script’));

Para Deixe um comentário para o autor, siga o link e comente no blog: R – Olá! Eu sou Nagdev.

R-bloggers.com oferece atualizações diárias por email sobre notícias e tutoriais do R sobre o aprendizado do R e muitos outros tópicos. Clique aqui se você deseja publicar ou encontrar um emprego em ciência da dados / R.


Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.



cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br