Implementando Modelos de Recomendação com Python

Nos dias de hoje, com o excesso de informação e produtos disponíveis, os usuários precisam de ajuda para encontrar aquilo que realmente os interessa. É aqui que entram os sistemas de recomendação, responsáveis por sugerir filmes, músicas, livros, cursos, produtos e até conexões em redes sociais.

Neste artigo, vamos explorar como Python pode ser usado para criar modelos de recomendação, passando por conceitos fundamentais, diferentes abordagens e exemplos práticos.


1. O que é um Sistema de Recomendação?

Um sistema de recomendação é um modelo de aprendizado que prevê a preferência de um usuário em relação a um item, com base em dados históricos.

Existem três principais tipos:

  1. Baseado em Popularidade – recomenda os itens mais consumidos.

  2. Baseado em Conteúdo – recomenda itens semelhantes ao que o usuário já gostou.

  3. Filtragem Colaborativa – recomenda itens com base em usuários semelhantes ou preferências conjuntas.

  4. Híbridos – combinam várias abordagens para melhorar a qualidade.


2. Preparando o Ambiente

Instale as bibliotecas necessárias:

pip install pandas numpy scikit-learn surprise matplotlib seaborn

3. Conjunto de Dados

Um dos datasets mais famosos para recomendação é o MovieLens, com milhões de avaliações de filmes.
Para fins de exemplo, vamos usar a versão reduzida (MovieLens 100k).

import pandas as pd

# Carregando os dados MovieLens 100k
url = "https://raw.githubusercontent.com/justmarkham/DAT8/master/data/u.data"
colunas = ["user_id", "item_id", "rating", "timestamp"]
df = pd.read_csv(url, sep="\t", names=colunas)

print(df.head())

4. Recomendação Baseada em Popularidade

A forma mais simples de recomendar é listar os itens mais bem avaliados ou mais consumidos.

# Top filmes mais bem avaliados
top_filmes = df.groupby("item_id")["rating"].mean().sort_values(ascending=False).head(10)
print(top_filmes)

📌 Limitação: todos os usuários recebem a mesma recomendação.


5. Recomendação Baseada em Conteúdo

Aqui, analisamos as características do item (ex.: gênero, descrição, atores) para recomendar itens semelhantes.

5.1 Exemplo com similaridade de vetores

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

# Exemplo fictício de descrições de filmes
dados = {
    "titulo": ["Matrix", "John Wick", "O Senhor dos Anéis", "Harry Potter"],
    "descricao": [
        "ficção científica ação inteligência artificial",
        "ação combate assassino vingança",
        "fantasia aventura guerra épica",
        "magia fantasia escola bruxaria"
    ]
}
df_filmes = pd.DataFrame(dados)

# Vetorização com TF-IDF
vetor = TfidfVectorizer()
matriz = vetor.fit_transform(df_filmes["descricao"])

# Similaridade entre filmes
similaridade = cosine_similarity(matriz)

print(similaridade)

📌 Assim, conseguimos recomendar filmes com descrições semelhantes.


6. Filtragem Colaborativa

Na filtragem colaborativa, a ideia é usar preferências de usuários semelhantes.

6.1 Filtragem baseada em usuários

from surprise import Dataset, Reader, KNNBasic

# Carregar dataset MovieLens 100k para Surprise
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(df[["user_id", "item_id", "rating"]], reader)

# Algoritmo KNN para filtragem colaborativa
trainset = data.build_full_trainset()
sim_options = {"name": "cosine", "user_based": True}
modelo = KNNBasic(sim_options=sim_options)
modelo.fit(trainset)

# Recomendações para um usuário específico
usuario = 10
itens = trainset.all_items()
itens_ids = [trainset.to_raw_iid(i) for i in itens]

predicoes = [modelo.predict(usuario, iid) for iid in itens_ids]
predicoes = sorted(predicoes, key=lambda x: x.est, reverse=True)

print("Top recomendações para o usuário", usuario)
for pred in predicoes[:5]:
    print(pred.iid, pred.est)

6.2 Filtragem baseada em itens

sim_options = {"name": "cosine", "user_based": False}
modelo_itens = KNNBasic(sim_options=sim_options)
modelo_itens.fit(trainset)

predicoes = [modelo_itens.predict(usuario, iid) for iid in itens_ids]
predicoes = sorted(predicoes, key=lambda x: x.est, reverse=True)

print("Top recomendações por item para o usuário", usuario)
for pred in predicoes[:5]:
    print(pred.iid, pred.est)

📌 Aqui o modelo usa similaridade entre itens em vez de usuários.


7. Modelos Baseados em Fatores Latentes (SVD)

Uma técnica poderosa é decompor a matriz de avaliações em fatores latentes (ex.: gosto por ação, romance, comédia).

from surprise import SVD
from surprise.model_selection import cross_validate

# Modelo SVD
modelo_svd = SVD()
cross_validate(modelo_svd, data, measures=["RMSE", "MAE"], cv=5, verbose=True)

# Treinar e prever
modelo_svd.fit(trainset)
pred = modelo_svd.predict(usuario, 50)
print("Predição para usuário", usuario, "no filme 50:", pred.est)

📌 O SVD é usado em sistemas reais como o Netflix Prize.


8. Avaliação de Sistemas de Recomendação

As principais métricas incluem:

  • RMSE (Root Mean Squared Error) → mede erro das previsões.

  • MAE (Mean Absolute Error) → erro absoluto médio.

  • Precisão, Recall e F1-score → usados em top-N recomendações.

  • Cobertura → percentual de itens recomendados.

Exemplo com avaliação:

from surprise.model_selection import train_test_split
from surprise import accuracy

trainset, testset = train_test_split(data, test_size=0.2)
modelo_svd.fit(trainset)
predicoes = modelo_svd.test(testset)
accuracy.rmse(predicoes)

9. Construindo um Recomendador Híbrido

Podemos combinar as abordagens:

  • Popularidade + Colaborativo → garante recomendações iniciais.

  • Conteúdo + Fatores Latentes → aumenta diversidade.

  • Ensemble (média ponderada das predições).

# Exemplo híbrido simples
pred_pop = 3.5  # exemplo de baseline popularidade
pred_svd = modelo_svd.predict(usuario, 50).est
pred_final = 0.4 * pred_pop + 0.6 * pred_svd
print("Recomendação híbrida:", pred_final)

10. Conclusão

Os sistemas de recomendação são essenciais no mundo digital, guiando usuários em decisões de consumo e aumentando o engajamento.

Neste artigo, vimos como implementar diferentes tipos de recomendadores com Python:

  • Popularidade (básico).

  • Baseado em Conteúdo (TF-IDF + Similaridade).

  • Filtragem Colaborativa (usuário-item e SVD).

  • Modelos Híbridos.

Cada abordagem tem pontos fortes e limitações, e o segredo está em combinar métodos para obter maior personalização e qualidade.

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