Mahout - Recomendação

Este capítulo cobre a técnica popular de aprendizado de máquina chamada recommendation, seus mecanismos e como escrever um aplicativo que implementa a recomendação do Mahout.

Recomendação

Você já se perguntou como a Amazon surge com uma lista de itens recomendados para chamar sua atenção para um produto específico no qual você possa estar interessado!

Suponha que você queira comprar o livro “Mahout in Action” da Amazon:

Junto com o produto selecionado, a Amazon também exibe uma lista de itens recomendados relacionados, conforme mostrado abaixo.

Essas listas de recomendações são produzidas com a ajuda de recommender engines. O Mahout fornece mecanismos de recomendação de vários tipos, como:

  • recomendadores baseados no usuário,
  • recomendadores baseados em itens e
  • vários outros algoritmos.

Mecanismo de recomendação Mahout

Mahout tem um mecanismo de recomendação não distribuído e não baseado em Hadoop. Você deve passar um documento de texto com as preferências do usuário para os itens. E a saída desse mecanismo seriam as preferências estimadas de um determinado usuário para outros itens.

Exemplo

Considere um site que vende bens de consumo, como celulares, gadgets e seus acessórios. Se quisermos implementar os recursos do Mahout em tal site, podemos construir um mecanismo de recomendação. Este mecanismo analisa os dados de compra anteriores dos usuários e recomenda novos produtos com base nisso.

Os componentes fornecidos pelo Mahout para construir um mecanismo de recomendação são os seguintes:

  • DataModel
  • UserSimilarity
  • ItemSimilarity
  • UserNeighborhood
  • Recommender

A partir do armazenamento de dados, o modelo de dados é preparado e passado como uma entrada para o mecanismo de recomendação. O mecanismo de recomendação gera as recomendações para um determinado usuário. A seguir está a arquitetura do mecanismo de recomendação.

Arquitetura do motor de recomendação

Construindo um Recomendador usando Mahout

Aqui estão as etapas para desenvolver um recomendador simples:

Etapa 1: Criar objeto DataModel

O construtor de PearsonCorrelationSimilarityA classe requer um objeto de modelo de dados, que contém um arquivo que contém os detalhes de Usuários, Itens e Preferências de um produto. Aqui está o arquivo de modelo de dados de amostra:

1,00,1.0
1,01,2.0
1,02,5.0
1,03,5.0
1,04,5.0

2,00,1.0
2,01,2.0
2,05,5.0
2,06,4.5
2,02,5.0

3,01,2.5
3,02,5.0
3,03,4.0
3,04,3.0

4,00,5.0
4,01,5.0
4,02,5.0
4,03,0.0

o DataModelobjeto requer o objeto de arquivo, que contém o caminho do arquivo de entrada. Crie oDataModel objeto como mostrado abaixo.

DataModel datamodel = new FileDataModel(new File("input file"));

Etapa 2: Criar objeto UserSimilarity

Crio UserSimilarity objeto usando PearsonCorrelationSimilarity classe como mostrado abaixo:

UserSimilarity similarity = new PearsonCorrelationSimilarity(datamodel);

Passo 3: Crie o objeto UserNeighborhood

Este objeto calcula uma "vizinhança" de usuários como um determinado usuário. Existem dois tipos de vizinhança:

  • NearestNUserNeighborhood- Esta classe calcula uma vizinhança que consiste nos n usuários mais próximos de um determinado usuário. "Mais próximo" é definido pela semelhança de usuário fornecida.

  • ThresholdUserNeighborhood- Esta classe calcula uma vizinhança que consiste em todos os usuários cuja semelhança com o usuário determinado atende ou excede um determinado limite. Similaridade é definida por UserSimilarity fornecida.

Aqui estamos usando ThresholdUserNeighborhood e defina o limite de preferência para 3,0.

UserNeighborhood neighborhood = new ThresholdUserNeighborhood(3.0, similarity, model);

Etapa 4: Criar objeto de recomendação

Crio UserbasedRecomenderobjeto. Passe todos os objetos criados acima para seu construtor, conforme mostrado abaixo.

UserBasedRecommender recommender = new GenericUserBasedRecommender(model, neighborhood, similarity);

Etapa 5: Recomendar itens a um usuário

Recomende produtos a um usuário usando o método recommend () de Recommenderinterface. Este método requer dois parâmetros. O primeiro representa o id do usuário para o qual devemos enviar as recomendações, e o segundo representa o número de recomendações a serem enviadas. Aqui está o uso derecommender() método:

List<RecommendedItem> recommendations = recommender.recommend(2, 3);

for (RecommendedItem recommendation : recommendations) {
   System.out.println(recommendation);
 }

Example Program

Abaixo está um exemplo de programa para definir recomendações. Prepare as recomendações para o usuário com ID de usuário 2.

import java.io.File;
import java.util.List;

import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.ThresholdUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.similarity.PearsonCorrelationSimilarity;

import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.neighborhood.UserNeighborhood;

import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.UserBasedRecommender;

import org.apache.mahout.cf.taste.similarity.UserSimilarity;

public class Recommender {
   public static void main(String args[]){
      try{
         //Creating data model
         DataModel datamodel = new FileDataModel(new File("data")); //data
      
         //Creating UserSimilarity object.
         UserSimilarity usersimilarity = new PearsonCorrelationSimilarity(datamodel);
      
         //Creating UserNeighbourHHood object.
         UserNeighborhood userneighborhood = new ThresholdUserNeighborhood(3.0, usersimilarity, datamodel);
      
         //Create UserRecomender
         UserBasedRecommender recommender = new GenericUserBasedRecommender(datamodel, userneighborhood, usersimilarity);
        
         List<RecommendedItem> recommendations = recommender.recommend(2, 3);
			
         for (RecommendedItem recommendation : recommendations) {
            System.out.println(recommendation);
         }
      
      }catch(Exception e){}
      
   }
  }

Compile o programa usando os seguintes comandos:

javac Recommender.java
java Recommender

Ele deve produzir a seguinte saída:

RecommendedItem [item:3, value:4.5]
RecommendedItem [item:4, value:4.0]