Sistemas de Recomendação com Python: Do Filtro Colaborativo ao Deep Learning

O que são Sistemas de Recomendação?
Sistemas de recomendação são algoritmos que filtram e sugerem itens relevantes para usuários com base em seus interesses, histórico de interações e comportamento. Eles estão em toda parte: Netflix sugerindo filmes, Spotify recomendando músicas, Amazon indicando produtos e YouTube selecionando o próximo vídeo.
Construir um bom sistema de recomendação pode aumentar significativamente o engajamento, a retenção e a receita de uma plataforma. Neste artigo, vamos explorar desde as abordagens mais simples até técnicas avançadas com deep learning, tudo implementado em Python.
Abordagens Clássicas de Recomendação
Filtragem Baseada em Conteúdo (Content-Based)
A filtragem baseada em conteúdo recomenda itens similares àqueles que o usuário já gostou no passado. Cada item é representado por um vetor de características (gênero, tags, descrição), e a similaridade é calculada entre o perfil do usuário e os itens disponíveis.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
# Descrições dos filmes
filmes = [
'Um herói busca vingança em um futuro distópico',
'Um detetive investiga crimes em uma cidade futurista',
'Uma comédia romântica ambientada em Paris',
]
# Vetoriza com TF-IDF
vectorizer = TfidfVectorizer()
matriz_tfidf = vectorizer.fit_transform(filmes)
# Calcula similaridade
similaridade = cosine_similarity(matriz_tfidf)
print(similaridade)Filtragem Colaborativa (Collaborative Filtering)
A filtragem colaborativa ignora as características dos itens e se baseia exclusivamente nas interações dos usuários. A ideia central é: se dois usuários têm padrões de avaliação semelhantes, provavelmente gostarão dos mesmos itens. Existem duas variações principais:
- Baseada em Usuários (User-Based): Encontra usuários similares e recomenda itens que eles gostaram.
- Baseada em Itens (Item-Based): Encontra itens similares com base em quem os avaliou (mais escalável).
# Exemplo com a biblioteca Surprise
from surprise import Dataset, Reader, KNNBasic
from surprise.model_selection import train_test_split
# Carrega dados de avaliações (usuário, item, nota)
reader = Reader(rating_scale=(1, 5))
dados = Dataset.load_from_df(
avaliacoes[['usuario_id', 'filme_id', 'nota']],
reader
)
treino, teste = train_test_split(dados, test_size=0.2)
# Modelo de filtragem colaborativa item-based
algo = KNNBasic(sim_options={'user_based': False})
algo.fit(treino)
predicoes = algo.test(teste)Fatoração de Matrizes com SVD
A fatoração de matrizes é uma das técnicas mais populares e eficazes para sistemas de recomendação. Ela decompõe a matriz esparsa de avaliações (usuários x itens) em duas matrizes latentes de menor dimensionalidade, capturando fatores implícitos como preferências e características.
from surprise import SVD
from surprise.model_selection import cross_validate
# Modelo SVD (Singular Value Decomposition)
algo = SVD(n_factors=100, lr_all=0.005, reg_all=0.02)
# Validação cruzada
resultados = cross_validate(algo, dados, cv=5, verbose=True)
print(f'RMSE médio: {resultados["test_rmse"].mean():.4f}')
print(f'MAE médio: {resultados["test_mae"].mean():.4f}')Recomendação com Deep Learning
Para cenários mais complexos com grandes volumes de dados, modelos de deep learning oferecem maior capacidade de capturar padrões não lineares e interações complexas entre usuários e itens.
import tensorflow as tf
from tensorflow.keras.layers import Embedding, Flatten, Concatenate, Dense, Dropout
def criar_modelo_ncf(n_usuarios, n_itens, n_fatores=64):
# Embeddings de usuários e itens
embedding_usuario = Embedding(n_usuarios, n_fatores)(input_usuario)
embedding_item = Embedding(n_itens, n_fatores)(input_item)
# Achata e concatena
vetor_usuario = Flatten()(embedding_usuario)
vetor_item = Flatten()(embedding_item)
concatenado = Concatenate()([vetor_usuario, vetor_item])
# Camadas densas
dense_1 = Dense(128, activation='relu')(concatenado)
dropout_1 = Dropout(0.2)(dense_1)
dense_2 = Dense(64, activation='relu')(dropout_1)
# Saída (nota prevista)
output = Dense(1, activation='linear')(dense_2)
modelo = tf.keras.Model([input_usuario, input_item], output)
modelo.compile(optimizer='adam', loss='mse', metrics=['mae'])
return modeloAvaliação de Sistemas de Recomendação
Avaliar um sistema de recomendação vai além da acurácia tradicional. Métricas como RMSE e MAE medem o erro das predições, mas métricas de ranking são igualmente importantes:
- Precision@K e Recall@K: Medem a relevância dos K primeiros itens recomendados.
- NDCG (Normalized Discounted Cumulative Gain): Considera a posição dos itens relevantes no ranking.
- MAP (Mean Average Precision): Média da precisão média para cada usuário.
- Coverage: Percentual de itens que o sistema é capaz de recomendar.
Desafios e Boas Práticas
- Cold Start: Como recomendar para novos usuários ou itens sem histórico. Soluções incluem recomendações populares, híbridas ou baseadas em metadados.
- Escalabilidade: Para milhões de usuários e itens, técnicas como ANN (Approximate Nearest Neighbors) ou sistemas em duas etapas (candidate generation + ranking) são essenciais.
- Viés de Exposição: Usuários só interagem com itens que foram recomendados, criando um ciclo de feedback. Técnicas de exploração vs. aproveitamento (exploration vs. exploitation) ajudam a mitigar.
- Privacidade: Dados de interação dos usuários são sensíveis. Técnicas de privacidade diferencial e federação de modelos estão se tornando cada vez mais importantes.
Conclusão
Sistemas de recomendação são uma área fascinante que combina aprendizado de máquina, engenharia de software e psicologia do usuário. Com Python e as bibliotecas certas — Surprise, Scikit-learn e TensorFlow — você pode implementar desde filtros colaborativos simples até arquiteturas modernas de deep learning.
O segredo está em escolher a abordagem certa para cada problema, equilibrar precisão com diversidade e sempre avaliar o impacto real no usuário final.







