Ir para o conteúdo

2. Classificação ou Regressão

Prazo e Entrega

📅 13.nov (sexta) 2026

🕐 Commits até 23:59

A mesma equipe do EDA

60% da nota de Projeto

docs/projects/classification/ ou docs/projects/regression/

Projeto: Classificação ou Regressão com redes neurais

Segunda entrega do projeto. A equipe treina uma rede neural sobre o mesmo dataset do EDA, na tarefa escolhida na proposta: classificação ou regressão, uma só. O pipeline do EDA é o ponto de partida. A pergunta desta entrega: a rede aprende algo que modelos mais simples não aprendem? E quanto dá para confiar no número que ela entrega?

Regras

  • Rede obrigatória: uma MLP (ou mais funda) em PyTorch, Keras/TensorFlow ou NumPy feito pela equipe. O MLPClassifier/MLPRegressor do scikit-learn só vale como baseline.
  • Mesmo dataset, mesma tarefa e mesmo treino/teste do EDA, com a mesma semente. A validação sai do treino.
  • O teste é usado uma única vez, na etapa 5, depois de tudo decidido pela validação. Se ele ajudou a escolher algo, diga no relatório: a etapa 5 vale até a metade.
  • Sementes fixas, figuras numeradas com título, eixos e legenda; todo número pedido aparece no texto.

Etapas

  • 0 · Ponto de partida · 0,5


    • O pipeline do EDA importado de code/, ajustado só no treino, com as correções apontadas no EDA.
    • A métrica principal e o critério de sucesso escritos antes de treinar: "MAE pelo menos 15% menor que o do melhor baseline".
  • 1 · Baselines · 1,0


    • Um trivial (classe majoritária ou média do treino, Dummy*) e um linear (logística ou linear/Ridge), no mesmo pipeline, avaliados na validação.
    • Opcional: random forest ou boosting. Em tabelas eles costumam empatar com a rede; se for o caso, diga.
  • 2 · A rede · 2,0


    • Camadas, larguras, ativações e inicialização justificadas; nº de parâmetros comparado ao nº de linhas do treino.
    • Saída e perda coerentes com a tarefa (abaixo). Rede e loop em arquivos de code/.
  • 3 · Treinamento · 1,5


    • Otimizador (SGD com momentum, Adam ou AdamW), taxa, batch e épocas, com o motivo.
    • Parada antecipada pela validação, restaurando os melhores pesos.
    • Curvas de treino e de validação por época, lidas: converge? onde começa o overfitting?
  • 4 · Regularização e hiperparâmetros · 2,0


    • Duas técnicas ou mais (weight decay, dropout, BatchNorm/LayerNorm…) comparadas com a rede sem nenhuma.
    • Busca com 8 configurações ou mais (taxa, largura/profundidade, regularização) escolhida pela validação, numa tabela ordenada.
  • 5 · Avaliação no teste · 1,5


    • A configuração escolhida, retreinada e avaliada uma vez, com as métricas da tarefa (abaixo).
    • Uma tabela com a rede e os baselines no mesmo teste: o critério da etapa 0 foi atingido?
    • 3 sementes ou mais (média ± desvio): a diferença para o baseline é maior que essa variação?
  • 6 · Análise de erros · 1,0


    • O erro por subgrupo (uma categoria do EDA, faixas do alvo) e os piores exemplos, com uma hipótese para cada padrão.
    • Importância por permutação: bate com o que o EDA sugeria?
  • 7 · Conclusão · 0,5


    • A rede valeu a pena? Limitações, quem seria afetado por um erro e o que faria com mais tempo.
    • A tabela de resumo dos resultados preenchida.

O que muda com a tarefa

Item O que fazer
Baseline trivial DummyClassifier(strategy="most_frequent")
Saída e perda binária: 1 unidade + BCEWithLogitsLoss; multiclasse: 1 unidade por classe + CrossEntropyLoss. A rede devolve logits
Desbalanceamento weight/pos_weight na perda ou reamostragem só no treino
Métricas no teste matriz de confusão, precisão, recall e F1 por classe, F1 macro, ROC-AUC; se desbalanceado, curva precisão-recall e PR-AUC
Limiar escolhido na validação, justificado pelo custo dos erros
Item O que fazer
Baseline trivial DummyRegressor(strategy="mean") (ou "median")
Saída e perda 1 unidade linear + MSE, MAE ou Huber, justificada pelos outliers do EDA
Alvo assimétrico treinar em log1p(y) é permitido; as métricas voltam à escala original
Métricas no teste MAE, RMSE e R² (MAPE só se o alvo fica longe de zero)
Figuras previsto × real e resíduos × previsto

MLP · Otimização · Regularização · Métricas de classificação · Métricas de regressão · Separação

Esqueleto do loop de treino com parada antecipada (PyTorch)
best, wait = float("inf"), 0
for epoch in range(max_epochs):
    model.train()
    for xb, yb in train_loader:
        optimizer.zero_grad()
        loss = loss_fn(model(xb), yb)
        loss.backward()
        optimizer.step()

    model.eval()
    with torch.no_grad():
        val_loss = loss_fn(model(X_val), y_val).item()
    if val_loss < best:
        best, wait = val_loss, 0
        torch.save(model.state_dict(), "best.pt")   # guarda os melhores pesos
    else:
        wait += 1
        if wait == patience:
            break
model.load_state_dict(torch.load("best.pt"))

Resumo dos resultados

A última seção do relatório, com as linhas na ordem:

# Resumo Valor
1 Dataset, tarefa, alvo e métrica principal
2 Treino · validação · teste (linhas)
3 Melhor baseline e sua métrica no teste
4 Rede escolhida: camadas × unidades, nº de parâmetros, regularização
5 Otimizador, taxa, batch e época em que parou
6 Métrica principal da rede no teste (média ± desvio, 3 sementes)
7 Critério de sucesso atingido?
8 Subgrupo com o maior erro e o valor

Entrega

Relatório em docs/projects/classification/index.md ou docs/projects/regression/index.md (conforme a tarefa, como no template), no mesmo repositório do EDA, com os títulos das etapas na ordem desta página, código em code/ (roda de um clone limpo) e figuras em figures/ — veja Formato de Entrega. Prazo não é estendido · plágio zera a entrega · IA é permitida, mas todos os membros explicam cada número e cada decisão: provas orais podem ocorrer e a Avaliação de Projeto limita a nota.

---
project: classification          # ou regression
dataset: https://...
team: [Nome Sobrenome, ...]
ai_use: "none"
---

Bônus de competição (até +1, nota limitada a 10): se o dataset é de uma competição aberta (Kaggle, DrivenData, Zindi), +0,5 por uma submissão válida da rede e +0,5 se ela ficar entre os 50% melhores do leaderboard, com link e captura de tela no relatório.

Rubrica

Rubrica em revisão

A rubrica desta entrega ainda pode ser revisada. Qualquer mudança será anunciada em aula e registrada nesta página antes do prazo.

Cada etapa vale integral, metade ou zero: integral quando tudo o que o cartão pede está lá e justificado; metade quando falta a justificativa ou o número que sustenta a análise; zero quando ausente ou incorreta.

Etapa Pts Nota integral quando
0. Ponto de partida 0,5 Pipeline do EDA reaproveitado sem vazamento; métrica e critério numérico definidos antes de treinar.
1. Baselines 1,0 Trivial e linear no mesmo pipeline, avaliados na validação e interpretados.
2. A rede 2,0 Arquitetura justificada, saída e perda certas para a tarefa, código em code/ que roda.
3. Treinamento 1,5 Escolhas do otimizador justificadas, parada antecipada pela validação, curvas lidas.
4. Regularização e hiperparâmetros 2,0 Duas técnicas comparadas, 8 configurações ou mais escolhidas pela validação.
5. Avaliação no teste 1,5 Teste usado uma vez, métricas da tarefa, comparação com os baselines e 3 sementes.
6. Análise de erros 1,0 Erro por subgrupo com hipóteses e importância por permutação comparada ao EDA.
7. Conclusão 0,5 Limitações e uso responsável discutidos, resumo dos resultados completo.
10