Zephyrnet-logo

Een aanbevelingssysteem bouwen met Lenskit en het evalueren met nDCG in Python

Datum:


Introductie

Aanbevelingssystemen vormen de kern van elk goed bedrijf. Het is een zeer belangrijk hulpmiddel dat helpt om nieuwe klanten aan te trekken en bestaande klanten te behouden door hun keuzes te begrijpen en artikelen aan te bevelen die ze misschien leuk vinden. Een goed aanbevelingssysteem verhoogt de algehele ervaring van een gebruiker aanzienlijk, wat op zijn beurt het bedrijf helpt te groeien. Er zijn meerdere aanbevelingssystemen en er zijn veel grote bedrijven zoals Netflix, Spotify en Google die het nog steeds aan het bouwen en verbeteren zijn om de beste te worden. In dit artikel zullen we zien hoe Lenskit ons zal helpen een aanbevelingssysteem te bouwen en hoe verschillende aanbevelingsalgoritmen kunnen worden geëvalueerd om de beste te vinden met behulp van de nDCG-metriek.

LensKit Introductie

LensKit is eigenlijk een Python-bibliotheek met veel tools voor het maken en testen van aanbevelingssystemen. Het is gebaseerd op de Java-tegenhanger van LensKit en is overgezet naar de Python-taal. Met deze bibliotheek kunnen we verschillende aanbevelingsalgoritmen uitvoeren, trainen en evalueren. Met behulp van de LensKit-bibliotheek kunnen we effectief helpen voor beter onderzoek naar het domein van aanbeveling en het vinden van het beste algoritme in het proces.

Het heeft een ingebouwd scoremechanisme waarmee we aan elke aanbeveling een score kunnen toekennen en erachter kunnen komen hoe nauwkeurig ze zijn of zelfs de top 5 aanbevelingen kunnen vinden. LensKit heeft ook een groot aantal tools die kunnen worden gebruikt om nieuwe algoritmen te implementeren en te ontwerpen voor een aanbeveling.

Het volgende diagram legt de workflow van het model en de verschillende onderdelen van de toolkit uit. Nadat we het Item Recommender-systeem van de tool hebben gebruikt, kunnen we onze beste aanbevelingen doen. We kunnen onze eigen beoordelingsschalen kiezen en dienovereenkomstig beoordelingen geven aan alle datasets. Deze beoordeling wordt vergeleken na het splitsen van de dataset in test en trein en dienovereenkomstig wordt een score toegekend aan het algoritme.

We kunnen de bibliotheek in onze omgeving installeren met pip en de volgende regel code:

De bibliotheken installeren

!pip install LensKit !pip install surprise

Opmerking: we zullen de verrassingsbibliotheek gebruiken voor het laden van Dataset.

Een aanbevelingssysteem bouwen

We zullen een toolkit van Lenskit gebruiken voor nDCG-scores. De volledige vorm van nDCG is "Normalised Discounted Cumulative Gain", een maatstaf waarmee we de rangschikkingskwaliteit kunnen meten. Deze metriek is ontwikkeld om een ​​aanbevelingssysteem te evalueren en is compatibel met Python DataFrame. We zullen werken met de 3 onderstaande kolommen:

  • item
  • Gebruiker
  • Rating

We laden de dataset uit de scikit-surprise-bibliotheek en gaan dan verder met de gegevensverkenning

De gegevensset laden

Code:

import surprise panda's importeren als pd data = surprise.Dataset.load_builtin('ml-100k') ddir = surprise.get_dataset_dir() r_cols = ['user', 'item', 'rating', 'timestamp'] ratings = pd. read_csv(f'{ddir}/ml-100k/ml-100k/u.data', sep='t', names=r_cols, encoding='latin-1') ratings.head()

We kunnen zien dat we de kolommen gebruiker, item, beoordeling en tijdstempel hebben.

Het algoritme importeren en instantiëren

Code:

uit lenskit.datasets importeer ML100K uit lenskit importeer batch, topn, util, topn uit lenskit importeer crossfold als xf uit lenskit.algorithms importeer Recommender, als, item_knn als knn importeer panda's als pd %matplotlib inline algo_ii = knn.ItemItem(20) algo_als = als.BiasedMF(50)

We importeren de nodige methoden en initialiseren twee algoritmen:

  1. KNN
  2. Bevooroordeelde matrixfactorisatie

Nu zullen we een aanbevelingsfunctie maken en met behulp van de LensKit-tools kunnen we ook evalueren tijdens het maken om wat geheugenruimte te besparen. Om een ​​goede schatting te krijgen, zullen we eerst een aanbeveling genereren en deze uiteindelijk evalueren en vergelijken met het andere algoritme.

De volgende code helpt bij het genereren van de aanbevelingen in een modulair formaat en kan worden hergebruikt voor meerdere algoritmen. Het neemt de algoritmenaam, het algoritme, de trein- en testgegevens als invoerparameters.

Functiecode:

def eval(aname, algo, train, test): fittable = util.clone(algo) fittable = Recommender.adapt(fittable) fittable.fit(train) users = test.user.unique() recs = batch.recommend(fittable , gebruikers, 100) recs['Algoritme'] = aname return recs

Passend bij de aanbevelingen

We kunnen de functie gebruiken om aanbevelingen te genereren door een eenvoudige for-lus die de algoritmen doorloopt met dezelfde dataset voor een consistent scoremechanisme.

Code:

all_recs = [] test_data = [] voor trein, test in xf.partition_users(ratings[['user', 'item', 'rating']], 5, xf.SampleFrac(0.2)): test_data.append(test) all_recs.append(eval('ItemItem', algo_ii, trein, test)) all_recs.append(eval('ALS', algo_als, trein, test))

Output:

Opmerking: u kunt de waarschuwingen negeren omdat ze betrekking hebben op de runtime-problemen die worden veroorzaakt tijdens de runtime van de code vanwege een grote dataset

De aanbevelingen evalueren

Nu gaan we verder met de resultaten en vergelijken ze, maar eerst zullen we ze samenvoegen tot één DataFrame.

Code:

all_recs = pd.concat(all_recs, negeer_index=True) all_recs.head()

Output:

We kunnen zien dat hun output kan worden toegevoegd aan de dataset en we hebben een specifieke score voor elk item en het algoritme dat wordt gebruikt om die waarden aan te bevelen. Om betere resultaten te krijgen, kunnen we alle testgegevens samenvoegen tot één enkelvoudig dataframe.

Code:

test_data = pd.concat(test_data, negeer_index=True) test_data.head()

Output:

Nu zullen we een tol gebruiken die bekend staat als RecListAnalysis om onze aanbeveling te analyseren, wat ons zal helpen om al onze aanbevelingen en tests dienovereenkomstig op te sommen. We zullen dit gebruiken om de nDCG-waarden te evalueren.

Code:

rla = topn.RecListAnalysis() rla.add_metric(topn.ndcg) results = rla.compute(all_recs, test_data) results.head()

Output:

We hebben nDCG-waarden in een juiste DataFrame-indeling die is geëvalueerd door de twee algoritmen en we zullen evalueren welk algoritme ons de beste algemene nDCG-waarde heeft gegeven

Code:

resultaten.groupby('Algoritme').ndcg.mean()

Output:

Nu zullen we onze output visualiseren en het resultaat vinden.

Code:

resultaten.groupby('Algoritme').ndcg.mean().plot.bar()

Output:

Na analyse van de twee algoritmen, kunnen we ontdekken dat het ALS- of Alternative Least Square-algoritme de grotere nDCG-waarde heeft.

Conslusie

Dus in dit artikel hebben we twee algoritmen besproken en het betere aanbevelingsalgoritme ontdekt, maar dit kan worden geschaald naar meerdere algoritmen en meerdere datasets om het beste algemene algoritme te vinden of ten minste één algoritme dat meer dan één kan uitblinken. Voel je vrij om meer onderzoek te doen en me te taggen in toekomstige artikelen/code hierover en zal meer dan enthousiast zijn om door te gaan met dit werk.

Codelink:

https://colab.research.google.com/drive/1nVfcvEuNDbRNzM2jztctX8eTolPz3JZt?usp=sharing

Lenskit Documentatie link: https://lkpy.readthedocs.io/en/stable/

Als je dit artikel leuk vond, bekijk dan gerust meer artikelen hier.

Arnab Mondal (LinkedIn)

[e-mail beveiligd]

Senior SDE: Python-ontwikkelaar | Freelance technisch schrijver

spot_img

Laatste intelligentie

spot_img

Chat met ons

Hallo daar! Hoe kan ik u helpen?