Sistema de Recomendação de Filmes — 7 Days of Code — Dia 04
Entre no meu GitHub para acessar e baixar o Jupyter Notebook usado
No quarto dia do 7 Days of Code o objetivo era mexer em um novo dataset. Ao invés de analisar os gastos da CEAPS, o objetivo foi criar um sistema de recomendação de filmes com os dados do Movie Lens.
Abrir os arquivos foi o primeiro desafio. Eu estava acostumado a trabalhar com arquivos em formato csv e o dataset do Movie Lens era um arquivo zipado que, depois de extraído, se apresentava em um formato desconhecido para mim. A vantagem de ter outras pessoas participando do 7 Days of Code é que se pode consultar como alguém resolve um problema que te deixou empacado. Assim, achei o GitHub do Kalel L. Martinho (Obrigado!!!) e verifiquei como ele subiu os arquivos.
Ele usava duas bibliotecas para abrir o arquivo. A primeira era o Zipifile
, para extrair e montar o arquivo e a segunda era a io
, que conseguia trabalhar com urls. Como já tinha baixado os arquivos para o computador, não precisei dessa última.
Eram três DataSets (Filmes, Usuários e Notas) e o nome das colunas não estavam identificadas. Novamente, usei o trabalho do Kalel L. Martinho para facilitar a renomeação e saber qual é qual. No fim, montei um DataSet único, que continha o id do usuário, id do filme visto, o título do filme que ele viu e a nota que ele tinha atribuído e acrescentei a esse DataSet a opinião de um novo usuário, que avaliaria filmes sugeridos de maneira aleatória com a nota de 1 a 5.
Depois disso, pivotei a lista de usuários com a de filmes. Isso significa que cruzei as informações dos usuários com as dos filmes, criando uma nova tabela que detalhava o perfil de filmes e notas. Assim, era possível ver que o usuário 1 tinha dado nota 3 para a versão de 20.000 Léguas Submarinas de 1954, nota 4 para o clássico 2001: Uma Odisseia no Espaço e que nunca viu 3 Ninjas — Aventura na Mega Mountain.
Assim, a partir da biblioteca sklearn.neighbors
é possível importar o NearestNeighbors
e aproximar os usuários com gosto para filmes similar. No exemplo do usuário 1, ele estaria mais próximo de quem deu nota 5 para 2001 e mais afastado de quem teria dado nota 1.
A partir disso fiz dois sistemas de recomendação.
Modelo 1: Vizinho Mais Próximo
O primeiro modelo procura o usuário com o gosto mais próximo a quem vai recomendar o filme. Como exemplo eu cadastrei nove filmes e agora o modelo procuraria quem tivesse gosto parecido com o meu.
Pode-se ver que o usuário 453 gosta do primeiro Star Wars tanto quanto eu, apesar da gente diferir em Debi e Lóide, que eu gosto muito e ele acha mediano. Fora isso é tudo muito próximo.
O passo seguinte foi criar um DataSet apenas com as notas que eu havia dado e, em seguida, acrescentar o do vizinho mais próximo. A partir dai, só filtrar pelos filmes mais bem avaliados por ele e que eu não tenha cadastrado: Trainspotting (1996), O Balconista (Clerks (1994)), Fargo (1996), Despedida em Las Vegas (Leaving Las Vegas (1995)) e Doze Macacos (Twelve Monkeys (1995))
Dos que eu assisti (Trainspotting, Fargo e Despedida em Las Vegas) eu gosto de todos.
Modelo 2: Filmes da minha Bolha
O segundo modelo recomenda filmes do grupo de pessoas que tem o gosto parecido com o meu.
E a lógica para desenvolver ele foi muito parecida. Cria se um DataSet com as minhas avaliações e, depois disso, vai se acrescentando as opiniões de todos os filmes dos que tem o gosto similar. No final, eu somo a nota dos cinco vizinhos mais próximos para todos os filmes e recomendo os melhores avaliados e mais vistos dentro dos usuários com o gosto parecido com o meu.
Nesse exemplo foi O Retorno de Jedi (Return of the Jedi (1983)) , Pulp Fiction (1994), O Império Contra Ataca (The Empire Strikes Back (1980)), Os Doze Macacos (Twelve Monkeys (1995)) e Cães De Aluguel (Reservoir Dogs (1992)).
O único que não assisti dessa lista foi Os Doze Macacos, que também aparece na primeira lista. Já vou fazer a pipoca.