Avaliação - Parte Prática

Na parte prática da avaliação, você vai trabalhar com um projeto de uma aplicação com redes neurais para a área de veículos autônomos. O objetivo é obter um modelo para a estimação da direção e da velocidade adequadas à partir de dados de sensores do veículo.

Dados disponibilizados

Os dados para treinamento e teste do modelo estão disponíveis no formato CSV, em um arquivo zip disponível neste link.

Após extrair os arquivos, utilize a biblioteca Pandas para carregar os DataFrames X_train, y_train, X_test e y_test, como mostrado a seguir:

import pandas as pd

X_train = pd.read_csv('X_train.csv')
y_train = pd.read_csv('y_train.csv')
X_test = pd.read_csv('X_test.csv')
y_test = pd.read_csv('y_test.csv')

Considere que os DataFrames X_train e y_train se referem aos dados de entrada e saída para treinamento e X_test e y_test se referem aos dados para validação.

X_train.shape
(19628, 11)
y_train.shape
(19628, 2)
X_test.shape
(4907, 11)
y_test.shape
(4907, 2)
X_train.head()
0 1 2 3 4 5 6 7 8 9 10
0 -0.990604 0.029382 0.016550 0.132531 0.040647 0.053851 9.4 1.7 10.565004 2.466 742.599976
1 -0.993563 0.024949 0.060397 0.092524 0.125051 0.038410 9.8 2.1 10.545004 2.416 742.599976
2 -0.942432 -0.064063 0.026580 0.327124 0.008266 -0.138583 13.6 1.5 13.300000 1.916 744.600000
3 -0.945413 -0.047786 0.015528 0.321976 -0.001418 -0.100524 2.6 1.0 15.500000 2.233 753.800000
4 0.536310 0.101252 -0.015450 0.837782 0.187972 -0.082812 45.0 1.5 5.850351 2.743 745.200012
y_train.head()
0 1
0 6.495223 161.987152
1 7.063543 172.884491
2 4.123023 137.942886
3 13.437319 144.001404
4 4.264773 243.034912

Como mostrado, os dados consistem de 19628 exemplos para treinamento e 4907 para validação, cada um contendo 11 características de entrada, representadas pelas colunas de 0 a 10 dos DataFrames X_train e X_test e duas saídas representadas pelas colunas 0 e 1 dos DataFrames y_train e y_test.

Os dados de entrada são provenientes de diversos sensores que medem informações relativas à posição e ao movimento do veículo, mas não estão identificados em detalhes. Já os dados de saída correspondem aos valores crus fornecidos por sensores de direção e velocidade do veículo, que devem ser estimados pelo modelo.

Objetivo

O objetivo do projeto é obter um modelo baseado em uma rede neural, que receba o vetor com o conjunto de características da entrada e forneça uma estimativa para a direção e velocidade do veículo.

Para fins de avaliação do desempenho do seu modelo, você pode utilizar a métrica \(R^2\), que fornece uma indicação da qualidade ou ajuste de um conjunto de valores de saída previstos aos valores desejados. Essa métrica é calculada como

\[\begin{equation*} \fbox{$\displaystyle R^2=1-\displaystyle\frac{\displaystyle\sum_{n=1}^{N_{\text{teste}}}(d_n-y_n)^2}{\displaystyle\sum_{n=1}^{N_{\text{teste}}}(\overline{d}-d_n)^2}, $} \end{equation*}\]

em que

\[ \overline{d}=\frac{1}{N_{\text{teste}}}\sum_{n=1}^{N_{\text{teste}}}d_n \]

é a média dos valores desejados do conjunto de teste. Note que o denominador da fração que aparece na definição de \(R^2\) é proporcional à variância dos dados de teste. No melhor caso, os valores preditos são exatamente iguais aos valores desejados, o que leva a \(R^2=1\). Caso o modelo leve a \(y_n=\overline{d}\), \(n=1, 2, \cdots, N_{\text{teste}}\), que é conhecido como modelo base, teremos \(R^2=0\). Modelos cujas predições são piores que as do modelo base podem levar a \(R^2\) negativo. Uma implementação dessa medida pode ser encontrada na biblioteca scikit-learn.

Projete o modelo, considerando as arquiteturas e as técnicas que foram vistas no curso e realize o treinamento utilizando os dados de X_train e y_train. Em seguida, teste o modelo fazendo inferência para os dados de X_test e y_test.

Leve em conta que o treinamento pode sofrer overfitting e use os mecanismos vistos no curso para evitá-lo. Para monitorar o overfitting, utilize os dados de teste para fazer validação e observe as curvas de aprendizagem para os dados de treinamento e validação. Procure salvar o modelo treinado ao final de cada época, de forma que seja possível carregar o melhor modelo com base na escolha da melhor condição de acordo com as curvas de aprendizagem de treinamento e validação.

Outra forma de se obter melhorias nos resultados do modelo é por meio da exploração do conjunto de dados de treinamento. Busque selecionar as variáveis de entrada mais relevantes e fazer transformações que possam levar a resultados melhores como, por exemplo, a normalização dos dados. É importante lembrar que qualquer transformação feita do banco de dados de treinamento deve ser repetida, de forma idêntica, no banco de dados de teste. Outra transformação comum é o uso da análise de componentes principais (PCA - principal component analysis), para redução de dimensionalidade da entrada. Também é possível desconsiderar algum dado de treinamento que possa estar levando o modelo para uma condição ruim. No entanto, vale notar que a avaliação com os dados de teste deve levar em conta todos os elementos do banco, sem exceção.

Para implementação do modelo e treinamento da rede neural, a sugestão é que seja utilizado um framework de redes neurais, como o PyTorch, conforme exemplo mostrado no material de apoio. No entanto, isso não é obrigatório, podendo ser utilizada outra solução ou mesmo outra linguagem de programação, caso desejado.

No final do exercício, você deve apresentar:

  1. Sua escolha para a arquitetura do modelo e os valores dos hiperparâmetros;
  2. Os códigos utilizados para treinamento e teste;
  3. A curva de aprendizado de treinamento e validação ao longo das épocas;
  4. Usando os dados de teste, o erro quadrático médio e o valor do \(R^2\) para cada uma das saídas.

No PyTorch, para salvar os pesos de um modelo representado pelo objeto model no arquivo model01.pt, pode-se usar a linha:

torch.save(model.state_dict(), "./model01.pt")

E, depois, para carregar os pesos do modelo, pode ser usada a linha:

model.load_state_dict(torch.load("./model01.pt"))

Instruções para entrega

  • O exercício deve ser feito individualmente;

  • A entrega deve incluir:

    • Um vídeo de no máximo 1m30s, mostrando a resolução do exercício;
    • Os códigos-fontes dos programas, preferencialmente organizados em um Jupyter Notebook, descrevendo o experimento e mostrando como foram obtidos os resultados solicitados.
  • Sobre o vídeo:

    • Deve incluir áudio descrevendo o experimento;
    • Gravem a tela do computador usando celular ou usando algum programa de captura de tela (por exemplo Zoom, Google Meet, ou OBS Studio);
    • No início, deve aparecer o rosto e algum documento do aluno que gravou o vídeo (como a carteira USP, RG, CNH, etc);
    • Tentem fazer um bom aproveitamento do tempo para apresentar os resultados solicitados, respeitando o limite de 1m30s e não acelerem a velocidade do vídeo;
  • Sobre os códigos-fonte:

    • Incluir o nome do aluno no início do programa;
  • Sobre o envio no Moodle:

    • Podem ser enviados o arquivo de vídeo (.mkv, .mp4, .avi, etc.) ou um link para o vídeo (Youtube, Google Drive, etc);
      • No segundo caso, certifiquem-se que todos os professores/pesquisadores (magno.silva@usp.br, hae.kim@usp.br, renatocan@lps.usp.br, wesleybeccaro@usp.br) tenham acesso ao seu vídeo.
    • Não se esqueçam de escrever o nome do aluno em três lugares diferentes: no campo “comentários sobre o envio” no Moodle, no início do vídeo e no início dos códigos-fonte.