Erstellen Sie eine Empfehlungs-Engine mit kollaborativer Filterung

Erstellen Sie eine Empfehlungs-Engine mit kollaborativer Filterung

Kollaboratives Filtern ist die am häufigsten verwendete Technik beim Erstellen intelligenter Empfehlungssysteme, mit denen Sie lernen können, bessere Empfehlungen abzugeben, wenn mehr Informationen über Benutzer gesammelt werden.

Die meisten Websites wie Amazon, YouTube und Netflix verwenden kollaborative Filterung als Teil ihrer ausgeklügelten Empfehlungssysteme. Mit dieser Technik können Sie Empfehlungen erstellen, die einem Benutzer Vorschläge auf der Grundlage der Vorlieben und Abneigungen ähnlicher Benutzer machen.

*In diesem Artikel erfahren Sie mehr über:*
  • Kollaboratives Filtern und es tippt

  • Daten, die zum Erstellen eines Empfehlers benötigt werden

  • In Python verfügbare Bibliotheken zum Erstellen von Empfehlern

  • Anwendungsfälle und Herausforderungen der kollaborativen Filterung

    *Kostenloser Bonus:* Link: [Klicken Sie hier, um Zugriff auf ein Kapitel aus Python Tricks: The Book zu erhalten], das Ihnen die Best Practices von Python anhand einfacher Beispiele zeigt, die Sie sofort anwenden können, um schöneren + Pythonic-Code zu schreiben.

Was ist kollaboratives Filtern?

Kollaboratives Filtern ist eine Technik, mit der Elemente herausgefiltert werden können, die einem Benutzer aufgrund von Reaktionen ähnlicher Benutzer gefallen könnten.

Es funktioniert, indem eine große Gruppe von Personen durchsucht und eine kleinere Gruppe von Benutzern mit einem ähnlichen Geschmack wie ein bestimmter Benutzer gefunden wird. Es betrachtet die Elemente, die ihnen gefallen, und kombiniert sie, um eine Rangliste mit Vorschlägen zu erstellen.

Es gibt viele Möglichkeiten, um zu entscheiden, welche Benutzer ähnlich sind, und ihre Auswahl zu kombinieren, um eine Liste mit Empfehlungen zu erstellen. Dieser Artikel zeigt Ihnen, wie das mit Python geht.

Der Datensatz

Um mit Empfehlungsalgorithmen zu experimentieren, benötigen Sie Daten, die eine Gruppe von Elementen und eine Gruppe von Benutzern enthalten, die auf einige der Elemente reagiert haben.

Die Reaktion kann explizit (Bewertung auf einer Skala von 1 bis 5, Vorlieben oder Abneigungen) oder implizit (Anzeigen eines Artikels, Hinzufügen zu einer Wunschliste, Zeitaufwand für einen Artikel) sein.

Während Sie mit solchen Daten arbeiten, sehen Sie sie meistens in Form einer Matrix , die aus den Reaktionen einer Gruppe von Benutzern auf einige Elemente aus einer Reihe von Elementen besteht. Jede Zeile würde die von einem Benutzer gegebenen Bewertungen enthalten, und jede Spalte würde die von einem Artikel erhaltenen Bewertungen enthalten. Eine Matrix mit fünf Benutzern und fünf Elementen könnte folgendermaßen aussehen:

Die Matrix zeigt fünf Benutzer, die einige der Elemente auf einer Skala von 1 bis 5 bewertet haben. Zum Beispiel hat der erste Benutzer dem dritten Element eine Bewertung von 4 gegeben.

In den meisten Fällen sind die Zellen in der Matrix leer, da Benutzer nur einige Elemente bewerten. Es ist höchst unwahrscheinlich, dass jeder Benutzer jeden verfügbaren Artikel bewertet oder darauf reagiert. Eine Matrix mit größtenteils leeren Zellen heißt spärlich , und das Gegenteil davon (eine meist gefüllte Matrix) heißt dicht .

Es wurden viele Datensätze gesammelt und der Öffentlichkeit für Forschung und Benchmarking zur Verfügung gestellt. Hier ist eine Liste mit hochwertigen Datenquellen, aus der Sie auswählen können.

Der beste Einstieg wäre der von GroupLens Research gesammelte Datensatz MovieLens. Insbesondere der MovieLens 100k-Datensatz ist ein stabiler Benchmark-Datensatz mit 100.000 Bewertungen von 943 Benutzern für 1682 Filme, wobei jeder Benutzer mindestens 20 Filme bewertet hat.

Dieser Datensatz besteht aus vielen Dateien, die Informationen zu den Filmen, den Benutzern und den Bewertungen enthalten, die Benutzer den von ihnen angesehenen Filmen gegeben haben. Diejenigen, die von Interesse sind, sind die folgenden:

  • + u.item +: die Liste der Filme

  • + u.data +: die Liste der von Benutzern abgegebenen Bewertungen

Die Datei "+ u.data +", die die Bewertungen enthält, ist eine durch Tabulatoren getrennte Liste von Benutzer-ID, Artikel-ID, Bewertung und Zeitstempel. Die ersten Zeilen der Datei sehen folgendermaßen aus:

Wie oben gezeigt, gibt die Datei an, welche Bewertung ein Benutzer einem bestimmten Film gegeben hat. Diese Datei enthält 100.000 solcher Bewertungen, die verwendet werden, um die Bewertungen der Filme vorherzusagen, die von den Benutzern nicht gesehen werden.

Schritte zur kollaborativen Filterung

Um ein System zu erstellen, das Benutzern basierend auf den Einstellungen anderer Benutzer automatisch Elemente empfehlen kann, müssen Sie zunächst ähnliche Benutzer oder Elemente finden. Der zweite Schritt besteht darin, die Bewertungen der Elemente vorherzusagen, die noch nicht von einem Benutzer bewertet wurden. Sie benötigen also die Antworten auf diese Fragen:

  • Wie bestimmen Sie, welche Benutzer oder Elemente einander ähnlich sind?

  • Wenn Sie wissen, welche Benutzer ähnlich sind, wie bestimmen Sie die Bewertung, die ein Benutzer einem Artikel geben würde, basierend auf den Bewertungen ähnlicher Benutzer? *Wie messen Sie die Genauigkeit der von Ihnen berechneten Bewertungen?

Die ersten beiden Fragen haben keine einzigen Antworten. Die kollaborative Filterung ist eine Familie von Algorithmen, bei denen es mehrere Möglichkeiten gibt, ähnliche Benutzer oder Elemente zu finden und die Bewertung anhand der Bewertungen ähnlicher Benutzer zu berechnen. Abhängig von den von Ihnen getroffenen Entscheidungen erhalten Sie eine Art kollaborativen Filteransatz. In diesem Artikel werden die verschiedenen Ansätze zur Ermittlung von Ähnlichkeiten und zur Vorhersage von Bewertungen vorgestellt.

Eine wichtige Sache, die Sie beachten sollten, ist, dass bei einem Ansatz, der ausschließlich auf kollaborativer Filterung basiert, die Ähnlichkeit nicht anhand von Faktoren wie dem Alter der Benutzer, dem Genre des Films oder anderen Daten über Benutzer oder Elemente berechnet wird. Sie wird nur auf der Grundlage der Bewertung (explizit oder implizit) berechnet, die ein Benutzer einem Artikel gibt. Beispielsweise können zwei Benutzer als ähnlich angesehen werden, wenn sie zehn Filmen die gleichen Bewertungen geben, obwohl es einen großen Altersunterschied gibt.

Die dritte Frage zur Messung der Genauigkeit Ihrer Vorhersagen enthält mehrere Antworten. Dazu gehören Fehlerberechnungstechniken, die an vielen Stellen verwendet werden können, und nicht nur Empfehlungen, die auf kollaborativer Filterung basieren.

Einer der Ansätze zur Messung der Genauigkeit Ihres Ergebnisses ist der Root Mean Square Error (RMSE), bei dem Sie Bewertungen für einen Testdatensatz von Benutzer-Element-Paaren vorhersagen, deren Bewertungswerte bereits bekannt sind. Die Differenz zwischen dem bekannten Wert und dem vorhergesagten Wert wäre der Fehler. Quadrieren Sie alle Fehlerwerte für den Testsatz, ermitteln Sie den Durchschnitt (oder Mittelwert) und ziehen Sie dann die Quadratwurzel dieses Durchschnitts, um den RMSE zu erhalten.

Eine weitere Metrik zur Messung der Genauigkeit ist der mittlere absolute Fehler (Mean Absolute Error, MAE), bei dem Sie die Fehlergröße ermitteln, indem Sie den absoluten Wert ermitteln und dann den Durchschnitt aller Fehlerwerte ermitteln.

Sie müssen sich an dieser Stelle nicht um die Details von RMSE oder MAE kümmern, da diese als Teil verschiedener Pakete in Python verfügbar sind und Sie später in diesem Artikel sehen werden.

Betrachten wir nun die verschiedenen Arten von Algorithmen in der Familie der kollaborativen Filterung.

Speicherbasiert

Die erste Kategorie umfasst speicherbasierte Algorithmen, bei denen statistische Techniken auf den gesamten Datensatz angewendet werden, um die Vorhersagen zu berechnen.

Um die Bewertung* R zu finden, die ein Benutzer U einem Element I * geben würde, umfasst der Ansatz:

*Suche nach Benutzern ähnlich* U *, die den Artikel *I* bewertet haben
*Die Berechnung der Bewertung* R *basiert auf den Bewertungen der Benutzer, die im vorherigen Schritt gefunden wurden

Sie werden sie in den folgenden Abschnitten ausführlich sehen.

So finden Sie ähnliche Benutzer anhand von Bewertungen

Um das Konzept der Ähnlichkeit zu verstehen, erstellen wir zunächst einen einfachen Datensatz.

Die Daten umfassen vier Benutzer* A , *B , C und D , die zwei Filme bewertet haben. Die Bewertungen werden in Listen gespeichert, und jede Liste enthält zwei Zahlen, die die Bewertung jedes Films angeben:

*Bewertungen von* A * sind `+ [1.0, 2.0] +`.
*Bewertungen von* B * sind `+ [2.0, 4.0] +`.
*Bewertungen von* C * sind `+ [2.5, 4.0] +`.
*Bewertungen von* D *sind `+ [4.5, 5.0] +`.

Um mit einem visuellen Hinweis zu beginnen, zeichnen Sie die Bewertungen von zwei Filmen, die von den Benutzern gegeben wurden, in ein Diagramm und suchen Sie nach einem Muster. Die Grafik sieht folgendermaßen aus:

Punkte

In der obigen Grafik stellt jeder Punkt einen Benutzer dar und wird gegen die Bewertungen aufgetragen, die sie zwei Filmen gegeben haben.

Ein Blick auf den Abstand zwischen den Punkten scheint ein guter Weg zu sein, um die Ähnlichkeit abzuschätzen, oder? Sie können den Abstand anhand der Formel für den euklidischen Abstand zwischen zwei Punkten ermitteln. Sie können die in + scipy + verfügbare Funktion verwenden, wie im folgenden Programm gezeigt:

>>>

>>> from scipy import spatial

>>> a = [1, 2]
>>> b = [2, 4]
>>> c = [2.5, 4]
>>> d = [4.5, 5]

>>> spatial.distance.euclidean(c, a)
2.5
>>> spatial.distance.euclidean(c, b)
0.5
>>> spatial.distance.euclidean(c, d)
2.23606797749979

Wie oben gezeigt, können Sie + scipy.spatial.distance.euclidean + verwenden, um den Abstand zwischen zwei Punkten zu berechnen. Die Verwendung zur Berechnung des Abstands zwischen den Bewertungen von* A , *B und D zu denen von C zeigt, dass die Bewertungen von C in Bezug auf die Entfernung denen von B am nächsten kommen .

Sie können sehen, dass Benutzer C B am nächsten ist, selbst wenn Sie sich das Diagramm ansehen. Aber wem ist C näher, nur von A und D ?

Man könnte sagen, C ist in Bezug auf die Entfernung näher an D . Aber wenn man sich die Rangliste ansieht, scheint es, dass die Auswahl von C mehr mit der von A als mit D übereinstimmt, da sowohl A als auch C den zweiten Film fast doppelt so sehr mögen wie den erster Film, aber D mag beide Filme gleich.

Was können Sie also verwenden, um solche Muster zu identifizieren, die die euklidische Distanz nicht kann? Kann der Winkel zwischen den Linien, die die Punkte mit dem Ursprung verbinden, verwendet werden, um eine Entscheidung zu treffen? Sie können den Winkel zwischen den Linien, die den Ursprung des Diagramms mit den jeweiligen Punkten verbinden, wie folgt betrachten:

Zwei dimensionale Vektoren

Die Grafik zeigt vier Linien, die jeden Punkt mit dem Ursprung verbinden. Die Linien für A und B fallen zusammen und machen den Winkel zwischen ihnen zu Null.

Wenn der Winkel zwischen den Linien vergrößert wird, nimmt die Ähnlichkeit ab, und wenn der Winkel Null ist, sind sich die Benutzer sehr ähnlich.

Um die Ähnlichkeit anhand des Winkels zu berechnen, benötigen Sie eine Funktion, die eine höhere Ähnlichkeit oder einen kleineren Abstand für einen niedrigeren Winkel und eine geringere Ähnlichkeit oder einen größeren Abstand für einen höheren Winkel zurückgibt. Der Kosinus eines Winkels ist eine Funktion, die von 1 auf -1 abnimmt, wenn der Winkel von 0 auf 180 zunimmt.

Sie können den Kosinus des Winkels verwenden, um die Ähnlichkeit zwischen zwei Benutzern zu ermitteln. Je höher der Winkel ist, desto niedriger ist der Kosinus und desto geringer ist die Ähnlichkeit der Benutzer. Sie können den Kosinuswert des Winkels auch umkehren, um den Kosinusabstand zwischen den Benutzern zu ermitteln, indem Sie ihn von 1 subtrahieren.

+ scipy + hat eine Funktion, die den Kosinusabstand von Vektoren berechnet. Es gibt einen höheren Wert für einen höheren Winkel zurück:

>>>

>>> from scipy import spatial
>>> a = [1, 2]
>>> b = [2, 4]
>>> c = [2.5, 4]
>>> d = [4.5, 5]

>>> spatial.distance.cosine(c,a)
0.004504527406047898

>>> spatial.distance.cosine(c,b)
0.004504527406047898

>>> spatial.distance.cosine(c,d)
0.015137225946083022

>>> spatial.distance.cosine(a,b)
0.0

Der niedrigere Winkel zwischen den Vektoren von C und A ergibt einen niedrigeren Kosinusabstandswert. Wenn Sie Benutzerähnlichkeiten auf diese Weise bewerten möchten, verwenden Sie den Kosinusabstand.

*Hinweis:* Im obigen Beispiel werden nur zwei Filme berücksichtigt, was die Visualisierung der Bewertungsvektoren in zwei Dimensionen erleichtert. Dies dient nur zur Vereinfachung der Erklärung.

Reale Anwendungsfälle mit mehreren Elementen würden mehr Dimensionen in Bewertungsvektoren beinhalten. Vielleicht möchten Sie auch in die Mathematik von cosine ähnlich gehen.

Beachten Sie, dass Benutzer A und B in der Kosinus-Ähnlichkeitsmetrik trotz unterschiedlicher Bewertungen als absolut ähnlich angesehen werden. Dies ist tatsächlich ein häufiges Ereignis in der realen Welt, und die Benutzer wie der Benutzer A sind das, was Sie als harte Bewerter bezeichnen können. Ein Beispiel wäre ein Filmkritiker, der immer niedrigere Bewertungen als der Durchschnitt abgibt, aber die Rangfolge der Elemente in seiner Liste wäre ähnlich wie bei den durchschnittlichen Bewertern wie B .

Um solche individuellen Benutzereinstellungen zu berücksichtigen, müssen Sie alle Benutzer auf die gleiche Ebene bringen, indem Sie ihre Vorurteile entfernen. Sie können dies tun, indem Sie die durchschnittliche Bewertung dieses Benutzers für alle Elemente von jedem von diesem Benutzer bewerteten Element abziehen. So würde es aussehen:

*Für Benutzer* A * hat der Bewertungsvektor "+ [1, 2] +" den Durchschnitt "+ 1,5 +". Wenn Sie von jeder Bewertung "+ 1,5 +" subtrahieren, erhalten Sie den Vektor "+ [- 0,5, 0,5] +".
*Für Benutzer* B *hat der Bewertungsvektor "+ [2, 4] +" den Durchschnitt "+ 3 +". Wenn Sie von jeder Bewertung "+ 3 +" subtrahieren, erhalten Sie den Vektor "+ [- 1, 1] +".

Auf diese Weise haben Sie den Wert der von jedem Benutzer abgegebenen Durchschnittsbewertung auf 0 geändert. Versuchen Sie, dasselbe für die Benutzer* C und D *zu tun, und Sie werden sehen, dass die Bewertungen jetzt so angepasst werden, dass sie für alle Benutzer einen Durchschnitt von 0 ergeben, wodurch sie alle auf das gleiche Niveau gebracht werden und ihre Vorurteile beseitigt werden.

Der Cosinus des Winkels zwischen den eingestellten Vektoren wird als* zentrierter Cosinus *bezeichnet. Dieser Ansatz wird normalerweise verwendet, wenn in den Vektoren viele Werte fehlen und Sie einen gemeinsamen Wert platzieren müssen, um die fehlenden Werte aufzufüllen.

Das Auffüllen der fehlenden Werte in der Bewertungsmatrix mit einem zufälligen Wert kann zu Ungenauigkeiten führen. Eine gute Wahl, um die fehlenden Werte zu füllen, könnte die durchschnittliche Bewertung jedes Benutzers sein, aber die ursprünglichen Durchschnittswerte von Benutzer* A und B sind "+ 1,5 " bzw. " 3 " und füllen alle leeren Werte aus Werte von* A *mit ` 1.5 +` und Werte von B *mit` + 3 + `würden sie zu unterschiedlichen Benutzern machen.

Nach dem Anpassen der Werte beträgt der* zentrierte * Durchschnitt beider Benutzer jedoch "+ 0 ", wodurch Sie die Vorstellung erfassen können, dass das Element für beide Benutzer über- oder unterdurchschnittlich ist, wobei alle fehlenden Werte in den Vektoren beider Benutzer vorhanden sind der gleiche Wert ` 0 +`.

Euklidischer Abstand und Kosinusähnlichkeit sind einige der Ansätze, mit denen Sie Benutzer finden können, die einander ähnlich sind, und sogar Elemente, die einander ähnlich sind. (Die oben verwendete Funktion berechnet den Kosinusabstand. Subtrahieren Sie den Abstand von 1, um die Kosinusähnlichkeit zu berechnen.)

*Hinweis:* Die Formel für den zentrierten Kosinus ist dieselbe wie für den Pearson-Korrelationskoeffizienten. Sie werden feststellen, dass viele Ressourcen und Bibliotheken in Empfehlungen die Implementierung des zentrierten Cosinus als Pearson-Korrelation bezeichnen.

So berechnen Sie die Bewertungen

Nachdem Sie eine Liste von Benutzern ermittelt haben, die einem Benutzer U ähnlich sind, müssen Sie die Bewertung R berechnen, die U einem bestimmten Element I geben würde. Genau wie bei der Ähnlichkeit können Sie dies auch hier auf verschiedene Arten tun.

Sie können vorhersagen, dass die Bewertung R eines Benutzers für einen Artikel I nahe am Durchschnitt der Bewertungen liegt, die I von den Top 5 oder Top 10 Benutzern gegeben wurden, die U am ähnlichsten sind. Die mathematische Formel für die durchschnittliche Bewertung durch n Benutzer würde folgendermaßen aussehen:

Formula für durchschnittliche Bewertung

Diese Formel zeigt, dass die durchschnittliche Bewertung, die von den n ähnlichen Benutzern gegeben wird, gleich der Summe der von ihnen gegebenen Bewertungen geteilt durch die Anzahl der ähnlichen Benutzer ist, die n ist.

Es wird Situationen geben, in denen die n ähnlichen Benutzer, die Sie gefunden haben, dem Zielbenutzer U nicht gleich ähnlich sind. Die Top 3 von ihnen sind möglicherweise sehr ähnlich, und der Rest ist U möglicherweise nicht so ähnlich wie die Top 3. In diesem Fall könnten Sie einen Ansatz in Betracht ziehen, bei dem die Bewertung des ähnlichsten Benutzers wichtiger ist als die des zweitähnlichsten Benutzers und so weiter. Der gewichtete Durchschnitt kann uns dabei helfen.

Beim gewichteten Durchschnittsansatz multiplizieren Sie jede Bewertung mit einem Ähnlichkeitsfaktor (der angibt, wie ähnlich die Benutzer sind). Durch Multiplizieren mit dem Ähnlichkeitsfaktor fügen Sie den Bewertungen Gewichte hinzu. Je schwerer das Gewicht, desto wichtiger wäre die Bewertung.

Der Ähnlichkeitsfaktor, der als Gewichte wirken würde, sollte die Umkehrung des oben diskutierten Abstands sein, da ein geringerer Abstand eine höhere Ähnlichkeit impliziert. Sie können beispielsweise den Kosinusabstand von 1 subtrahieren, um die Kosinusähnlichkeit zu erhalten.

Mit dem Ähnlichkeitsfaktor S für jeden Benutzer ähnlich dem Zielbenutzer U können Sie den gewichteten Durchschnitt mit folgender Formel berechnen:

Formula für gewichtete Durchschnittsbewertung

In der obigen Formel wird jede Bewertung mit dem Ähnlichkeitsfaktor des Benutzers multipliziert, der die Bewertung abgegeben hat. Die endgültige vorhergesagte Bewertung durch Benutzer U entspricht der Summe der gewichteten Bewertungen geteilt durch die Summe der Gewichte.

*Hinweis:* Wenn Sie sich fragen, warum die Summe der gewichteten Bewertungen durch die Summe der Gewichte und nicht durch _n_ geteilt wird, beachten Sie Folgendes: In der vorherigen Formel des Durchschnitts, in der Sie durch _n_ geteilt haben, den Wert von das Gewicht war 1.

Der Nenner ist immer die Summe der Gewichte, wenn es darum geht, Durchschnittswerte zu finden, und im Fall des normalen Durchschnitts bedeutet das Gewicht 1, dass der Nenner gleich n wäre.

Bei einem gewichteten Durchschnitt berücksichtigen Sie die Bewertungen ähnlicher Benutzer in der Reihenfolge ihrer Ähnlichkeit stärker.

Jetzt wissen Sie, wie Sie ähnliche Benutzer finden und Bewertungen anhand ihrer Bewertungen berechnen. Es gibt auch eine Variante der kollaborativen Filterung, bei der Sie Bewertungen vorhersagen, indem Sie einander ähnliche Elemente anstelle von Benutzern suchen und die Bewertungen berechnen. Über diese Variante erfahren Sie im nächsten Abschnitt.

Benutzerbasierte oder objektbasierte kollaborative Filterung

Die Technik in den oben erläuterten Beispielen, bei der die Bewertungsmatrix verwendet wird, um ähnliche Benutzer basierend auf den von ihnen abgegebenen Bewertungen zu finden, wird als benutzerbasierte oder Benutzer-Benutzer-Kollaborationsfilterung bezeichnet. Wenn Sie die Bewertungsmatrix verwenden, um ähnliche Elemente basierend auf den Bewertungen zu finden, die ihnen von Benutzern gegeben wurden, wird der Ansatz als artikelbasierte oder kollaborative Artikel-Artikel-Filterung bezeichnet.

Die beiden Ansätze sind mathematisch ziemlich ähnlich, aber es gibt einen konzeptionellen Unterschied zwischen den beiden. So vergleichen sich die beiden:

  • Benutzerbasiert: Für einen Benutzer U , bei dem eine Reihe ähnlicher Benutzer anhand von Bewertungsvektoren ermittelt wird, die aus bestimmten Artikelbewertungen bestehen, wird die Bewertung für einen Artikel I , der nicht bewertet wurde, durch Auswahl ermittelt aus N Benutzern aus der Ähnlichkeitsliste, die den Artikel I bewertet haben und die Bewertung basierend auf diesen N Bewertungen berechnen.

  • Artikelbasiert: Für einen Artikel I mit einer Reihe ähnlicher Artikel, die anhand von Bewertungsvektoren ermittelt wurden, die aus empfangenen Benutzerbewertungen bestehen, wird die Bewertung eines Benutzers U , der sie nicht bewertet hat, durch Auswahl ermittelt Heraus N Elemente aus der Ähnlichkeitsliste, die von U bewertet wurden, und Berechnung der Bewertung basierend auf diesen N Bewertungen.

Die objektbasierte kollaborative Filterung wurde von Amazon entwickelt. In einem System, in dem mehr Benutzer als Elemente vorhanden sind, ist die artikelbasierte Filterung schneller und stabiler als die benutzerbasierte. Dies ist effektiv, da sich die durchschnittliche Bewertung eines Artikels normalerweise nicht so schnell ändert wie die durchschnittliche Bewertung, die ein Benutzer verschiedenen Artikeln gegeben hat. Es ist auch bekannt, dass es bei spärlicher Bewertungsmatrix eine bessere Leistung als der benutzerbasierte Ansatz erbringt.

Obwohl der artikelbasierte Ansatz für Datensätze mit Browsing- oder Unterhaltungselementen wie MovieLens eine schlechte Leistung erbringt, scheinen die Empfehlungen für die Zielbenutzer sehr offensichtlich zu sein. Solche Datensätze erzielen bessere Ergebnisse mit Matrixfaktorisierungstechniken, die Sie im nächsten Abschnitt sehen werden, oder mit hybriden Empfehlern, die auch den Inhalt der Daten wie das Genre mithilfe von https://en.wikipedia.org/wiki berücksichtigen/Recommender_system # Inhaltsbasierte Filterung [inhaltsbasierte Filterung].

Sie können die Bibliothek Surprise verwenden, um schnell mit verschiedenen Empfehlungsalgorithmen zu experimentieren. (Mehr dazu später in diesem Artikel.)

Modellbasiert

Die zweite Kategorie umfasst die modellbasierten Ansätze, die einen Schritt zum Reduzieren oder Komprimieren der großen, aber spärlichen Benutzerelementmatrix umfassen. Zum Verständnis dieses Schritts kann ein grundlegendes Verständnis der Dimensionsreduktion sehr hilfreich sein.

Reduzierung der Dimensionalität

In der Benutzerelementmatrix gibt es zwei Dimensionen:

  1. Die Anzahl der Benutzer

  2. Die Anzahl der Elemente

Wenn die Matrix größtenteils leer ist, kann das Reduzieren von Dimensionen die Leistung des Algorithmus sowohl räumlich als auch zeitlich verbessern. Sie können dazu verschiedene Methoden wie Matrixfaktorisierung oder Autoencoder verwenden.

*Matrixfaktorisierung* kann als Zerlegung einer großen Matrix in ein Produkt kleinerer angesehen werden. Dies ähnelt der Faktorisierung von ganzen Zahlen, wobei "+ 12 +" als "+6 x 2 +" oder "+4 x 3 +" geschrieben werden kann. Im Fall von Matrizen kann eine Matrix *A* mit den Dimensionen "+ m x n +" auf ein Produkt aus zwei Matrizen *X* und *Y* mit den Dimensionen "+ m x p +" bzw. "+ p x n +" reduziert werden.
*Hinweis:* Bei der Matrixmultiplikation kann eine Matrix *X* nur dann mit *Y* multipliziert werden, wenn die Anzahl der Spalten in *X* der Anzahl der Zeilen in *Y* entspricht. Daher haben die beiden reduzierten Matrizen eine gemeinsame Dimension *p* .

Abhängig von dem zur Dimensionsreduzierung verwendeten Algorithmus kann die Anzahl der reduzierten Matrizen auch mehr als zwei betragen.

Die reduzierten Matrizen repräsentieren die Benutzer und Elemente tatsächlich einzeln. Die m -Zeilen in der ersten Matrix stellen die m -Benutzer dar, und die p -Spalten geben Auskunft über die Merkmale oder Eigenschaften der Benutzer. Gleiches gilt für die Artikelmatrix mit n Artikeln und p Merkmalen. Hier ist ein Beispiel dafür, wie die Matrixfaktorisierung aussieht:

Im obigen Bild wird die Matrix in zwei Matrizen reduziert. Die linke ist die Benutzermatrix mit m Benutzern, und die obere ist die Elementmatrix mit n Elementen. Die Bewertung "+ 4 +" wird reduziert oder in folgende Faktoren zerlegt:

  1. Ein Benutzervektor "+ (2, -1) +"

  2. Ein Elementvektor + (2.5, 1) +

Die zwei Spalten in der Benutzermatrix und die zwei Zeilen in der Elementmatrix werden als latente Faktoren bezeichnet und sind ein Hinweis auf verborgene Merkmale der Benutzer oder der Elemente. Eine mögliche Interpretation der Faktorisierung könnte folgendermaßen aussehen:

  • Angenommen, in einem Benutzervektor bedeutet "+ (u, v) ", " u ", wie sehr ein Benutzer das Horror-Genre mag, und " v +", wie sehr er das Romance-Genre mag.

  • Der Benutzervektor "+ (2, -1) +" repräsentiert somit einen Benutzer, der Horrorfilme mag und sie positiv bewertet und Filme mit Romantik nicht mag und sie negativ bewertet.

  • Angenommen, in einem Elementvektor repräsentiert "+ (i, j) ", " i ", wie sehr ein Film zum Horror-Genre gehört, und " j ", wie viel dieser Film zum Romance-Genre gehört. *Der Film " (2,5, 1) " hat eine Horror-Bewertung von " 2,5 " und eine Romantik-Bewertung von " 1 ". Wenn Sie ihn mit dem Benutzervektor unter Verwendung von Matrixmultiplikationsregeln multiplizieren, erhalten Sie ` (2* 2,5) + (-1 * 1) = 4 +`.

  • Der Film gehörte also zum Horror-Genre, und der Benutzer hätte ihn mit "+ 5 " bewerten können, aber die geringfügige Einbeziehung von "Romance" führte dazu, dass die endgültige Bewertung auf " 4 +" fiel.

Die Faktormatrizen können solche Einblicke in Benutzer und Elemente liefern, aber in Wirklichkeit sind sie normalerweise viel komplexer als die oben angegebene Erklärung. Die Anzahl solcher Faktoren kann zwischen eins und Hunderten oder sogar Tausenden liegen. Diese Zahl ist eines der Dinge, die während des Trainings des Modells optimiert werden müssen.

Im Beispiel hatten Sie zwei latente Faktoren für Filmgenres, aber in realen Szenarien müssen diese latenten Faktoren nicht zu stark analysiert werden. Dies sind Muster in den Daten, die automatisch ihre Rolle spielen, unabhängig davon, ob Sie die zugrunde liegende Bedeutung entschlüsseln oder nicht.

Die Anzahl der latenten Faktoren wirkt sich auf die Empfehlungen so aus, dass die Empfehlungen umso persönlicher werden, je größer die Anzahl der Faktoren ist. Zu viele Faktoren können jedoch zu einer Überanpassung des Modells führen.

*Hinweis:*  *Überanpassung* tritt auf, wenn das Modell trainiert, um die Trainingsdaten so gut anzupassen, dass es mit neuen Daten nicht gut funktioniert.

Algorithmen zur Matrixfaktorisierung

Einer der gängigen Algorithmen zur Faktorisierung einer Matrix ist der Algorithmus singular value decomposition (SVD). SVD trat ins Rampenlicht, als die Matrixfaktorisierung im Netflix-Preiswettbewerb eine gute Leistung zeigte. Andere Algorithmen umfassen PCA und seine Variationen, NMF und so weiter. Autoencoders kann auch zur Dimensionsreduzierung verwendet werden, wenn Sie neuronale Netze verwenden möchten.

Sie finden die Implementierungen dieser Algorithmen in verschiedenen Bibliotheken für Python, sodass Sie sich an dieser Stelle nicht um die Details kümmern müssen. Wenn Sie jedoch mehr lesen möchten, ist das Kapitel zur Reduzierung der Dimensionalität im Buch Mining of Massive Datasets eine Lektüre wert.

Verwenden von Python zum Erstellen von Empfehlern

In Python gibt es einige Bibliotheken und Toolkits, die Implementierungen verschiedener Algorithmen bereitstellen, mit denen Sie einen Empfehlungsgeber erstellen können. Dasjenige, das Sie ausprobieren sollten, um die Empfehlungssysteme zu verstehen, ist Surprise.

Überraschung ist ein Python SciKit, das mit verschiedenen Empfehlungsalgorithmen und Ähnlichkeitsmetriken geliefert wird, um das Erstellen und Analysieren von Empfehlern zu vereinfachen.

So installieren Sie es mit pip:

$ pip install numpy
$ pip install scikit-surprise

So installieren Sie es mit conda:

$ conda install -c conda-forge scikit-surprise
*Hinweis:* Die Installation von https://realpython.com/courses/introduction-pandas-and-vincent/[Pandas] wird ebenfalls empfohlen, wenn Sie den Beispielen folgen möchten.
Um Surprise verwenden zu können, sollten Sie zunächst einige der darin enthaltenen grundlegenden modules und classes kennen
  • Das Modul "+ Dataset +" wird zum Laden von Daten aus Dateien (https://realpython.com/courses/pandas-dataframes-101/[Pandas dataframes) oder sogar integrierten Datensätzen zum Experimentieren verwendet. (MovieLens 100k ist eines der in Surprise integrierten Datasets.) Zum Laden eines Datasets stehen folgende Methoden zur Verfügung:

  • + Dataset.load_builtin () +

  • + Dataset.load_from_file () +

  • + Dataset.load_from_df () +

  • Die Klasse "+ Reader " wird verwendet, um eine Datei mit Bewertungen zu analysieren. Das Standardformat, in dem Daten akzeptiert werden, besteht darin, dass jede Bewertung in einer separaten Zeile in der Reihenfolge " Benutzerartikelbewertung +" gespeichert wird. Diese Reihenfolge und das Trennzeichen können mithilfe der folgenden Parameter konfiguriert werden:

  • + line_format + ist eine string, die die Reihenfolge der Daten mit durch ein Leerzeichen getrennten Feldnamen speichert, wie in " Elementbenutzerbewertung ".

  • + sep + wird verwendet, um ein Trennzeichen zwischen Feldern anzugeben, z. B. + ',' +.

  • + Bewertungsskala + wird verwendet, um die Bewertungsskala anzugeben. Der Standardwert ist "+ (1, 5) +".

  • + skip_lines + wird verwendet, um die Anzahl der zu überspringenden Zeilen am Anfang der Datei anzugeben. Der Standardwert ist "+ 0 +".

Hier ist ein Programm, mit dem Sie Daten aus einem Pandas-Datenrahmen oder aus dem integrierten MovieLens 100k-Dataset laden können:

# load_data.py

import pandas as pd
from surprise import Dataset
from surprise import Reader

# This is the same data that was plotted for similarity earlier
# with one new user "E" who has rated only movie 1
ratings_dict = {
    "item": [1, 2, 1, 2, 1, 2, 1, 2, 1],
    "user": ['A', 'A', 'B', 'B', 'C', 'C', 'D', 'D', 'E'],
    "rating": [1, 2, 2, 4, 2.5, 4, 4.5, 5, 3],
}

df = pd.DataFrame(ratings_dict)
reader = Reader(rating_scale=(1, 5))

# Loads Pandas dataframe
data = Dataset.load_from_df(df[[user", "item", "rating"]], reader)
# Loads the builtin Movielens-100k data
movielens = Dataset.load_builtin('ml-100k')

Im obigen Programm werden die Daten in einem Wörterbuch gespeichert, das in einen Pandas-Datenrahmen und dann in ein Datensatzobjekt von Surprise geladen wird.

Algorithmen basierend auf K-Nearest Neighbors (k-NN)

Die Wahl des Algorithmus für die Empfehlungsfunktion hängt von der Technik ab, die Sie verwenden möchten. Für die oben diskutierten speicherbasierten Ansätze lautet der Algorithmus, der in die Rechnung passt, Centered k-NN, da der Der Algorithmus liegt sehr nahe an der oben erläuterten zentrierten Kosinus-Ähnlichkeitsformel. Es ist in Surprise als + KNNWithMeans + verfügbar.

Um die Ähnlichkeit zu finden, müssen Sie die Funktion lediglich konfigurieren, indem Sie ein Wörterbuch als Argument an die Empfehlungsfunktion übergeben. Das Wörterbuch sollte die erforderlichen Schlüssel haben, z. B. die folgenden:

  • + name + enthält die zu verwendende Ähnlichkeitsmetrik. Optionen sind + cosine +, + msd +, + pearson + oder + pearson_baseline +. Der Standardwert ist https://surprise.readthedocs.io/en/stable/similarities.html#surprise.similarities.msd [+ msd +].

  • + user_based + ist ein + boolescher +, der angibt, ob der Ansatz benutzer- oder artikelbasiert sein wird. Der Standardwert ist "+ True +", was bedeutet, dass der benutzerbasierte Ansatz verwendet wird.

  • + min_support + ist die Mindestanzahl gemeinsamer Elemente, die Benutzer benötigen, um sie auf Ähnlichkeit zu prüfen. Für den artikelbasierten Ansatz entspricht dies der Mindestanzahl gemeinsamer Benutzer für zwei Artikel.

Das folgende Programm konfiguriert die Funktion + KNNWithMeans +:

# recommender.py

from surprise import KNNWithMeans

# To use item-based cosine similarity
sim_options = {
    "name": "cosine",
    "user_based": False,  # Compute  similarities between items
}
algo = KNNWithMeans(sim_options=sim_options)

Die Empfehlungsfunktion im obigen Programm ist so konfiguriert, dass sie die Kosinusähnlichkeit verwendet und ähnliche Elemente mithilfe des artikelbasierten Ansatzes findet.

Um diesen Empfehlungsgeber auszuprobieren, müssen Sie aus + data + ein + Trainset + erstellen. + Trainset + wird mit denselben Daten erstellt, enthält jedoch weitere Informationen zu den Daten, z. B. die Anzahl der Benutzer und Elemente (+ n_users +, + n_items +), die vom Algorithmus verwendet werden. Sie können es entweder erstellen, indem Sie die gesamten Daten oder einen Teil der Daten verwenden. Sie können die Daten auch in Falten unterteilen, in denen einige der Daten für das Training und andere zum Testen verwendet werden.

*Hinweis:* Die Verwendung von nur einem Paar Trainings- und Testdaten reicht normalerweise nicht aus. Wenn Sie den Originaldatensatz in Trainings- und Testdaten aufteilen, sollten Sie mehr als ein Paar erstellen, um mehrere Beobachtungen mit unterschiedlichen Trainingsdaten zu ermöglichen.

Algorithmen sollten cross-validated unter Verwendung mehrerer Falten sein. Wenn Sie verschiedene Paare verwenden, werden unterschiedliche Ergebnisse von Ihrem Empfehlungsgeber angezeigt. MovieLens 100k bietet fünf verschiedene Aufteilungen von Trainings- und Testdaten: u1.base, u1.test, u2.base, u2.test… u5.base, u5.test für eine 5-fache Kreuzvalidierung

Hier ist ein Beispiel, um herauszufinden, wie der Benutzer E den Film bewerten würde 2:

>>>

>>> from load_data import data
>>> from recommender import algo

>>> trainingSet = data.build_full_trainset()

>>> algo.fit(trainingSet)
Computing the cosine similarity matrix...
Done computing similarity matrix.
<surprise.prediction_algorithms.knns.KNNWithMeans object at 0x7f04fec56898>

>>> prediction = algo.predict('E', 2)
>>> prediction.est
4.15

Der Algorithmus sagte voraus, dass der Benutzer E den Film mit 4,15 bewerten würde, was hoch genug sein könnte, um als Empfehlung angezeigt zu werden.

Sie sollten die verschiedenen k-NN-basierten Algorithmen zusammen mit verschiedenen Ähnlichkeitsoptionen und https://surprise.readthedocs.io/en/stable/ausprobieren. matrix_factorization.html [Matrixfaktorisierungsalgorithmen] in der Überraschungsbibliothek verfügbar. Probieren Sie sie im MovieLens-Dataset aus, um festzustellen, ob Sie einige Benchmarks übertreffen können. Im nächsten Abschnitt erfahren Sie, wie Sie mit Surprise überprüfen, welche Parameter für Ihre Daten am besten geeignet sind.

Optimieren der Algorithmusparameter

Surprise bietet eine + GridSearchCV + -Klasse analog zu GridSearchCV von + scikit-learn +.

Mit einem "+ dict " aller Parameter versucht " GridSearchCV +" alle Kombinationen von Parametern und gibt die besten Parameter für jedes Genauigkeitsmaß an

Beispielsweise können Sie in speicherbasierten Ansätzen überprüfen, welche Ähnlichkeitsmetrik für Ihre Daten am besten geeignet ist:

from surprise import KNNWithMeans
from surprise import Dataset
from surprise.model_selection import GridSearchCV

data = Dataset.load_builtin("ml-100k")
sim_options = {
    "name": ["msd", "cosine"],
    "min_support": [3, 4, 5],
    "user_based": [False, True],
}

param_grid = {"sim_options": sim_options}

gs = GridSearchCV(KNNWithMeans, param_grid, measures=["rmse", "mae"], cv=3)
gs.fit(data)

print(gs.best_score["rmse"])
print(gs.best_params["rmse"])

Die Ausgabe des obigen Programms ist wie folgt:

0.9434791128171457
{'sim_options': {'name': 'msd', 'min_support': 3, 'user_based': False}}

Für das MovieLens 100k-Dataset funktioniert der Centered-KNN-Algorithmus am besten, wenn Sie einen objektbasierten Ansatz wählen und msd als Ähnlichkeitsmetrik mit minimaler Unterstützung 3 verwenden.

In ähnlicher Weise können wir für modellbasierte Ansätze "+ Überraschung +" verwenden, um zu überprüfen, welche Werte für die folgenden Faktoren am besten funktionieren:

  • + n_epochs + ist die Anzahl der Iterationen von SGD. Dies ist im Grunde eine iterative Methode, die in der Statistik verwendet wird, um eine Funktion zu minimieren.

  • + lr_all + ist die Lernrate für alle Parameter. Dies ist ein Parameter, der entscheidet, wie stark die Parameter in jeder Iteration angepasst werden.

  • + reg_all + ist der Regularisierungsterm für alle Parameter. Dies ist ein Strafbegriff, der hinzugefügt wird, um eine Überanpassung zu verhindern.

    *Hinweis:* Beachten Sie, dass die Matrixfaktorisierungsalgorithmen keine Ähnlichkeitsmetriken enthalten, da die latenten Faktoren für die Ähnlichkeit zwischen Benutzern oder Elementen sorgen.

Das folgende Programm überprüft die besten Werte für den Algorithmus SVD, bei dem es sich um einen Matrixfaktorisierungsalgorithmus handelt:

from surprise import SVD
from surprise import Dataset
from surprise.model_selection import GridSearchCV

data = Dataset.load_builtin("ml-100k")

param_grid = {
    "n_epochs": [5, 10],
    "lr_all": [0.002, 0.005],
    "reg_all": [0.4, 0.6]
}
gs = GridSearchCV(SVD, param_grid, measures=["rmse", "mae"], cv=3)

gs.fit(data)

print(gs.best_score["rmse"])
print(gs.best_params["rmse"])

Die Ausgabe des obigen Programms ist wie folgt:

0.9642278631521038
{'n_epochs': 10, 'lr_all': 0.005, 'reg_all': 0.4}

Für das MovieLens 100k-Dataset funktioniert der Algorithmus "+ SVD +" am besten, wenn Sie 10 Epochen verwenden und eine Lernrate von 0,005 und 0,4 Regularisierung verwenden.

Andere auf Matrix Factorization basierende Algorithmen, die in + Surprise + verfügbar sind, sind SVD++ und NMF.

Anhand dieser Beispiele können Sie tief in alle Parameter eintauchen, die in diesen Algorithmen verwendet werden können. Sie sollten auf jeden Fall die Mathematik dahinter überprüfen. Da Sie sich anfangs nicht viel um die Implementierung von Algorithmen kümmern müssen, können Empfehlungen eine gute Möglichkeit sein, in den Bereich des maschinellen Lernens einzusteigen und eine darauf basierende Anwendung zu erstellen.

Wann kann kollaboratives Filtern verwendet werden?

Die kollaborative Filterung umgeht die Interaktionen, die Benutzer mit Elementen haben. Diese Interaktionen können dabei helfen, Muster zu finden, die die Daten zu den Elementen oder Benutzern selbst nicht können. Hier sind einige Punkte, die Ihnen bei der Entscheidung helfen können, ob die kollaborative Filterung verwendet werden kann:

  • Für die kollaborative Filterung müssen keine Funktionen zu den Elementen oder Benutzern bekannt sein. Es eignet sich für eine Reihe verschiedener Arten von Artikeln, z. B. für das Inventar eines Supermarkts, in dem Artikel verschiedener Kategorien hinzugefügt werden können. In einer Reihe ähnlicher Elemente wie dem eines Buchladens können jedoch bekannte Funktionen wie Autoren und Genres nützlich sein und von inhaltsbasierten oder hybriden Ansätzen profitieren.

  • Durch kollaboratives Filtern können Empfehlungen empfohlen werden, sich nicht zu sehr auf das Profil eines Benutzers zu spezialisieren und Elemente zu empfehlen, die sich vollständig von den zuvor gesehenen unterscheiden. Wenn Sie möchten, dass Ihr Empfehlungsgeber jemandem, der gerade ein anderes ähnliches Paar Turnschuhe gekauft hat, kein Paar Turnschuhe vorschlägt, versuchen Sie, Ihrem Empfehlungszauber eine kollaborative Filterung hinzuzufügen.

Obwohl kollaboratives Filtern in Empfehlungsprogrammen sehr häufig verwendet wird, sind einige der Herausforderungen, denen sich die Verwendung bei der Verwendung gegenübersieht, die folgenden:

  • Kollaboratives Filtern kann zu Problemen wie Kaltstart für neue Elemente führen, die der Liste hinzugefügt werden. Bis jemand sie bewertet, werden sie nicht empfohlen.

  • Datenmangel kann die Qualität benutzerbasierter Empfehlungen beeinträchtigen und das oben erwähnte Kaltstartproblem verstärken.

  • Die Skalierung kann eine Herausforderung für wachsende Datensätze sein, da die Komplexität zu groß werden kann. Artikelbasierte Empfehlungen sind schneller als benutzerbasierte Empfehlungen, wenn der Datensatz groß ist.

  • Bei einer einfachen Implementierung können Sie feststellen, dass die Empfehlungen in der Regel bereits beliebt sind und die Elemente aus dem Abschnitt long tail möglicherweise ignoriert werden.

Da jeder Empfehlungsalgorithmus eine eigene Liste mit Vor- und Nachteilen hat, ist es normalerweise ein hybrider Empfehlungsalgorithmus, der Abhilfe schafft. Die Vorteile mehrerer Algorithmen, die zusammenarbeiten oder in einer Pipeline arbeiten, können Ihnen dabei helfen, genauere Empfehlungen einzurichten. Tatsächlich war die Lösung des Gewinners des Netflix-Preises auch eine komplexe Mischung aus mehreren Algorithmen.

Fazit

Sie wissen jetzt, welche Berechnungen in einen Empfehlungsgeber für kollaborative Filterung einfließen und wie Sie die verschiedenen Arten von Algorithmen schnell in Ihrem Datensatz ausprobieren können, um festzustellen, ob kollaborative Filterung der richtige Weg ist. Auch wenn es nicht mit hoher Genauigkeit zu Ihren Daten zu passen scheint, können einige der besprochenen Anwendungsfälle Ihnen helfen, die Dinge langfristig auf hybride Weise zu planen.

Hier finden Sie einige Ressourcen für weitere Implementierungen und weitere Informationen zu kollaborativen Filtern und anderen Empfehlungsalgorithmen.

Bibliotheken:

Forschungsunterlagen:

Bücher: