Laboratorio Recommender Systems
Recommender Systems Laboratorio
Programmazione di Applicazioni Data Intensive
Laurea in Ingegneria e Scienze Informatiche DISI – Università di Bologna, Cesena
Proff. Gianluca Moro, Giacomo Domeniconi, Roberto Pasolini
Laboratorio Recommender Systems
Suggerimenti d’acquisto personali: Recommendation
• L’obiettivo dell’esercitazione è fornire agli utenti del sito di e-commerce suggerimenti sui prodotti da acquistare
• Trattiamo nello specifico suggerimenti di acquisto personali, mirati allo specifico utente che sta visitando il sito – L’utente deve autenticarsi al sito per essere identificato
• Un sistema di recommendation analizza le relazioni esistenti tra utenti e prodotti (oggetti) per dare suggerimenti mirati
• Molti fornitori di prodotti e servizi (es. streaming audio/video) usano sistemi di recommendation più o meno sofisticati – Casi particolarmente noti sono ad es. Amazon e Netflix
Data Intensive Applications 2
Laboratorio Recommender Systems
Collaborative Filtering
• Il collaborative filtering (CF) prevede nuove associazioni utente-prodotto solamente in base a quelle già presenti – L’insieme delle associazioni forma la cosiddetta utility matrix
• Si ignorano le caratteristiche specifiche di utenti e prodotti
• I metodi di CF sono applicabili in molti contesti differenti – Il sistema di recommendation deve solamente distinguere tra loro
utenti e oggetti diversi, senza conoscerne i dettagli
• Servono ampie quantità di dati per generare buone previsioni – Gli utenti devono dare sufficienti valutazioni per ricevere consigli
– Difficoltà soprattutto all’avvio di un servizio (cold start)
Data Intensive Applications - Laboratorio sulla recommendation 3
Laboratorio Recommender Systems
Obiettivo: integrazione di recommendation nel sito di e-commerce
• Nel sito, vogliamo mostrare ad ogni utente autenticato una lista di prodotti a cui può essere interessato – Scegliamo di mostrare la lista
nella home page
• Vediamo dapprima come usare il software per le recommendation
• Vedremo poi come integrarne le funzioni nella webapp
Data Intensive Applications 4
Laboratorio Recommender Systems
Apache Mahout
• Mahout è una libreria Java per il machine learning in via di sviluppo, che fornisce (tra le altre cose) un framework per il CF – caricamento dati da varie fonti, diversi algoritmi di CF con parametri
impostabili, funzionalità per la stima dell’accuratezza
• Utenti e oggetti sono identificati in Mahout da numeri long – risparmio di tempo e memoria rispetto all’uso di oggetti Java completi,
di cui nel CF non si usano le informazioni
– nell’esercitazione, questi numeri corrisponderanno alle chiavi primarie di utenti e prodotti nel DB
• Le API fondamentali definite da Mahout sono – DataModel: insieme di dati da cui estrarre conoscenza per il CF
– Recommender: modello di conoscenza in grado di prevedere punteggi per coppie utente-oggetto senza rating
Data Intensive Applications 5
Laboratorio Recommender Systems
Progetto Eclipse per Mahout
• Abbiamo predisposto nel file MahoutLab.zip un progetto Eclipse per svolgere gli esercizi su Mahout – File > Import > Existing Gradle project
– Sono già dichiarate le dipendenze necessarie in build.gradle
• Nel package it.unibo.dia.rec sono già fornite alcune classi che saranno usate negli esercizi
• È inoltre fornita come utilità una classe Stopwatch per misurare e stampare il tempo impiegato ad eseguire i calcoli
Stopwatch.start(); // inizia a misurare il tempo esecuzione calcoli ... Stopwatch.print( "evaluation" );
output > ELAPSED TIME (evaluation): 6741 ms.
Data Intensive Applications - Laboratorio sulla recommendation 6
Laboratorio Recommender Systems
DataModel
• Un DataModel incapsula un insieme di dati su cui è possibile addestrare e valutare i recommender, costituito da: – gli insiemi di ID degli utenti e degli oggetti (prodotti) conosciuti
– le associazioni tra utenti e prodotti, ciascuna con un punteggio
• Mahout fornisce varie implementazioni di DataModel – FileDataModel per caricare i dati da un file
– GenericDataModel per incapsulare un insieme di array con i dati
– sottoclassi di JDBCDataModel per interfacciarsi ad un RDBMS: col metodo exportWithPrefs si scaricano tutti i dati in array in RAM
• Un DataModel fornisce diversi metodi per leggere i dati – getUserIDs restituisce un iteratore degli ID di tutti gli utenti
• LongPrimitiveIterator con metodi hasNext e nextLong
Data Intensive Applications 7
Laboratorio Recommender Systems
Esercizio 1: caricamento dati e-commerce
• Nella classe EStoreData, implementare il metodo loadReviewsInMemory che restituisce un DataModel con tutte le recensioni del database caricate in memoria
• Usare la sorgente dati fornita dal campo DB – Se non si sta svolgendo l’esercizio sui PC del laboratorio, cambiare se
necessario i parametri della connessione nel blocco static
• Utilizzare la vista predisposta estore.user_review, che presenta le seguenti colonne – user_id: ID dell’utente
– product_id: ID del prodotto
– score: valutazione (da 1 a 5 stelle)
• Questo metodo sarà utilizzato nei prossimi esercizi
Data Intensive Applications 8
Laboratorio Recommender Systems
Recommender
• Un Recommender rappresenta un modello di conoscenza in grado di predire associazioni utente-oggetto sconosciute
• Esistono varie implementazioni per diversi metodi di CF – UserBasedRecommender, ItemBasedRecommender, SVDRecommender (scomposizione matrici), …
• I calcoli per addestrare un Recommender sono eseguiti dal costruttore dell’oggetto, a cui va passato un DataModel – Oltre ad esso vanno passati i parametri specifici dell’implementazione
(es. misura di similarità e vicinato per UserBasedRecommender)
• Un Recommender può essere interrogato tramite i metodi – estimatePreference: voto previsto per utente ed oggetto dati
– recommend: N oggetti con voto previsto maggiore per utente dato
Data Intensive Applications 9
Laboratorio Recommender Systems
Valutazione di un recommender in Mahout
• I RecommenderEvaluator consentono di valutare l’accuratezza di un algoritmo CF tramite il metodo hold-out – Un DataModel è diviso in training e test set: sul primo si addestra un Recommender, sul secondo se ne valuta la bontà delle predizioni
– Le implementazioni calcolano diverse misure, ad esempio RMSRecommenderEvaluator calcola il Root Mean Square Error
• Al metodo evaluate che esegue la valutazione si passano: – il DataModel che verrà diviso in training e test set
– un DataModelBuilder per filtrare il training set (non lo usiamo)
– un RecommenderBuilder che deve costruire un Recommender col DataModel di training fornito da Mahout
– la percentuale di preferenze per utente da inserire nel training set
– la percentuale totale di preferenze da considerare (le usiamo tutte)
Data Intensive Applications 10
Laboratorio Recommender Systems
Esercizio 2: valutazione della recommendation sui dati di e-commerce
• Scrivere una classe main che esegua una valutazione del RMSE di un recommender sui dati del sito
• Caricare i dati attraverso il metodo di EStoreData implementato nell’esercizio precedente
• Come RecommenderBuilder, usare la classe EStoreRecommBuilder fornita – Questa utilizza l’algoritmo di fattorizzazione ALSWR, che si è
dimostrato tra i più efficaci ed efficienti sui dati trattati
• Eseguire prove con diverse percentuali di training – Usando il 70% dei dati per il training, si dovrebbe ottenere un RMSE
compreso tra 1 e 1,02 (a seconda della divisione casuale training/test)
Data Intensive Applications 11
Laboratorio Recommender Systems
Integrazione recommendation nell’applicazione di e-commerce
• Vediamo ora come integrare un sistema di recommendation nel nostro portale di e-commerce
• Si desidera che il sito suggerisca ad un qualsiasi utente autenticato quali articoli è più probabile che voglia acquistare, in base alle recensioni sue e di altri utenti
• Software come Mahout possono essere usati per calcolare i suggerimenti
• Quando richiesti, i suggerimenti di un utente dovrebbero essere ottenuti in tempi molto brevi (una frazione di secondo) per non rallentare il caricamento della pagina
Data Intensive Applications - Laboratorio sulla recommendation 12
Laboratorio Recommender Systems
Precalcolo delle recommendation
• Anche per un solo utente con un modello di conoscenza già costruito, il calcolo di recommendation può essere inefficiente – Molti secondi o minuti, a seconda della mole di dati e dell’algoritmo
• In alcuni casi tuttavia, le stesse recommendation calcolate ad una richiesta possono rimanere valide per le successive – Se da una richiesta all’altra non sono stati introdotti nuovi dati
(recensioni), non serve ripetere il calcolo
– Anche se sono disponibili alcuni dati nuovi, se la mole di quelli già presenti è grande, i risultati rimarrebbero (quasi) invariati
• Le recommendation potrebbero essere calcolate solo in alcune circostanze, presentando ad ogni richiesta i risultati già disponibili del calcolo più recente
Data Intensive Applications - Laboratorio sulla recommendation 13
Laboratorio Recommender Systems
Precalcolo delle recommendation: possibile approccio
• Si introduce nel database una tabella di suggerimenti precalcolati per tutti gli utenti – Ad ogni utente registrato associa un numero N di articoli suggeriti con
la valutazione prevista (per poterli ordinare dal più consigliato)
• Quando richiesti, i suggerimenti per un utente vengono letti dalla tabella in modo efficiente (è opportuno usare un indice)
• Periodicamente i suggerimenti vengono ricalcolati e salvati nella tabella, sostituendo i precedenti – Questa operazione può essere eseguita automaticamente ad intervalli
regolari (es. ogni giorno)
Data Intensive Applications - Laboratorio sulla recommendation 14
Laboratorio Recommender Systems
Integrazione di Mahout nell’applicazione e-commerce
• Sarebbe possibile usare Mahout all’interno dell’applicazione per ottenere un Recommender da usare per fornire i consigli
• Scegliamo però di salvare in una tabella le recommendation calcolate da Mahout le recommendation non van perse in caso di arresto dell’applicazione
• Nello specifico, scegliamo per ora di eseguire il calcolo delle recommendation in un processo separato dall’applicazione approccio generale: si potrebbero usare anche altri software che
vadano a scrivere i risultati sulla stessa tabella
non si consumano le risorse della webapp
Data Intensive Applications - Laboratorio sulla recommendation 15
Laboratorio Recommender Systems
Esercizio 3: tabella per il salvataggio delle recommendation
• Creare nel DB una tabella recommendation per salvare le recommendation precalcolate dal processo esterno
• La tabella deve contenere le seguenti colonne di tipo INTEGER (i nomi devono essere esattamente quelli indicati!) – oid: ID della recommendation (chiave primaria)
– user_oid: ID dell’utente a cui è rivolta
– product_oid: ID del prodotto suggerito
– score: punteggio (rating) previsto
• Per qualsiasi utente, sarà necessario ottenere tutte le relative recommendation in ordine per punteggio decrescente
• Creare sulla tabella un indice opportuno
Data Intensive Applications - Laboratorio sulla recommendation 16
Laboratorio Recommender Systems
Aggiornamento delle recommendation sul database
• Usiamo un programma esterno che salvi le recommendation nella tabella recommendation già predisposta
• Il programma deve – ottenere i dati degli acquisti dal database
– estrarre il modello di recommendation da essi
– usare il modello per calcolare N recommendation per ciascun utente
– salvare le recommendation sul database (cancellando quelle precedenti)
• In un contesto reale, si può programmare il server perché esegua periodicamente il programma – ad es. con Task Scheduler su Windows o cron su Linux
Data Intensive Applications - Laboratorio sulla recommendation 17
Laboratorio Recommender Systems
Esercizio 4: aggiornamento delle recommendation sul database
• Scrivere una classe main che aggiorni le recommendation sul database in base alle recensioni attuali
• Per il caricamento del DataModel dal database e la costruzione del Recommender utilizzare di nuovo le classi EStoreData e EStoreRecommBuilder – usare il metodo buildRecommender di quest’ultima
• Ottenere 10 suggerimenti per ogni utente del DataModel e salvarli in una List di oggetti Recommendation – costruttore: Recommendation(userId, itemId, score)
• Usare il metodo saveRecommendations già implementato nella classe EStoreData per salvare i dati nella tabella sul database (sostituendo eventuali già presenti)
Data Intensive Applications - Laboratorio sulla recommendation 18
Laboratorio Recommender Systems
Nuova versione della webapp con l’integrazione delle recommendation
• Lavoriamo ora su una versione modificata della webapp con la visualizzazione delle recommendation caricate da DB
• Rimuovere la versione precedente (se rimasta) – Nella scheda Servers (prospettiva Java EE), sotto il server configurato
(se presente), cliccare col destro sulla webapp e scegliere Remove
– Nel Project Explorer, cliccare col destro sulla radice del progetto precedente, scegliere Delete ed eliminare i contenuti anche dal disco
• Importare il progetto dal file Estore-recomm.zip – File > Import > Existing Projects into Workspace > Select archive file
• Testare l’esecuzione su Tomcat – clic destro su radice progetto > Run as > Run on server
Data Intensive Applications 19
Laboratorio Recommender Systems
Modifiche alla webapp per l’integrazione delle recommendation
• Abbiamo aggiunto al model dell’applicazione una classe Recommendation, con metodi get/set corrispondenti alle colonne dell’omonima tabella
• Un nuovo metodo del DAO getRecommendedProducts restituisce i prodotti da consigliare ad un dato utente, in ordine decrescente di punteggio – Sono restituiti direttamente Product, non Recommendation
• Vogliamo che nella home page, se un utente è autenticato, siano mostrati gli eventuali suggerimenti disponibili per lui
Data Intensive Applications 20
Laboratorio Recommender Systems
Esercizio 5: modifica servlet/JSP per mostrare prodotti suggeriti all’utente
• In FrontPageServlet reperire dal DB la lista dei prodotti suggeriti per l’utente, se autenticato
• Se un utente è autenticato, usare l’apposito metodo del DAO per reperire la lista e salvarla come attributo della richiesta
• Se nessun utente è autenticato, non fare nulla
• In FrontPage.jsp mostrare (se esiste e non è vuota) la lista dei prodotti suggeriti passata dalla servlet
• Ottenere l’eventuale lista dall’attributo salvato dalla servlet
• Mostrare un elenco con nomi dei prodotti e link alle relative pagine
Data Intensive Applications 21
Laboratorio Recommender Systems
Test delle recommendation
• Autenticarsi al sito con uno degli utenti predefiniti e verificare che le sue recommendation siano visibili in home page – Consultare i nomi disponibili dalla tabella estore.user: tutti (salvo
“user” e “admin”) hanno password vuota
• Opzionale: eseguire un ordine e assegnare punteggi ad alcuni prodotti con l’utente “user”, rigenerare le recommendation e verificare la bontà di quelle fornite per i prodotti ordinati
Data Intensive Applications 22