Projeto Final — Aprendizado Não Supervisionado
Modelos de recomendação e análise de espaços latentes
← Voltar para a página da disciplina
- Data limite de submissão: 30 de novembro de 2026, às 23h59 (horário de Brasília).
- A submissão deve conter o Relatório (PDF) e o repositório reprodutível com
uv.
Objetivo
Em sistemas de recomendação, queremos prever as notas que faltam a partir de um histórico parcial de interações. Neste projeto, vocês vão treinar modelos que fazem suposições diferentes sobre esse problema e investigar o que cada um aprende.
Ao longo do trabalho, tentem responder a estas perguntas:
- O que cada modelo supõe?
- O que muda ao passar de um modelo determinístico (PCA com imputação ou fatoração de matrizes) para um modelo probabilístico (PPCA e VAE)?
- O que implica supor ruído gaussiano com variância \(\sigma^2\) fixa nas notas?
- O que o espaço latente contém?
- O que os vetores de usuários (\(\mathbf{z}_u\)) e de filmes (\(\mathbf{w}_i\)) codificam?
- Dá para recuperar informações que não foram usadas no treino, como idade, gênero e ocupação dos usuários, ou gêneros, ano e popularidade dos filmes?
- Isso pode ser medido, além de observado em gráficos 2D?
- Os espaços dos diferentes modelos têm a mesma estrutura?
- Modelos lineares e não lineares aproximam os mesmos vizinhos?
- O que vocês conseguem investigar por conta própria?
- Na Etapa 3, cada grupo formula uma pergunta e uma hipótese que possa ser refutada, e desenha um experimento para testá-la.
A nota não depende da métrica obtida pelo modelo, mas da qualidade das hipóteses, da aplicação correta do protocolo e da análise das evidências. Resultados negativos ou inconclusivos valem, se vierem com análise crítica.
Equipes
O trabalho deve ser feito por 2 ou 3 alunos. Não serão aceitos trabalhos individuais nem grupos com 4 ou mais estudantes.
Dados: MovieLens 100K
O projeto usa o MovieLens 100K (Harper e Konstan, 2015), carregado pelo notebook base:
- Notas (\(R\)): 100.000 notas inteiras, de 1 a 5, dadas por \(n = 943\) usuários a \(m = 1.682\) filmes. Cada usuário tem pelo menos 20 notas.
- Esparsidade: a densidade é de cerca de \(6{,}3\%\), ou seja, mais de \(93\%\) dos pares usuário–filme não têm nota.
- Usuários: idade, gênero e ocupação (21 categorias).
- Filmes: título, ano e 19 indicadores de gênero. Um filme pode ter vários gêneros.
Um usuário pode não ter avaliado um filme por falta de interesse, por não o conhecer ou por esquecimento, e filmes populares recebem muito mais notas que os de nicho. Portanto, os dados de treino e de teste são enviesados. Levem isso em conta ao analisar os resultados.
Formulação do problema
A nota \(R_{ui}\) do usuário \(u\) para o filme \(i\) é modelada por:
\[R_{ui} = \mu + b_u + b_i + f(\mathbf{z}_u, \mathbf{w}_i) + \epsilon_{ui}\]
onde:
- \(\mu\) é a média global das notas.
- \(b_u\) é o viés do usuário \(u\): o quanto ele costuma dar notas acima ou abaixo da média.
- \(b_i\) é o viés do filme \(i\): o quanto ele costuma receber notas acima ou abaixo da média. Ele não mede quantas pessoas viram o filme.
- \(\mathbf{z}_u, \mathbf{w}_i \in \mathbb{R}^k\) são os vetores latentes do usuário e do filme.
- \(f(\mathbf{z}_u, \mathbf{w}_i)\) mede a compatibilidade entre eles, em geral pelo produto interno \(\mathbf{z}_u^\top \mathbf{w}_i\).
- \(\epsilon_{ui}\) é o erro.
Nem todo modelo usa todos os termos. O PCA com imputação e o PPCA, por exemplo, têm uma média por filme e nenhum viés de usuário.
Os modelos aprendem vetores apenas para os usuários e filmes presentes no treino. Um usuário é só um identificador, e suas notas não são usadas como atributos. Isso dá a cada usuário parâmetros próprios, mas o modelo não generaliza para usuários ou filmes novos sem novo treino.
Protocolo experimental
Todos os modelos, inclusive os mais simples, seguem o mesmo protocolo. Variem uma coisa de cada vez.
- Hipótese antes do experimento: escrevam a hipótese e a previsão antes de rodar cada experimento.
- Divisão dos dados: 80% das notas para treino e 20% para teste, estratificadas por usuário, com a função
split_ratingsdo notebook. - Métricas: RMSE (principal) e MAE, com previsões limitadas a \([1, 5]\). Usem NLL quando o modelo definir uma verossimilhança. Métricas de lista seguem a Tarefa 1.3.
- Escolha de hiperparâmetros: por validação cruzada com \(K\) folds dentro do treino. O teste é usado uma única vez, para reportar o resultado final, depois de treinar com todo o treino.
- Incerteza: comparem resultados com intervalos de confiança, seja pela média e desvio padrão entre os folds, seja por bootstrap no conjunto de teste.
- Interpretação: separem o que um resultado diz sobre a previsão do que ele diz sobre a representação latente.
- Fontes e bibliotecas: citem suas fontes. Vocês podem usar bibliotecas externas ou reescrever os modelos, desde que digam quais usaram e expliquem como mantiveram a fidelidade ao modelo.
Etapas
O projeto tem três etapas. O notebook base traz o código de referência das Etapas 1 e 2.
Etapa 1: Baselines e fatoração de matrizes
Aqui construímos os modelos de referência, sem suposições probabilísticas.
- Tarefa 1.1: baseline aditiva
- Treinem o modelo sem interação latente, ajustando os vieses por regressão linear com regularização \(L_2\) (\(\lambda_u, \lambda_i\)): \[R_{ui} = \mu + b_u + b_i + \epsilon_{ui}\]
- Reportem RMSE e MAE no teste.
- Para discutir: o que os vieses aprendidos dizem sobre os usuários e os filmes?
- Tarefa 1.2: PCA com imputação
- Preencham as notas faltantes com a média do filme no treino, formando \(\tilde{R}\), e apliquem PCA com \(k\) componentes: \[\hat{R}_{ui} = \bar{R}_i + \mathbf{z}_u^\top \mathbf{w}_i\]
- Escolham \(k\) pelo protocolo e reportem RMSE e MAE no teste.
- Para discutir: aumentar \(k\) melhora as previsões, traz ganhos decrescentes ou piora o desempenho? O que a imputação pode distorcer?
- Tarefa 1.3: fatoração de matrizes
- Ajustem os vetores latentes usando só os pares observados \(\Omega\), sem imputação: \[\min_{b, \mathbf{Z}, \mathbf{W}} \sum_{(u,i)\in\Omega} \left(r_{ui} - \mu - b_u - b_i - \mathbf{z}_u^\top \mathbf{w}_i\right)^2 + \lambda_b \left(\sum_u b_u^2 + \sum_i b_i^2\right) + \lambda_z \left(\sum_u \|\mathbf{z}_u\|_2^2 + \sum_i \|\mathbf{w}_i\|_2^2\right)\] No código de referência, \(\mu\) é fixada na média do treino.
- Treinem por descida de gradiente estocástica (SGD) e escolham \(k\), \(\lambda_b\) e \(\lambda_z\) pelo protocolo.
- Comparação obrigatória: com vieses (\(\hat{R}_{ui} = \mu + b_u + b_i + \mathbf{z}_u^\top \mathbf{w}_i\)) e sem vieses (\(\hat{R}_{ui} = \mu + \mathbf{z}_u^\top \mathbf{w}_i\), que é o que faz
use_biases=False). Quanto vem dos efeitos aditivos e quanto vem das interações latentes? - Métricas de lista: além de RMSE e MAE, gerem para cada usuário a lista dos 10 filmes com maior nota prevista e calculem pelo menos uma métrica de lista (Precision@10, Hit-Rate@10 ou NDCG@10) para todos os modelos que preveem nota. Digam no relatório o que conta como acerto (por exemplo, um filme de teste com nota 4 ou mais) e quais filmes são candidatos (por exemplo, os que o usuário não avaliou no treino), porque essas escolhas mudam bastante o resultado.
- Para discutir: o modelo com menor RMSE é o que gera as melhores listas? Por quê?
Etapa 2: Modelos probabilísticos e espaço latente
Agora passamos a descrever as notas com uma distribuição de probabilidade, o que torna explícitas a incerteza e o ruído.
- Tarefa 2.1: PCA probabilístico (PPCA) para matrizes esparsas
- O modelo é linear e gaussiano: \[\mathbf{z}_u \sim \mathcal{N}(\mathbf{0}, \mathbf{I}_k), \qquad R_{ui} \mid \mathbf{z}_u \sim \mathcal{N}\left(\mu_i + \mathbf{z}_u^\top \mathbf{w}_i, \sigma^2\right)\]
- Treinem com o algoritmo EM, em que cada usuário contribui só com os filmes que avaliou. Notas ausentes são dados não observados, e não zeros.
- Escolham \(k\) e \(\sigma^2\) pelo protocolo e comparem o RMSE com o da Etapa 1.
- Para discutir: a configuração com menor RMSE é também a de melhor NLL média? Como \(\sigma^2\) afeta a distribuição das notas? Como o prior gaussiano influencia as representações? O que implica estimar um vetor para cada usuário conhecido no treino?
- Tarefa 2.2: autoencoder variacional (VAE)
- Cada usuário tem uma média \(\mathbf{m}_u\) e uma variância diagonal \(\mathbf{s}_u^2\) próprias, aprendidas como parâmetros (não há rede codificadora que receba as notas). A amostragem usa o truque da reparametrização: \(\mathbf{z}_u = \mathbf{m}_u + \mathbf{s}_u \odot \boldsymbol{\epsilon}\), com \(\boldsymbol{\epsilon} \sim \mathcal{N}(\mathbf{0}, \mathbf{I}_k)\).
- O treino maximiza o ELBO, ponderado por \(\beta\) e a menos de constantes: \[\mathcal{L}_u = \mathbb{E}_{q_\phi(\mathbf{z}_u)}\left[ -\frac{1}{2\sigma^2} \sum_{i\in\Omega_u} (r_{ui} - g_\theta(\mathbf{z}_u)_i)^2 \right] - \beta \, \mathrm{D}_{\mathrm{KL}}\left( q_\phi(\mathbf{z}_u) \,\|\, \mathcal{N}(\mathbf{0}, \mathbf{I}_k) \right)\]
- Comparação 1: treinem o VAE com decodificador linear (\(g_\theta(\mathbf{z}) = \boldsymbol{\mu} + \mathbf{W}\mathbf{z}\)) e comparem com o PPCA, usando os mesmos \(k\) e \(\sigma^2\) (RMSE, MAE e NLL no teste).
- Comparação 2: troquem o decodificador linear por um não linear (no notebook, uma camada oculta com Tanh). A flexibilidade extra melhora as previsões ou leva a sobreajuste?
- Sensibilidade: variem um hiperparâmetro de cada vez, entre \(\beta\), \(\sigma^2\) ou \(k\). Verifiquem a convergência pela curva em
historyantes de comparar os modelos. - Tempo de execução: comparem o tempo de treino e de inferência da fatoração (SGD), do PPCA (que inverte uma matriz \(k \times k\) por usuário a cada passo E) e do VAE (linear e não linear). O que seria viável com milhões de interações?
- Tarefa 2.3: análise dos espaços latentes
- Comparem os espaços de PCA com imputação, fatoração de matrizes, PPCA e VAE, com um \(k\) de sua escolha. Para os filmes, usem o VAE com decodificador linear, o único do notebook que gera
item_embeddings. - Visualização: projetem os vetores em 2D com PCA e t-SNE, colorindo os pontos com informações não usadas no treino (idade, gênero, ocupação; gêneros, ano, popularidade).
- Medição: treinem modelos supervisionados lineares sobre os vetores originais de dimensão \(k\):
Ridgepara variáveis contínuas eLogisticRegression, avaliada por ROC-AUC, para categorias.- Evitem vazamento: avaliem esses modelos com validação cruzada ou numa partição separada. Medir \(R^2\) ou ROC-AUC nos mesmos dados do ajuste infla o resultado.
- Comparação entre espaços: os espaços podem ser invariantes a rotação, reflexão e escala. Alinhem os vetores antes de comparar, ou usem medidas que dispensem o alinhamento, como a correlação de distâncias e a sobreposição dos vizinhos mais próximos de cada filme (por exemplo, com similaridade de Jaccard).
- Comparem os espaços de PCA com imputação, fatoração de matrizes, PPCA e VAE, com um \(k\) de sua escolha. Para os filmes, usem o VAE com decodificador linear, o único do notebook que gera
Etapa 3: Projeto do grupo
Cada grupo propõe uma investigação própria: uma melhoria de modelo ou uma análise mais profunda de algum aspecto do problema. Vale partir de uma pergunta que surgiu nas etapas anteriores.
Escrevam no relatório:
- A pergunta: o que vocês querem responder?
- A hipótese: que mecanismo justifica o que vocês esperam?
- O experimento: qual é o modelo de referência e qual é a mudança proposta?
- A previsão: o que deve subir, descer ou mudar nas métricas?
- O que refutaria a hipótese: qual resultado mostraria que ela está errada?
Ao final, comparem o que foi previsto com o que foi observado, e digam o que isso ensina sobre a previsão e sobre o espaço latente.
O grupo pode escolher uma das sugestões abaixo ou propor outra, desde que bem justificada.
Sugestão A: Ausência não aleatória
- Motivação: usuários ativos e filmes populares aparecem muito mais nos dados.
- Mudança: estimar a probabilidade de observação \(P(O_{ui} = 1)\) e pesar a perda pelo seu inverso (Schnabel et al., 2016): \[\mathcal{L}_{\mathrm{IPW}} = \sum_{(u,i)\in\Omega} \frac{(r_{ui} - \hat{R}_{ui})^2}{P(O_{ui} = 1)}\]
- Pergunta: isso melhora as previsões para filmes pouco avaliados? O que acontece com os populares?
- Atenção: o conjunto de teste também é enviesado. Digam como vocês levam isso em conta na avaliação.
Sugestão B: Metadados como features
- Motivação: tratar usuários e filmes só como identificadores impede a generalização e dificulta o cold start.
- Mudança: usar os atributos do usuário (\(\mathbf{x}_u\)) e do filme para definir a média do prior dos vetores latentes, como em \(\mathbf{z}_u \sim \mathcal{N}(h_\psi(\mathbf{x}_u), \mathbf{I})\).
- Pergunta: isso melhora as previsões para usuários com pouco histórico?
- Atenção: todo usuário tem pelo menos 20 notas. Definam o que é “pouco histórico”, por exemplo escondendo notas de parte dos usuários.
Sugestão C: Geometria da compatibilidade
- Motivação: os modelos anteriores medem a compatibilidade pelo produto interno \(\mathbf{z}_u^\top \mathbf{w}_i\), que não é uma distância e não obedece à desigualdade triangular. Trocá-lo por uma função aprendida também nem sempre ajuda: Rendle et al. (2020) mostram um caso em que o produto interno bem ajustado supera um MLP.
- Mudança: usar uma distância, como \(-\|\mathbf{z}_u - \mathbf{w}_i\|_2\), ou uma pequena rede que receba \(\mathbf{z}_u\) e \(\mathbf{w}_i\).
- Pergunta: isso muda o que o espaço codifica, o erro de previsão e a qualidade das listas?
Sugestão D: Estrutura do espaço latente no VAE
- Motivação: a escolha de hiperparâmetros olhou para o erro de previsão, e não para a geometria do espaço latente.
- Mudança: variar de forma sistemática \(\beta\) (\(\beta\)-VAE), a dimensão \(k\) ou a regularização.
- Pergunta: o que muda no espaço aprendido, em termos de estabilidade de clusters, correlação com metadados e erro de previsão? Valores maiores de \(\beta\) pioram a reconstrução em troca de uma estrutura mais legível?
Relatório
O relatório deve ser claro e direto, em PDF, com 10 a 15 páginas de conteúdo (sem contar capa, referências e apêndices), organizado em 6 seções. Os tamanhos abaixo são indicativos.
1. Problema, dados e protocolo (cerca de 1 página)
- O problema de recomendação como aprendizado transdutivo em matrizes esparsas, com a notação usada: \(R, \mathbf{z}_u, \mathbf{w}_i, \Omega\).
- Análise dos dados: distribuição das notas, esparsidade, sinais de ausência não aleatória e perfil dos metadados.
- Protocolo: divisão treino/teste, validação cruzada, intervalos de confiança e métricas (RMSE, MAE, NLL e a métrica de lista, com a definição de acerto e de candidatos).
2. Modelos e suposições (2 a 3 páginas)
- O que cada modelo supõe e como é ajustado:
- Baseline: vieses por mínimos quadrados regularizados.
- PCA com imputação: aproximação de posto \(k\) e efeitos da imputação pela média.
- Fatoração de matrizes: perda nos dados observados, regularização \(L_2\) e SGD.
- PPCA: modelo gerador, algoritmo EM e posterior gaussiana.
- VAE: média e variância aprendidas por usuário, truque da reparametrização e ELBO.
- Comparação entre modelos determinísticos e probabilísticos.
3. Resultados das Etapas 1 e 2 (3 a 4 páginas)
- Tabela com todos os modelos no teste, com intervalos de confiança: RMSE e MAE; NLL para PPCA e VAE; e a métrica de lista.
- Comparação entre erro da nota (RMSE) e qualidade das listas.
- Fatoração com e sem vieses.
- PPCA e VAE linear com as mesmas suposições.
- Efeito do decodificador não linear e sensibilidade a \(\beta\), \(\sigma^2\) ou \(k\).
- Convergência dos modelos, incluindo a curva em
historydo VAE. - Tempo de treino e de inferência.
4. Análise dos espaços latentes (2 a 3 páginas)
- Projeções 2D (PCA e t-SNE) dos quatro modelos.
- Tabela com \(R^2\) (
Ridge) e ROC-AUC (LogisticRegression) em dados não usados no ajuste, para os metadados de usuários e filmes. - Comparação de distâncias e vizinhanças entre os modelos.
- Discussão: que informação cada espaço organiza melhor?
5. Projeto do grupo (cerca de 3 páginas)
- Pergunta, hipótese, experimento, previsão e o que refutaria a hipótese.
- O que foi implementado.
- Resultados: a hipótese foi confirmada ou refutada?
- O que o resultado ensina sobre o problema ou sobre o espaço latente.
6. Conclusões (cerca de 1 página)
- Principais achados.
- Limitações, como a abordagem transdutiva e o viés de seleção.
- Próximos passos.
O que entregar
A entrega deve ser realizada impreterivelmente até 30 de novembro de 2026, às 23h59. Cada equipe entrega:
1. Relatório em PDF
Organizado nas 6 seções acima, com 10 a 15 páginas de conteúdo.
2. Repositório reprodutível com uv
O repositório deve ter a estrutura abaixo. Baixem o notebook e o pyproject.toml nesta página e criem os demais arquivos.
unsupervised-assignment/
├── data/ # MovieLens 100K, baixado pelo notebook
├── unsupervised_assignment_2s2026.ipynb # notebook preenchido e executado
├── pyproject.toml # dependências
├── uv.lock # versões exatas, gerado pelo uv
├── .python-version # versão do Python usada (ex.: 3.12)
└── README.md # como reproduzir
O README.md deve dizer como reproduzir o ambiente:
# 1. Criar o ambiente
uv sync
# 2. Abrir o Jupyter Lab
uv run --with jupyter jupyter labFixem as sementes aleatórias (set_seed(42)) para que tabelas e figuras possam ser reproduzidas.
Avaliação
Conforme o Plano de Desenvolvimento da Disciplina (PDD), o Trabalho Final (\(TF\)) vale 40% da nota do semestre:
\[NF = 0{,}20\,T_1 + 0{,}20\,T_2 + 0{,}20\,T_3 + 0{,}40\,TF\]
| Dimensão | Peso | O que será observado |
|---|---|---|
| Fundamentação e formulação matemática | 20% | Apresentação correta das suposições de cada modelo (baseline, PCA, fatoração, PPCA e VAE) e relação com o conteúdo da disciplina. |
| Modelagem, comparações e métricas de lista | 25% | Execução correta das Etapas 1 e 2 segundo o protocolo: escolha de hiperparâmetros, comparação com e sem vieses, métricas de lista, comparação entre PPCA e VAEs (linear e não linear) e análise de tempo. |
| Análise dos espaços latentes | 20% | Qualidade das visualizações, medição com modelos lineares sem vazamento e comparação entre espaços. |
| Projeto do grupo (Etapa 3) | 20% | Clareza da hipótese e da previsão, adequação do experimento à pergunta e qualidade da discussão, seja a hipótese confirmada ou refutada. |
| Reprodutibilidade e relatório | 15% | Clareza do relatório (10 a 15 páginas), organização do código e do notebook, ambiente com uv (pyproject.toml, uv.lock) e reprodução de figuras e tabelas. |
Textos, gráficos e implementações devem ser de autoria da equipe. Ferramentas de assistência de código devem ser usadas com responsabilidade e transparência. Cópia não autorizada de código, apropriação de análises de terceiros ou fraude em dados resultarão em nota zero no trabalho final (\(TF = 0\)) e comunicação formal à diretoria do Instituto de Computação da UNICAMP, conforme o PDD e o regimento acadêmico.