Este repositório foi criado para atender aos requisitos do Datathon da Fase 5 do curso de Machine Learning Engineering da FIAP. O desafio envolve a criação de um sistema de recomendação para a Globo, visando prever quais notícias os usuários do G1 irão consumir a seguir, com foco em técnicas de aprendizado de máquina.
- Eduardo Dias
- Felipe Langoni
- Python
- FastAPI
- Docker
- Docker Compose
O objetivo deste Datathon é desenvolver um modelo de sistema de recomendação para prever qual será a próxima notícia que um usuário do G1 lerá, considerando:
- A recência dos conteúdos.
- O desafio do cold-start, quando novos usuários ou itens não possuem informações suficientes para alimentar o sistema de recomendação.
O modelo deve ser treinado com dados sobre os usuários e seus históricos de leitura, criando uma API para fornecer recomendações personalizadas. Após isso, o modelo será empacotado em um container Docker e disponibilizado em um ambiente de produção (AWS, GCP).
Utilizamos um conjunto de dados fornecido pela Globo, que inclui informações sobre os usuários e seu histórico de acesso a notícias. O armazenamento e pré-processamento desses dados são feitos de forma eficiente para treinar o modelo de recomendação.
O modelo de recomendação considera diferentes abordagens, como:
- Content-Based Filtering: Recomendar notícias com base nas características dos próprios itens.
- Previsão do Próximo Item: Usar o histórico do usuário para prever o próximo item.
- Cold-Start: Resolver o problema do cold-start, oferecendo recomendações para usuários novos ou conteúdos sem histórico.
O modelo foi treinado com base no histórico de dados de usuários, considerando a recência das notícias e a relevância dos itens.
Desenvolvemos uma API com FastAPI para fornecer previsões e recomendações personalizadas aos usuários.
O projeto foi empacotado em um container Docker para facilitar o deployment e a escalabilidade da aplicação.
- Build do container Docker:
docker-compose up -d --buildEste endpoint fornece recomendações de notícias com base no histórico do usuário e na recência das notícias. Em casos de cold-start, ele recomenda as notícias mais populares.
Use o comando curl para testar a API localmente:
curl -X POST "http://localhost:8000/recommend" \
-H "Content-Type: application/json" \
-d '{
"history": ["13db0ab1-eea2-4603-84c4-f40a876c7400"],
"timestampHistory": [1708473600],
"recommendationSize": 3
}'{
"recommendations": [
{
"page": "d6620ce8-945f-4924-9b67-8bd3bffcdb7f",
"title": "Caso Vitória Gabrielly: STJ rejeita pedido da defesa para anulação de julgamento"
},
{
"page": "59ea1631-5702-4b66-9aae-703ce1ee9e56",
"title": "PF prende mais três suspeitos de envolvimento na ocultação dos corpos de Bruno e Dom"
},
{
"page": "9aa5e6c8-f7a9-46b4-839a-61a140210209",
"title": "PF faz operação contra..."
}
]
}Utilizamos uma abordagem de fatorização de matrizes, este sistema usa representações vetoriais para modelar usuários e itens.
Cada usuário e item é representado como um vetor em um espaço multidimensional. Por exemplo, se tivermos três características (por exemplo, gênero, avaliação, popularidade), um vetor de item pode ser assim: [0.8, 0.6, 0.9].
Para recomendar itens, calculamos a similaridade entre vetores de usuários e vetores de itens. Um método comum é a similaridade do cosseno, que mede o cosseno do ângulo entre dois vetores:
Com base nas pontuações de similaridade, podemos recomendar itens que são mais semelhantes às preferências do usuário.