Implementando Modelos de Recomendação com Python

Vivemos em um mundo onde recomendações personalizadas estão em todo lugar: na Netflix quando escolhemos filmes, no Spotify sugerindo músicas, na Amazon indicando produtos ou até no YouTube com vídeos recomendados.

Os modelos de recomendação são sistemas de Machine Learning que analisam dados de comportamento e preferências de usuários para sugerir itens relevantes. Eles são fundamentais para empresas que lidam com grandes catálogos de produtos e conteúdos.

Neste artigo, vamos explorar como implementar sistemas de recomendação em Python, desde os fundamentos até modelos colaborativos e baseados em conteúdo.


1. Tipos de Sistemas de Recomendação

Antes da implementação, precisamos entender os principais tipos:

  1. Baseados em Popularidade (mais simples)

    • Recomendam os itens mais populares ou mais vendidos.

    • Exemplo: lista de "mais assistidos" da Netflix.

  2. Baseados em Conteúdo (Content-Based)

    • Recomendam itens semelhantes ao que o usuário já gostou.

    • Usam descrições, tags e atributos dos itens.

  3. Filtragem Colaborativa (Collaborative Filtering)

    • Recomendam itens baseados no comportamento de outros usuários semelhantes.

    • Pode ser user-based (usuários parecidos) ou item-based (itens relacionados).

  4. Híbridos

    • Combinam técnicas de conteúdo, colaborativas e popularidade.

    • Mais usados em sistemas modernos como Spotify e Netflix.


2. Preparando os Dados

Vamos usar um dataset fictício de avaliações de filmes:

import pandas as pd

# Dados fictícios: usuário, filme e nota
dados = pd.DataFrame({
    "usuario": [1,1,1,2,2,3,3,4,4,5],
    "filme": ["A", "B", "C", "A", "C", "B", "D", "C", "D", "A"],
    "nota": [5, 4, 3, 4, 5, 2, 5, 3, 4, 4]
})

print(dados)

3. Recomendação Baseada em Popularidade

populares = dados.groupby("filme")["nota"].mean().sort_values(ascending=False)
print("Filmes mais recomendados (popularidade):")
print(populares)

Esse modelo é simples, mas não personalizado — todos recebem as mesmas recomendações.


4. Recomendação Baseada em Conteúdo

Suponha que temos descrições dos filmes. Podemos usar TF-IDF (Term Frequency-Inverse Document Frequency) para medir similaridade textual.

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel

# Exemplo de descrições dos filmes
descricoes = {
    "A": "aventura ação fantasia",
    "B": "romance drama",
    "C": "comédia família",
    "D": "ação ficção científica"
}

df_descricoes = pd.DataFrame(descricoes.items(), columns=["filme", "descricao"])

# Vetorização TF-IDF
tfidf = TfidfVectorizer()
matriz = tfidf.fit_transform(df_descricoes["descricao"])

# Similaridade entre filmes
cosine_sim = linear_kernel(matriz, matriz)

# Função de recomendação baseada em similaridade
indices = pd.Series(df_descricoes.index, index=df_descricoes["filme"])

def recomendar_conteudo(filme, n=2):
    idx = indices[filme]
    sim_scores = list(enumerate(cosine_sim[idx]))
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    sim_scores = sim_scores[1:n+1]
    filmes_similares = [df_descricoes["filme"].iloc[i[0]] for i in sim_scores]
    return filmes_similares

print("Filmes semelhantes a A:", recomendar_conteudo("A"))

5. Filtragem Colaborativa com Python

A filtragem colaborativa usa a interação entre usuários e itens. Vamos implementar a abordagem user-item.

5.1 Criando a matriz usuário-item

matriz = dados.pivot_table(index="usuario", columns="filme", values="nota").fillna(0)
print(matriz)

5.2 Similaridade entre usuários

from sklearn.metrics.pairwise import cosine_similarity

sim_usuarios = cosine_similarity(matriz)
sim_df = pd.DataFrame(sim_usuarios, index=matriz.index, columns=matriz.index)
print(sim_df)

5.3 Recomendação baseada em vizinhos

def recomendar_usuario(usuario, n=2):
    similaridade = sim_df[usuario].sort_values(ascending=False)[1:]
    usuario_mais_proximo = similaridade.index[0]
    
    # Itens avaliados pelo usuário similar e não pelo atual
    filmes_usuario = set(dados[dados["usuario"] == usuario]["filme"])
    filmes_similar = set(dados[dados["usuario"] == usuario_mais_proximo]["filme"])
    
    recomendacoes = filmes_similar - filmes_usuario
    return list(recomendacoes)[:n]

print("Recomendações para o usuário 1:", recomendar_usuario(1))

6. Recomendação com Bibliotecas Específicas

Existem bibliotecas prontas para sistemas de recomendação. Uma das mais usadas é a Surprise.

from surprise import Dataset, Reader, SVD
from surprise.model_selection import cross_validate

# Preparando dados
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(dados[["usuario", "filme", "nota"]], reader)

# Modelo SVD (Matrix Factorization)
model = SVD()
cross_validate(model, data, measures=["RMSE", "MAE"], cv=3, verbose=True)

Esse modelo é poderoso e escalável, usado em sistemas reais.


7. Visualizando Recomendações

import matplotlib.pyplot as plt

populares.plot(kind="bar", color="skyblue")
plt.title("Filmes mais recomendados por popularidade")
plt.ylabel("Nota média")
plt.show()

8. Boas Práticas em Sistemas de Recomendação

  • Híbridos são mais eficientes: combine conteúdo + colaborativo + popularidade.

  • Atualização constante: dados mudam rápido, especialmente em redes sociais e e-commerce.

  • Avalie corretamente: use métricas como RMSE, Precision@K, Recall@K, NDCG.

  • Explique as recomendações: usuários confiam mais quando entendem o motivo.

  • Escalabilidade: sistemas reais precisam lidar com milhões de usuários e itens.


9. Conclusão

Modelos de recomendação são parte essencial da experiência digital moderna.
Com Python, conseguimos implementar desde modelos básicos (popularidade, conteúdo) até sistemas mais avançados com filtragem colaborativa e fatoração matricial.

Bibliotecas como Scikit-learn, Surprise e até TensorFlow permitem escalar esses sistemas para aplicações reais.

No futuro, os sistemas de recomendação devem evoluir para se tornarem ainda mais contextuais e personalizados, considerando tempo, localização, emoções e histórico em múltiplas plataformas.

Comentários

Postagens mais visitadas deste blog

Python para Computação Quântica: Introdução com Qiskit

Gerando Relatórios em PDF com Python (ReportLab e FPDF)

Estrutura Básica de um Programa C# com exemplos