Classificação de Séries Temporais

Prática com R Notebook

sits time series classification

Neste hands-on, organizamos uma atividade prática no sits de acordo com o fluxograma apresentado ao lado. Nele, mostramos como é realizada a classificação de uma série temporal. Aqui você aprenderá a:

  • Interface comum e funções de machine learning do sits.

  • treinar um modelo de machine learning.

  • consultar a documentação do sits.

Notebook Kaggle: https://www.kaggle.com/rolfsimoes/sits-kaggle

Machine Learning

O termo machine learning, ou em português aprendizado de máquina, se refere a técnicas que procuram estabelecer regras de relação entre elementos de dois conjuntos a partir de exemplares conhecidos. Essa regra pode ser representada por uma função \(f\) que liga o elementos do domínio \(X\) a elementos do conjunto imagem \(Y\). Quando \(Y\) é contínuo, dizemos que \(f\) realiza uma regressão. Quando \(Y\) é discreto, dizemos que \(f\) realiza uma classificação (Gareth et al., 2013).

Em nosso caso concreto, temos como conjunto \(X\) séries temporais de um determinado intervalo de tempo e atributos espectrais (i.e. bandas e/ou índices espectrais). Por exemplo, séries temporais de NDVI e EVI com 23 observações no tempo, indo de setembro de um ano até agosto do ano seguinte. Quando dizemos que queremos treinar um modelo de machine learning, o que queremos é obter uma regra útil \(f\) que associe as séries temporais de \(X\) às classes de uso e cobertura da terra, elementos do conjunto \(Y\), como ilustrado na Figura abaixo. Existem vários métodos para isso.

machine learning function

Figure 77 - Classificação de séries temporais usando Machine Learning.

Interface comum e funções de machine learning do sits

Atualmente, o pacote sits oferece suporte para 11 algoritmos de machine learning listados na tabela abaixo.

Algoritmo

Função sits

Pacote

Análise discriminante linear

sits_lda()

MASS

Análise discriminante quadrática

sits_qda()

MASS

Regressão logística multinomial

sits_mlr()

nnet

Support vector machine (SVM)

sits_svm()

e1071

Random forests (RF)

sits_rfor()

ranger

Extreme gradient boosting

sits_xgboost()

xgboost

Multi-layer perceptrons (MLP)

sits_deeplearning()

keras

Redes neurais convolucionais (CNN) em 1D

sits_FCN()

keras

CNN em 1D e MLP

sits_TempCNN()

keras

ResNet em 1D

sits_ResNet()

keras

Long-short term memory com uma CNN em 1D

sits_LSTM_FCN()

keras

Esses algoritmos são implementados por outros pacotes dos quais o sits depende para realizar as classificações. Essas funções oferecem uma documentação de seus parâmetros que pode ser acessado usando o comando ? seguido do nome da função.

O pacote sits fornece uma interface comum para treinar classificadores utilizando a função sits_train(). Esta função toma dois parâmetros, as amostras de dados de entrada e o método machine learning utilizando uma das funções acima. Após o modelo ser treinado, ele pode ser utilizado para classificar séries temporais individuais ou bricks utilizando a função sits_classify(). Nos exemplos abaixo, mostramos como aplicar o classificador para uma série temporal armazenada numa tabela de amostras.

Para os nossos exemplos, utilizaremos as 1.892 amostras do Mato Grosso. Esse conjunto contém 9 classes de uso e cobertura da terra. O primeiro exemplo usa o algoritmo RF para estimar dois classificadores: o primeiro usando as bandas e índices espectrais NDVI, EVI, NIR e MIR, disponíveis na tabela de amostra samples; e o segundo usando apenas o NDVI, disponível em samples_ndvi. Já o segundo exemplo usa o algorito MLP para treinar um modelo usando apenas o NDVI.

Exemplo com Random Forests

Code snippet 16 - Treinando um classificador RF.
1# Treina um modelo RF com 200 árvores usando as bandas
2# 'ndvi', 'evi', 'nir' e 'mir'
3rf1 <- sits_train(samples,
4                  ml_method = sits_rfor(num_trees = 200))
5
6# Treina um modelo RF com 200 árvores usando a banda 'ndvi'
7rf2 <- sits_train(samples_ndvi,
8                  ml_method = sits_rfor(num_trees = 200))

Podemos agora utilizar os modelos treinados para classificar uma série temporal utilizando a função sits_classify(). Os resultados podem ser mostrados em formato texto utilizando a função sits_show_prediction() ou graficamente utilizando a função plot(). Vamos usar a série temporal armazenada na variável ts1 para realizar esta classificação.

Code snippet 17 - Classificação de uma série temporal usando RF.
 1# rf1: modelo RF bandas 'ndvi', 'evi', 'nir' e 'mir'
 2ts_4bands <- sits_select(ts1,
 3                         bands = c('ndvi', 'evi', 'nir', 'mir'))
 4
 5# Classifica série temporal
 6rf_class1 <- sits_classify(ts_4bands, ml_model = rf1)
 7
 8# rf2: modelo RF banda 'ndvi'
 9ts_ndvi <- sits_select(ts1,
10                       bands = c('ndvi'))
11
12# Classifica série temporal
13rf_class2 <- sits_classify(ts_ndvi, ml_model = rf2)
14
15# Mostra os gráficos das classificações
16plot(rf_class1)
17plot(rf_class2)

Exemplo com Deep Learning MLP

Code snippet 18 - Treinando e classificando com o algoritmo MLP.
 1# Treina um modelo MLP com 5 camadas escondidas, 512 unidades,
 2#  função de ativação 'elu', banda 'ndvi'
 3dl1 <- sits_train(samples_ndvi,
 4                  ml_method = sits_deeplearning(epochs = 200))
 5
 6# dl1: modelo MLP banda 'ndvi'
 7# Classifica série temporal
 8dl_class1 <- sits_classify(ts_ndvi, ml_model = dl1)
 9
10# Mostra os gráficos das classificações
11plot(dl_class1)

Consultando a documentação do sits

O pacote sits tem uma ampla documentação de suas funções. Além da documentação, que pode ser acessada com o comando ?, existem tutoriais também conhecido como vignettes, que podem ser acessados a partir do repositório e-sensing/sits-docs <https://github.com/e-sensing/sits-docs> no GitHub. Além desse material, existem demonstrações de uso do pacote que pode ser acessado pelo comando do R demo().

Hint

A documentação de uma função pode ser acessada usando o comando ? antes do nome da função. Exemplos: ?sits_svm ?sits_xgboost

Referências

  • James, Gareth, et al. An introduction to statistical learning. Vol. 112. New York: springer, 2013.