Uma visão geral do sistema de recomendação e como implementá-lo do zero

Este blog inclui uma visão geral dos sistemas de recomendação, incluindo histórico, presente, futuro, diferentes categorias e, finalmente, codifica para processar uma recomendação de piada.

Foto de Edo Nugroho no Unsplash

Passado, presente e futuro:

Se olharmos para a história do sistema de recomendação, a ideia foi acesa entre 1992-1996. Antes que os sistemas de recomendação fossem imaginados antes mesmo de as pessoas falarem sobre filtragem colaborativa, isso era conhecido como personalização. Mas era tudo manual. Por exemplo: com o agente de viagens A que sabe que você está interessado em um safari, fica de olho no tipo de viagem que você gostaria, e não apenas em algo que alguém gostaria de fazer. Como um segundo exemplo: os compradores pessoais tinham alguns bancos de dados simples, nos quais podiam consultar o perfil das pessoas quando novos produtos chegavam e ter uma idéia de quem eles poderiam querer considerar que seria um bom candidato a um novo produto. No ano de 2007, a Netflix anunciou uma competição de 1 milhão de dólares e mudou o curso do sistema de recomendações. Atraiu pessoas de várias origens para participar da competição. Novos algoritmos surgiram junto com novas fórmulas matemáticas. A propósito, a biblioteca surpresa que utilizarei para fazer um sistema de recomendação de piadas é completamente desenvolvida, observando o trabalho de pesquisa publicado pela equipe vencedora do Prêmio Netflix. Enquanto esperamos, ainda há muitas coisas que não sabemos. O problema da recomendação temporal. Como faço para introduzir minhas recomendações não apenas em coisas como temporada nas quais as pessoas trabalham há algum tempo, mas para sequenciar o que você consumiu em seguida, uma vez que já consumiu isso. A recomendação para a educação, que é uma das áreas, era muito temporal.

Divisão ampla do sistema de recomendação:

Existem principalmente duas categorias de sistema de recomendação. 1. Filtragem colaborativa 2. Filtragem baseada em conteúdo

Filtragem colaborativa: a chave para a filtragem colaborativa é baseada no pressuposto de que as pessoas que concordaram no passado concordarão no futuro e que gostarão de tipos de itens semelhantes aos que gostaram no passado. As três principais categorias de filtragem colaborativa são: 1. Semelhança usuário-usuário 2. Item Semelhança de item 3. Baseado em modelo

Semelhança usuário-usuário e item-item

Filtragem com base em conteúdo: Os métodos de filtragem com base em conteúdo são baseados em uma descrição do item e em um perfil das preferências do usuário. Esses métodos são mais adequados para situações em que há dados conhecidos sobre um item (nome, localização, descrição etc.), mas não sobre o usuário.

Recomendação colaborativa x baseada em conteúdo

Pré-requisito

1. Python básico 2. Pandas básicos 3. Desejo de explorar a biblioteca surpresa 4. Keras (opcional)

Se você quiser pular diretamente para os códigos, acesse este link do github e encontre o bloco de notas jupyter.

Vou explicar os principais passos que segui ao resolver o problema, mas acredito firmemente que, se você estiver interessado na explicação completa do problema e interessado em saber sobre o uso da biblioteca surpresa, deverá dar uma olhada no repositório git depois de passar pelo blog.

Vamos começar. Algumas informações básicas sobre os dados que vamos usar.

Descrição de dados

Agora vou fazer um plano para abordar o problema em questão e avançar lentamente em direção à solução. Seguiremos cada etapa com trechos de código. 1. Coletando dados 2. Divisão de teste de trem 3. Estatísticas simples 4. Estruture dados para um formato compatível da biblioteca surpresa 5. Definindo a métrica de erro 6. Usando o modelo de linha de base 7. Experimente modelos diferentes 8. Resultado

Coletando dados

  1. Existem 3 planilhas do Excel fornecidas nos dados. Vamos fundi-los e formar um dataFrame python pandas combinado. Temos um total de 73421 usuários.
Mesclar todos os dados

2. Conforme descrito nas informações do conjunto de dados, as classificações 99 significam que o usuário não classificou essa piada. Removeremos esses registros e prepararemos os dados no formato ['user_id', 'joke_id', 'rating'].

Preparação de dados

Divisão de teste de trem

Usaremos o scikit-learn train_test_split e dividiremos os dados em 70 a 30. 70% dos dados estarão disponíveis para o trem e 30% para o teste

Estatísticas básicas

1. Classificação média por usuário e por piada

distribuição de classificação de todos os usuáriosdistribuição da classificação de todas as piadas

Estruturar dados para o formato compatível da biblioteca surpresa

Nós estruturaremos os dados de acordo com a biblioteca surpresa. Ele aceita os dados em um formato como ['usuário', 'piada', 'classificação']. Se tivéssemos um problema para recomendar filmes, teríamos estruturado os dados como ['usuário', 'filme', 'classificação'].

preparar dados no estilo de biblioteca surpresa

Definindo métrica de erro

usaremos o erro absoluto médio normalizado como métrica de erro.

Fórmula de erro absoluto médio normalizado (NAME)código para calcular o NMAE

Usando modelo de linha de base

Criaremos um modelo de linha de base usando o modelo de linha de base fornecido pela biblioteca surpresa. O modelo de linha de base fornece 0,2033 NMAE. Vamos tentar diferentes modelos de surpresa e combinar todos os resultados para obter melhores resultados.

Experimente modelos diferentes

  1. Modelo de linha de base KNN: Ele usa técnica baseada em similaridade para prever a classificação dos usuários para novas piadas. No nosso caso, o erro NMAE é 0,196

2. XGBoost em userAverageRating, jokeAverageRating, saída da Linha de Base e saída da Linha de Base KNN: Combinamos todas as saídas do modelo surpresa anterior e executamos um modelo de regressão XGB nos dados após o ajuste de hiperparâmetros. Aqui temos um resultado ligeiramente melhor de 0,1928 NMAE

3. Modelo SVD: O modelo SVD usa técnicas de fatoração matricial para resolver o problema de conclusão da matriz e prevê a classificação.

4. XGBoost em userAverageRating, jokeAverageRating, saída da Linha de Base, saída da Linha de Base KNN e saída do modelo SVD. Este modelo fornece 0,18 NMAE e é o melhor até agora.

5. Modelo com engenharia de recursos: Derivamos dois recursos fáceis para verificar seus efeitos no modelo. Um recurso é user_average + joke_avg-global_avg. Este modelo fornece o NMAE usual como 20.2. Eu também havia tentado outras técnicas de engenharia de recursos. Eles não funcionaram bem também.

6. Depp Aprendendo modelos usando keras: Como a engenharia de recursos não funcionou bem, estou planejando experimentar alguns modelos simples de rede neural usando keras. Eu tentei 3 modelos diferentes. Um com todos os recursos básicos, como média do usuário, média de piada - segundo e terceiro com todos os recursos, mas com arquiteturas diferentes. Um modelo possuía 14,9% de NMAE.

Resultados

Como podemos ver, o modelo Second_NN funciona melhor, pois possui o menor erro de teste.

Pensamentos finais

Como todos sabemos, nenhum modelo é perfeito. Há e sempre haverá espaço para melhorias neste modelo. Pode estar tentando diferentes técnicas de engenharia de recursos, alguns conselhos de especialistas em domínio e diferentes arquiteturas de redes neurais podem levar a melhores modelos.

Como segunda observação, posso dizer que os sistemas de recomendação estão crescendo hoje em dia. A biblioteca surpresa torna a vida dos desenvolvedores muito mais fácil, fornecendo toda a famosa implementação de modelo. Para criar um sistema básico de recomendações, é realmente útil. Acho que cumpri meu objetivo de escrever este blog e fiz com que os desenvolvedores soubessem sobre a biblioteca surpresa com uma pequena introdução à codificação. Todo o código está disponível aqui no git.