Projeto Final — Aprendizado Não Supervisionado

Modelos de recomendação e análise de espaços latentes

Autor

Marcos M. Raimundo — Instituto de Computação, UNICAMP

Data de Publicação

4 de novembro de 2026

← Voltar para a página da disciplina


ImportantePrazo Final de Entrega (Deadline)
  • 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.
NotaO que é avaliado

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

ImportanteComposição dos grupos

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.
AvisoA ausência de notas não é aleatória

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.

NotaModelos transdutivos

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_ratings do 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 history antes 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\): Ridge para variáveis contínuas e LogisticRegression, 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).

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.

ImportanteAntes de rodar (Tarefa 3.1)

Escrevam no relatório:

  1. A pergunta: o que vocês querem responder?
  2. A hipótese: que mecanismo justifica o que vocês esperam?
  3. O experimento: qual é o modelo de referência e qual é a mudança proposta?
  4. A previsão: o que deve subir, descer ou mudar nas métricas?
  5. 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 history do 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 lab

Fixem 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.

ImportanteIntegridade acadêmica e plágio

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.