Sharing is caring!

Um dos tópicos de estudo que sempre me chamou a atenção na área de Data Science são os sistemas de recomendação. Tais sistemas são amplamente utilizados por pequenas e grandes empresas para diversos fins, por exemplo a Amazon recomendando livros para seus clientes baseado em compras anteriores ou o YouTube e Netflix recomendando conteúdos novos a seus usuários antigos.

Por que usar?

Soluções populares

Existem inúmeras maneiras de criar um sistema de recomendação com algoritmos complexos de Machine Learning ou simplesmente com matemática básica, sendo as duas abordagens mais populares os Filtros Colaborativos e filtros baseados em conteúdo.

  1. Filtros colaborativos: Nesse tipo de filtro, para cada usuário é indicado um item baseado em um outro usuário com um “gosto similar”. Um exemplo fácil de entender, seriam duas pessoas, as quaisl chamaremos de Alice e Bob, com interesses semelhantes em séries Alice recentemente assistiu e gostou de Game of Thrones, porém Bob ainda não assistiu, mas assim que o sistema de recomendação aprendeu que Alice e Bob tem uma similaridade em seu perfil, o algoritmo se encarrega de recomendar Game of Thrones para Bob.
  2. Filtros baseados em conteúdo: Se a empresa tem características muito detalhadas sobre seus produtos, o filtro pode agir recomendando itens com características (tags) próximas. Por exemplo, se eu assisto o seriado Supernatural esse conteúdo pode conter as tags “terror”, “comédia e “teen”, então o algoritmo vai me recomendar um conteúdo com tags semelhantes como a série Lucifer.

Filtros Colaborativos

Neste artigo, vamos nos aprofundar em Filtros colaborativos nos seguintes tópicos:

  1. Como obter a similaridade entre usuários ou objetos.
  2. Entender o conceito matemático de similaridade com vetores.
  3. Como usar um modelo de filtro colaborativo.
  4. Implementar um sistema de recomendação básico com a biblioteca Surprise em Python.

Medindo similaridade

O conceito de similaridade é um complemento a distância. A distância entre dois pontos pode ser facilmente obtida utilizando a distância euclidiana, calculando o comprimento de uma linha reta que liga os dois pontos. Quando falamos de semelhança, ao invés de descobrir o quão longe dois pontos estão (distância euclidiana), nosso objetivo é descobrir o “quão perto” os pontos estão, por isso a similaridade também é chamada de “anti-distância”. O valor de similaridade geralmente é expresso em um número entre 0 e 1, em que quando o 0 é obtido significa que os objetos não apresentam similaridade e 1 significa semelhança total.

Similaridade de Cosseno

Agora vamos falar sobre a forma mais comum de medir a similaridade: a similaridade de cosseno. Se eu te der dois vetores U e V, onde U = (3,5) e V = (1,5), você pode me dizer facilmente o quão próximos esses vetores estão usando a distância euclidiana. Mas e se eu perguntar o quão similares são esses dois vetores?

01

Para medir a similaridade, basta calcular o ângulo entre os vetores., Qquanto menor o ângulo maior a similaridade., Ppara verificar, basta lembrar das propriedades da função cosseno:

Cos(0°) = 1

Cos(90°) = 0

Cos(180°) = -1

02.PNG

Ou seja, usando a similaridade de cosseno quando o ângulo entre os vetores se aproxima de 0°, os vetores são muito similares (paralelos com mesmo sentido), portanto a similaridade é 1. Quando o ângulo chega a 90°, os vetores são ortogonais e a similaridade é 0. Por fim, com um ângulo de 180° os vetores são opostos com similaridade -1. Considerando somente vetores não negativos (no primeiro quadrante do plano cartesiano), a similaridade varia somente entre 0 e 1.

Agora que entendemos o conceito, para calcular a similaridade basta usar a fórmula abaixo:

similarity = cos(ø) = A . B||A|| ||B||

Essa fórmula é uma velha conhecida de quem cursou Álgebra Linear e Geometria Analítica. Ela nos fala que o cosseno do ângulo entre dois vetores é igual ao produto escalar dos vetores dividido pelo produto do módulo deles.

Modelo de filtro Colaborativo

Agora que sabemos medir a similaridade entre dois vetores, podemos usar esse mesmo método para medir a semelhança entre usuários de uma plataforma x.ara tal, é proposto o seguinte problema:

  1. Nosso problema consiste na recomendação de filmes. Dada uma matriz i x j considerando as avaliações (rating) de i usuários para j filmes com o rating representado por um inteiro que varia de 1 a 5 quando o filme não foi classificado o rating é 0.
  2. Para cada usuário, o objetivo é recomendar uma série de filmes que ele não assistiu (rating = 0).
  3. Para cada filme j e usuário i que não assistiu o filme, encontramos um grupo de usuários u que é similar com o usuário i que já assistiu o filme j. Para cada usuário similar u, pegue a classificação do usuário para o filme j e multiplique pela semelhança de cosseno do usuário i com o u. Dividindo o resultado pelo número de usuários no conjunto u, temos a classificação média ponderada para o filme j.
  4. Agora basta ordenar os filmes pela média obtida para cada usuário e usar esse valor como estimativa para a avaliação que o usuário fará do filme, então recomenda-se os n primeiros filmes do ranking para cada usuário.

Essa técnica é muito semelhante ao algoritmo KNN, tanto que com algumas adaptações ele pode ser usado para resolver o problema de recomendação (que é o caso do Surprise que será explicado em breve).

Para exemplificar, imagine que eu não assisti ao filme Forest Gump, porém eu assisti e avaliei muitos outros filmes. Com isso, basta encontrar um grupo de usuários que assistiram filmes que eu também assisti e que tenham assistido Forest Gump. No caso, encontramos 2 usuários com um gosto parecido com o meu. Vamos supor que o primeiro tem uma semelhança de 90% comigo e tenha atribuído 5 estrelas ao filme, o segundo tem uma semelhança de 80% comigo e atribuiu 3 estrelas ao filme. Para estimar a minha classificação calcula-se a média ponderada (0.9 * 5 + 0.8 * 3) /2 = 3.45.

Surprise

Para não implementar tudo isso manualmente, existe uma biblioteca para Python chamada Surprise, que foi arquitetada para executar um modelo simples de sistema de recomendação. Existe também o MovieLens Dataset integrado com o Surprise, onde temos 100000 ratings de filmes com 1000 usuários e 1700 filmes.

Entãoprimeiro carregamos o dataset e importamos o Surprise no Python.

04
O próximo passo é calcular a semelhança de cosseno entre os filmes para realizar as recomendações usando a abordagem de filtragem colaborativa item-item. Apesar de não ser a abordagem usuário-usuário explicada anteriormente, o modelo é facilmente adaptável e a metodologia é a mesma.A vantagem desse método é a maior facilidade de implementar no MovieLens dataset, pois cada filme contém um vetor de todas as suas classificações, assim se calcula a semelhança de cosseno entre os vetores de cada filme e treinamos o modelo.

05

Agora para fazer as recomendações aos novos usuários usando o método build_anti_testset, podemos encontrar todos os pares de filmes do usuário no conjunto de treinamento em que o usuário não viu o filme e criar um “conjunto de testes” a partir dessas entradas. Em seguida, ordenamos e pegamos as três principais recomendações para cada usuário:

06

Para ver a saída, basta mapear o ID do filme com seu respectivo nome para cada usuário. No dataset no github do Surprise, pode-se encontrar esse código e outros que podem vir a ajudar.

07
Obtendo então as três indicações para cada usuário:

08

Como pode-se observar, cada usuário recebe recomendações personalizadas com base nas classificações passadas. Um ponto fraco da filtragem colaborativa é chamado de “could start”, que é caracterizado pela pergunta:

|Como vamos realizar recomendações a novos usuários da base?

A Netflix, por exemplo, mostra uma lista de catálogo e pede para o novo usuário escolher três filmes/séries do seu gosto (três é o total, podendo ser um filme e duas séries). Acredito que a partir desse momento ele passa a fazer as recomendações.

Conclusão

Neste artigo, vimos como implementar um filtro colaborativo do início ao fim, passando pelos primórdios da álgebra linear e similaridade de cosseno até um “hello world” da biblioteca Surprise com o algoritmo KNN. Logo, pode-se perceber que filtros colaborativos são ótimas ferramentas para Cientistas de Dados realizarem recomendações de produtos a usuários em uma base, potencializando a companhia em que trabalha como um todo e aumentando a afinidade do cliente com os conteúdos/produtos da empresa.

Este artigo foi baseado nas seguintes fontes (são ótimas leituras para quem quiser se aprofundar no tema.):

Recommender Systems through Collaborative Filtering by Manojit Nandi

Surprise Documentation

Recommendation Systems

MMD Book

Similaridade entre comentários by Octavio Santana


Ficou interessado? Quer receber mais conteúdos como esse no se e-mail?

Acesse esse link  fale um pouco mais sobre você e seus interesses, compartilharemos artigos, notícias e outras novidades direto no seu e-mail 🙂

Posted by:Gabriel Ghellere

Venho focando meus estudos em Data Science com ênfase em Machine Learning. Tenho como paixão desenvolvimento de bot traders para o mercado de criptomoedas e análise de risco, atualmente um dos meus projetos pessoais é a criação de bot traders com técnicas de machine learning para tomada de decisão. Contribua também para o projeto https://github.com/GabsGear/cpbr-2019-ktb

Deixe seu comentário