Maschinelles Lernen in Compute Engine für Produktempfehlungen verwenden

Mithilfe von Google Cloud können Sie einen skalierbaren, effizienten und effektiven Dienst erstellen, um für die Nutzer in einem Onlineshop relevante Produktempfehlungen bereitzustellen.

Der Konkurrenzkampf unter Online-Verkaufsseiten war noch nie so hart wie heute. Die Kunden geben mehr Geld für ihre Provider, aber weniger Geld pro Händler aus. Die durchschnittliche Größe eines einzelnen Einkaufswagens hat sich verringert, zum Teil auch deshalb, weil die Konkurrenz nur einen Klick entfernt ist. Potentiellen Kunden relevante Informationen anzubieten kann eine zentrale Rolle dabei spielen, aus "Online-Bummlern" Käufer zu machen und das durchschnittliche Bestellvolumen zu erhöhen.

Nach dem Lesen dieser Lösung sollten Sie in der Lage sein, eine Umgebung einzurichten, die ein einfaches Empfehlungssystem unterstützt, das Sie basierend auf den Anforderungen Ihrer jeweiligen Arbeitslast vergrößern und verbessern können. Wenn Sie ein Empfehlungssystem in Google Cloud ausführen, erhalten Sie Flexibilität und Skalierbarkeit für die Lösungen, die Sie ausführen möchten.

In dieser Lösung erfahren Sie, wie eine Immobilienvermietung relevante Empfehlungen berechnen und diese den Besuchern ihrer Webseite präsentieren kann.

Szenario

Samantha möchte ein Ferienhaus mieten. Sie hat ein Profil auf einer Website für Ferienhäuser und hat vor Kurzem mehrere Urlaubspakete gebucht und bewertet. Samantha sucht nach Empfehlungen basierend auf ihren Präferenzen und Vorlieben. Das System sollte Samanthas Geschmack bereits kennen. Laut ihrer Bewertungsseite mag sie Unterkünfte vom Typ house. Das System sollte etwas Ähnliches empfehlen.

Die Benutzeroberfläche ermöglicht das Mieten von Ferienobjekten

Lösungsübersicht

Um Empfehlungen zu geben, ob nun in Echtzeit, während die Kunden die Website besuchen oder mittels einer späteren E-Mail, müssen mehrere Dinge geschehen. Zuerst, wenn noch wenig über die Vorlieben und Präferenzen der Nutzer bekannt ist, können Empfehlungen allein basierend auf Elementattributen erfolgen. Ihr System muss jedoch in der Lage sein, von Nutzern zu lernen, indem es Daten über deren Vorlieben und Präferenzen sammelt. Mit der Zeit und mit ausreichend Daten können Sie maschinelle Lernalgorithmen für die Durchführung nützlicher Analysen nutzen und hilfreiche Empfehlungen geben. Auch die Eingaben anderer Nutzer können die Ergebnisse verbessern und das System in die Lage versetzen, in regelmäßigen Abständen etwas Neues zu lernen. Diese Lösung beschäftigt sich mit einem Empfehlungssystem, das bereits über genug Daten verfügt, um von den maschinellen Lernalgorithmen zu profitieren.

Ein Empfehlungssystem verarbeitet Daten üblicherweise in den folgenden vier Phasen:

Erfassungs-, Speicher-, Analyse- und Empfehlungsphasen

Die Architektur eines solchen Systems kann mit dem folgenden Diagramm dargestellt werden:

Architektur mit Front-End, Speicher und maschinellem Lernen

Jeder Schritt kann entsprechend angepasst werden, um die Anforderungen zu erfüllen. Das System besteht aus:

  1. Einem skalierbarem Front-End, das die Nutzerinteraktionen zum Sammeln von Daten erfasst.

  2. Einem dauerhaften Speicher, der von einer maschinellen Lernplattform aufgerufen werden kann. Das Laden der Daten in den Speicher kann mehrere Schritte umfassen, wie z. B. das Importieren/Exportieren und Umwandeln von Daten.

  3. Einer maschinellen Lernplattform, die bestehende Inhalte analysieren kann, um relevante Empfehlungen zu erstellen.

  4. Einem Speicher, der basierend auf den Aktualitätsanforderungen für Empfehlungen vom Front-End in Echtzeit oder später verwendet werden kann.

Wahl der Komponenten

Um einen guten Kompromiss zwischen Geschwindigkeit, Einfachheit, Kostenkontrolle und Genauigkeit zu erreichen, verwendet diese Lösung App Engine, Cloud SQL und Apache Spark, die unter Nutzung von Dataproc auf App Engine ausgeführt werden.

App Engine kann mehrere Zehntausende Anfragen pro Sekunde mit geringem Verwaltungsaufwand bearbeiten. Ob beim Erstellen einer Website oder Speichern von Daten in einem Back-End-Speicher, App Engine lässt Sie innerhalb von Sekunden Ihren Code schreiben und diesen für die Produktion einsetzen.

Cloud SQL bietet auch eine unkomplizierte Bereitstellung. Cloud SQL kann virtuelle Maschinen auf bis zu 32 Kerne und bis zu 208 GB RAM hochskalieren und bei Bedarf den Speicher auf 10 TB mit 30 IOPS pro GB und Tausenden von gleichzeitigen Verbindungen erhöhen. Diese Spezifikationen sind für das Beispiel in dieser Lösung und für eine große Anzahl echter Empfehlungssysteme ausreichend. Cloud SQL bietet außerdem den Vorteil, dass der Zugriff direkt über Spark möglich ist.

Spark bietet eine weit bessere Leistung als eine typische Hadoop-Installation; Spark kann 10 bis 100 Mal schneller sein. Mit Spark MLlib können Sie mehrere hundert Millionen Bewertungen in wenigen Minuten analysieren. Dies erhöht die Agilität der Empfehlungen und ermöglicht es dem Administrator, den Algorithmus öfter auszuführen. Spark nutzt den Speicher für eine schnellstmögliche Berechnung, um unnötige Umlaufzeit zum Laufwerk zu reduzieren. Es versucht, die E/A zu minimieren. Diese Lösung nutzt Compute Engine zum Hosten der Analyseinfrastruktur. Compute Engine hilft dabei, den Preis für die Analyse durch seine Preisgestaltung auf Sekunden- und Bedarfsbasis so niedrig wie möglich zu halten.

Die folgende Grafik lässt sich dem vorherigen Architekturdiagramm zuordnen, zeigt aber für jeden Schritt die genutzte Technologie:

Die Architektur nutzt App Engine, Cloud SQL, Spark und Compute Engine

Daten erfassen

Ein Empfehlungssystem kann Nutzerdaten basierend auf deren impliziten Verhalten oder expliziten Eingaben sammeln.

Verhaltensdaten sind leicht zu sammeln, da Nutzeraktivitäten protokolliert werden können. Das Sammeln dieser Daten ist auch selbsterklärend, da keine zusätzliche Aktion von den Nutzern notwendig ist; sie nutzen die Anwendung bereits. Der Nachteil dieses Ansatzes ist, dass die Analyse schwerer ist. Beispielsweise kann das Herausfiltern von interessanten Protokollen aus den weniger interessanten sehr umständlich sein. Ein Beispiel für die implizite Datenanalyse mit Protokolleinträgen finden Sie unter Protokollanalyse in Echtzeit mit Fluentd und BigQuery.

Eingabedaten können schwerer zu sammeln sein, da hierfür zusätzliche Aktionen von den Nutzern wie etwa das Schreiben einer Bewertung erforderlich sind. Nutzer möchten diese Daten womöglich aus verschiedenen Gründen nicht preisgeben. Wenn es jedoch um das Verständnis von Nutzerpräferenzen geht, sind diese Ergebnisse recht präzise.

Daten speichern

Je mehr Daten Sie Ihren Algorithmen zur Verfügung stellen können, desto besser fallen die Ergebnisse aus. Dies bedeutet, dass jedes Empfehlungsprojekt schnell zu einem Big-Data-Projekt werden kann.

Der Datentyp, den Sie zum Erstellen von Empfehlungen nutzen, kann Ihnen bei der Entscheidung für den zu nutzenden Speichertyp helfen. Sie können sich für die Nutzung einer NoSQL-Datenbank, einer standardmäßigen SQL-Datenbank oder sogar für eine Art Objektspeicher entscheiden. Jede dieser Optionen ist stark abhängig davon, ob Sie Nutzereingaben oder -verhalten erfassen, sowie von Faktoren wie beispielsweise eine leichte Implementierung, die Datenmenge, die der Speicher verwalten kann, die Integration in die restliche Umgebung und die Übertragbarkeit.

Beim Speichern von Nutzerbewertungen und -ereignissen minimiert eine skalierbare und verwaltete Datenbank die Menge an notwendigen operativen Aufgaben und hilft, sich auf die Empfehlung zu konzentrieren. Cloud SQL erfüllt beide dieser Bedürfnisse und erleichtert zusätzlich das Laden von Daten direkt aus Spark.

Der folgende Beispielcode zeigt die Schemas der Cloud SQL-Tabellen. Die Accommodation-Tabelle repräsentiert das Mietobjekt und die Rating-Tabelle stellt die Wertung des Nutzers für ein bestimmtes Objekt dar.

CREATE TABLE Accommodation
(
  id varchar(255),
  title varchar(255),
  location varchar(255),
  price int,
  rooms int,
  rating float,
  type varchar(255),
  PRIMARY KEY (ID)
);

CREATE TABLE Rating
(
  userId varchar(255),
  accoId varchar(255),
  rating int,
  PRIMARY KEY(accoId, userId),
  FOREIGN KEY (accoId)
    REFERENCES Accommodation(id)
);

Spark kann Daten aus verschiedenen Quellen abrufen, z. B. Hadoop HDFS oder Cloud Storage. Diese Lösung empfängt Daten direkt aus Cloud SQL, indem sie den Java Database Connectivity (JDBC)-Connector von Spark nutzt. Da Spark-Aufträge parallel ausgeführt werden, muss der Connector auf allen Cluster-Instanzen verfügbar sein.

Daten analysieren

Für das Erstellen der Analysephase ist ein Verständnis der Anwendungsanforderungen nötig. Diese Anforderungen umfassen:

  • Die Aktualität einer Empfehlung: Wie schnell muss die Anwendung Empfehlungen abgeben?

  • Der Filteransatz für die Daten: Wird die Anwendung ihre Empfehlungen allein auf den Geschmack des Nutzers stützen, die Daten danach auswerten, was andere Nutzer denken, oder danach, welche Produkte logischerweise zusammenpassen?

Aktualität verstehen

Der erste zu berücksichtigende Faktor bei der Datenanalyse ist, wie schnell Sie die Empfehlungen dem Nutzer präsentieren müssen. Wenn Sie die Empfehlungen sofort präsentieren möchten, wenn sich der Nutzer ein Produkt ansieht, benötigen Sie einen beweglicheren Analysetyp als wenn Sie beispielsweise dem Kunden später eine E-Mail mit Empfehlungen schicken möchten.

  • Echtzeit-Systeme können Daten direkt bei der Erstellung verarbeiten. Diese Art von System umfasst Tools, die Ereignisströme verarbeiten und analysieren können. Ein Echtzeitsystem wäre notwendig, um Momentempfehlungen zu geben.

  • Für die Batchanalyse müssen Sie die Daten regelmäßig verarbeiten. Dieser Ansatz deutet an, dass genug Daten erstellt werden müssen, um die Analyse relevant zu machen, wie etwa das tägliche Verkaufsvolumen. Ein Batchsystem kann gut funktionieren, um später eine E-Mail zu verschicken.

  • Eine Analyse in nahezu Echtzeit ermöglicht Ihnen ein schnelles Erfassen von Daten, sodass Sie die Analyse alle paar Minuten oder Sekunden aktualisieren können. Ein System in nahezu Echtzeit kann gut sein, um Empfehlungen während der gleichen Browsersitzung zu geben.

Eine Empfehlung kann in jede dieser drei Aktualitätskategorien fallen, aber bei einem Online-Verkaufstool können Sie etwas zwischen nahezu Echtzeit und Batchverarbeitung in Betracht ziehen, je nachdem, wie viel Traffic und Nutzereingaben die Anwendung hat. Die Plattform, welche die Analyse ausführt, kann direkt von einer Datenbank aus arbeiten, wo die Daten gespeichert werden, oder auf einem Abbild, das regelmäßig in einem persistenten Speicher gespeichert wird.

Daten filtern

Eine Kernkomponente zum Aufbau eines Empfehlungssystems ist das Filtern. Die am häufigsten verwendeten Ansätze sind:

  • Inhaltsbasiert: Ein beliebtes empfohlenes Produkt hat Attribute, die dem ähneln, was der Nutzer ansieht oder mag.

  • Clusterbasiert: Empfohlene Produkte passen unabhängig von den Aktivitäten anderer Nutzer gut zusammen.

  • Kollaborativ: Andere Nutzer, die dieselben Produkte mögen, die der Nutzer ansieht oder mag, mochten auch ein empfohlenes Produkt.

Obwohl Google Cloud alle diese Ansätze unterstützt, konzentriert sich diese Lösung auf das kollaborative Filtern, das mit Apache Spark implementiert wird. Weitere Informationen zum inhalts- oder clusterbasierten Filtern finden Sie im Anhang.

Das kollaborative Filtern ermöglicht Ihnen, Produktattribute zu abstrahieren und Vorhersagen basierend auf den Nutzerpräferenzen zu treffen. Das Ergebnis dieses Filterns basiert auf der Annahme, dass zwei verschiedene Nutzer, die in der Vergangenheit das gleiche Produkt mochten, auch jetzt die gleichen Produkte mögen werden.

Sie können Daten über Bewertungen oder Interaktionen als Matrix darstellen (mit Produkten und Nutzern als Dimensionen). Das kollaborative Filtern versucht, die fehlenden Zellen in einer Matrix für ein bestimmtes Nutzer-Produkt-Paar vorherzusagen. Die folgenden zwei Matrizen sind ähnlich. Die zweite Matrix ist eine Ableitung der ersten, bei der die bestehenden Bewertungen durch die Zahl 1 und die fehlenden Bewertungen durch die Zahl 0 ersetzt wurden. Die daraus resultierende Matrix ist eine Wahrheitstabelle, in der die Zahl 1 für eine Interaktion der Nutzer mit dem Produkt steht.

Bewertungsmatrix Interaktionsmatrix
Bewertungsmatrix Bewertungsmatrix

Für die Anwendung von kollaborativem Filtern gibt es zwei unterschiedliche Ansätze:

  • Speicherbasiertes Filtern berechnet Ähnlichkeiten zwischen Produkten oder Nutzern.

  • Modellbasiertes Filtern versucht, das zugrundeliegende Muster zu erkennen, das vorgibt, wie Nutzer Artikel bewerten oder mit ihnen interagieren.

Diese Lösung nutzt den modellbasierten Ansatz, bei dem Nutzer Artikel bewertet haben.

Alle von dieser Lösung benötigten Analysefeatures sind über PySpark verfügbar, das eine Python-Schnittstelle zur Spark-Programmiersprache bereitstellt. Andere Optionen sind mit Scala oder Java verfügbar; siehe Spark-Dokumentation.

Modelle trainieren

Spark MLlib implementiert den Alternating Least Squares (ALS)-Algorithmus zum Schulen der Modelle. Sie verwenden verschiedene Kombinationen der folgenden Parameter, um den besten Kompromiss zwischen Varianz und Verzerrung zu schließen:

  • Rang: Die Anzahl unbekannter Faktoren, die dazu geführt haben, dass ein Nutzer eine bestimmte Bewertung abgibt. Dies könnte Faktoren wie Alter, Geschlecht oder Ort umfassen. Je höher der Rang, desto besser ist die Empfehlung zu einem gewissen Grad. Ein guter Ansatz ist, mit 5 zu beginnen und in 5er-Schritten zu erhöhen, bis die Verbesserungsrate der Empfehlung abnimmt (sofern Speicher und CPU dies erlauben).

  • Lambda: Ein Regulierungsparameter, um eine Überanpassung zu vermeiden. Diese drückt sich in einer hohen Varianz und einer niedrigen Verzerrung aus. Die Varianz zeigt, wie stark die Vorhersagen zu einem bestimmten Zeitpunkt über mehrere Runden und im Vergleich zum theoretisch für diesen Punkt korrekten Wert schwanken. Die Verzerrung gibt an, wie weit die generierten Vorhersagen vom wahren Wert, den Sie vorhersagen wollen, entfernt sind. Zu einer Überanpassung kommt es, wenn das Modell mit Trainingsdaten und bekannten Störungen gut funktioniert, nicht aber mit tatsächlichen Testdaten. Je höher das Lambda, desto geringer ist die Überanpassung und desto größer ist die Verzerrung. Die Werte 0,01, 1 und 10 sind gute Werte zum Testen.

    Die folgende Grafik zeigt das Verhältnis zwischen Varianz und Verzerrung. Das Bullauge steht für den Wert, den der Algorithmus versucht, vorherzusagen.

    Varianz und Verzerrung (links oben ist der beste Wert)
    Varianz und Verzerrung
  • Ausführung: Die Anzahl der ausgeführten Trainings. In diesem Beispiel nehmen Sie 5, 10, und 20 Ausführungen für verschiedene Kombinationen von Rang und Lambda vor.

Der folgende Beispielcode zeigt, wie man ein ALS-Modelltraining in Spark ausführt.

from pyspark.mllib.recommendation import ALS
model = ALS.train(training, rank = 10, iterations = 5, lambda_=0.01)

Das richtige Modell ermitteln

Das kollaborative Filtern nutzt den ALS-Algorithmus und basiert auf drei verschiedenen Datensätzen:

  • Trainingssatz: Enthält Daten mit bekannten Ergebnissen. Dieser Satz entspricht einem idealen Ergebnis. In dieser Lösung enthält er die Nutzerbewertungen.

  • Bewertungssatz: Enthält Daten, die dem Training dabei helfen, die richtige Parameterkombination und das beste Modell auszuwählen.

  • Testsatz: Enthält Daten, die zur Leistungsbewertung des am besten trainierten Modells verwendet werden. Dies ist gleichbedeutend mit dem Ausführen der Analyse in einem echten Beispiel.

Um das beste Modell zu finden, müssen Sie den Root Mean Square Error (RMSE) basierend auf dem berechneten Modell, dem Bewertungssatz und dessen Größe berechnen. Je geringer der RMSE, desto besser ist das Modell.

Empfehlungen abgeben

Um dem Nutzer die Ergebnisse schnell und leicht zugänglich zu machen, müssen Sie diese in eine Datenbank laden, die bei Bedarf abgefragt werden kann. Auch hier ist Cloud SQL eine sehr gute Lösung. In Spark 1.4 können Sie die Ergebnisse der Vorhersage direkt in die Datenbank von PySpark schreiben.

Das Schema der Recommendation-Tabelle sieht folgendermaßen aus:

CREATE TABLE Recommendation
(
  userId varchar(255),
  accoId varchar(255),
  prediction float,
  PRIMARY KEY(userId, accoId),
  FOREIGN KEY (accoId)
    REFERENCES Accommodation(id)
);

Code-Anleitung

Dieser Abschnitt geht den Code zum Trainieren der Modelle durch.

Daten aus Cloud SQL abrufen

Mit dem Spark SQL-Kontext können Sie sich leicht über einen JDBC-Connector mit einer Cloud SQL-Instanz verbinden. Die geladenen Daten haben das DataFrame-Format.

jdbcUrl    = 'jdbc:mysql://%s:3306/%s?user=%s&password=%s' % (CLOUDSQL_INSTANCE_IP, CLOUDSQL_DB_NAME, CLOUDSQL_USER, CLOUDSQL_PWD)
dfAccos = sqlContext.read.jdbc(url=jdbcUrl, table=TABLE_ITEMS)
dfRates = sqlContext.read.jdbc(url=jdbcUrl, table=TABLE_RATINGS)

DataFrame in ein RDD konvertieren und mehrere Datasets erstellen

Spark nutzt ein Konzept namens Resilient Distributed Dataset (RDD), das die parallele Arbeit an Elementen unterstützt. RDDs sind aus einem persistenten Speicher erstellte schreibgeschützte Sammlungen. Sie können im Speicher verarbeitet werden, sodass Sie sich für die iterative Verarbeitung eignen.

Denken Sie daran, dass Sie Ihre Datasets in drei verschiedene Sätze aufteilen müssen, um das beste Modell für Ihre Vorhersagen zu erhalten. Der folgende Code nutzt eine Hilfsfunktion, die nicht überlappende Werte willkürlich auf einer Prozentsatzgrundlage von 60/20/20 aufteilt:

rddTraining, rddValidating, rddTesting = dfRates.rdd.randomSplit([6,2,2])

Modelle anhand verschiedener Parameter trainieren

Beachten Sie, dass das System bei der Nutzung der ALS-Methode mit den Rang-, Regulierungs- und Iterationsparametern arbeiten muss, um das beste Modell zu ermitteln. Da Bewertungen existieren, müssen die Ergebnisse der train-Funktion mit dem Bewertungssatz verglichen werden. Die Nutzerpräferenzen müssen sich auch im Trainingssatz befinden.

for cRank, cRegul, cIter in itertools.product(ranks, reguls, iters):

  model = ALS.train(rddTraining, cRank, cIter, float(cRegul))
  dist = howFarAreWe(model, rddValidating, nbValidating)
  if dist < finalDist:
    print("Best so far:%f" % dist)
    finalModel = model
    finalRank  = cRank
    finalRegul = cRegul
    finalIter  = cIter
    finalDist  = dist
def howFarAreWe(model, against, sizeAgainst):
  # Ignore the rating column
  againstNoRatings = against.map(lambda x: (int(x[0]), int(x[1])) )

  # Keep the rating to compare against
  againstWiRatings = against.map(lambda x: ((int(x[0]),int(x[1])), int(x[2])) )

  # Make a prediction and map it for later comparison
  # The map has to be ((user,product), rating) not ((product,user), rating)
  predictions = model.predictAll(againstNoRatings).map(lambda p: ( (p[0],p[1]), p[2]) )

  # Returns the pairs (prediction, rating)
  predictionsAndRatings = predictions.join(againstWiRatings).values()

  # Returns the variance
  return sqrt(predictionsAndRatings.map(lambda s: (s[0] - s[1]) ** 2).reduce(add) / float(sizeAgainst))

Top-Vorhersagen für den Nutzer berechnen

Jetzt, wo Sie ein Modell haben, das vernünftige Vorhersagen machen kann, können Sie es dafür nutzen, um festzustellen, wofür sich der Nutzer basierend auf seinen Präferenzen und den Bewertungen anderer Nutzer mit ähnlichen Präferenzen am wahrscheinlichsten interessieren wird. In diesem Schritt erhalten Sie Einblick in die Matrix-Zuordnung, die zuvor beschrieben wurde.

# Build our model with the best found values
# Rating, Rank, Iteration, Regulation
model = ALS.train(rddTraining, BEST_RANK, BEST_ITERATION, BEST_REGULATION)

# Calculate all predictions
predictions = model.predictAll(pairsPotential).map(lambda p: (str(p[0]), str(p[1]), float(p[2])))

# Take the top 5 ones
topPredictions = predictions.takeOrdered(5, key=lambda x: -x[2])
print(topPredictions)

schema = StructType([StructField("userId", StringType(), True), StructField("accoId", StringType(), True), StructField("prediction", FloatType(), True)])

dfToSave = sqlContext.createDataFrame(topPredictions, schema)
dfToSave.write.jdbc(url=jdbcUrl, table=TABLE_RECOMMENDATIONS, mode='overwrite')

Top-Vorhersagen speichern

Da Sie jetzt eine Liste mit allen Vorhersagen haben, können Sie die ersten 10 in Cloud SQL speichern, damit das System Empfehlungen für den Nutzer abgeben kann. Ein guter Zeitpunkt zur Nutzung dieser Vorhersagen könnte beispielsweise sein, wenn sich der Nutzer bei der Seite anmeldet.

dfToSave = sqlContext.createDataFrame(topPredictions, schema)
dfToSave.write.jdbc(url=jdbcUrl, table=TABLE_RECOMMENDATIONS, mode='overwrite')

Die Lösung ausführen

Um diese Lösung auszuführen, folgen Sie der Schritt-für-Schritt-Anleitung auf der GitHub-Seite. Wenn Sie diese Anweisungen befolgen, sollten Sie in der Lage sein, die Empfehlungen für den Nutzer zu berechnen und anzuzeigen.

Der abschließende SQL-Code holt die beste Empfehlung aus der Datenbank und zeigt sie auf Samanthas Begrüßungsseite an.

Wenn die Abfrage in der Cloud Console oder einem MySQL-Client ausgeführt wird, gibt sie ein Ergebnis wie im folgenden Beispiel zurück:

Ergebnisse aus der SQL-Abfrage für 5 Nutzer

Die gleiche Abfrage kann die Willkommensseite der Website optimieren und die Wahrscheinlichkeit erhöhen, dass ein Besucher zu einem Kunden wird:

Benutzeroberfläche mit Ergebnissen

Basierend darauf, was dem System bereits über Samantha bekannt war (wie in der Szenariobeschreibung erläutert), scheint dies Samanthas Vorlieben zu ähneln.

Anleitung

Die vollständigen Inhalte der Anleitung, einschließlich der Set-up-Anleitungen und dem Quellcode sind auf GitHub verfügbar.

Tipp

Anhang

Kreuzfilterung

Sie haben erfahren, wie Sie eine effektive und skalierbare kollaborative Filterlösung erstellen können. Das Kreuzen der Ergebnisse mit anderen Filtertypen kann die Empfehlung jedoch verbessern. Beachten Sie die anderen beiden Hauptfiltertypen: inhaltsbasiert und clusterbasiert. Eine Kombination dieser Ansätze generiert unter Umständen eine bessere Empfehlung für den Nutzer.

Typen filtern

Inhaltsbasiertes Filtern

Das inhaltsbasierte Filtern funktioniert direkt mit den Artikelattributen und versteht deren Ähnlichkeiten. Dadurch wird das Erstellen von Empfehlungen für Elemente, die zwar Attribute aber wenig Nutzerbewertungen haben, erleichtert. Mit wachsender Nutzerbasis bleibt diese Filterart verwaltbar, selbst bei einer großen Anzahl von Nutzern.

Um inhaltsbasierte Filter hinzuzufügen, können Sie die vorherigen Bewertungen anderer Nutzer für die Artikel im Katalog nutzen. Basierend auf diesen Bewertungen ist es möglich, die Produkte finden, die dem aktuellen Produkt am ähnlichsten sind.

Eine häufig genutzte Möglichkeit zum Berechnen der Ähnlichkeit zwischen zwei Produkten ist mithilfe der Kosinus-Ähnlichkeit zur Ermittlung der engsten Nachbarn:

Kosinus-Ähnlichkeitsformel

Kosinus-Ähnlichkeitsdiagramm

Das Ähnlichkeitsergebnis liegt zwischen 0 und 1. Je näher an 1 es liegt, desto ähnlicher sind die Produkte.

Kosinus-Ähnlichkeitsspektrum

Betrachten Sie die folgende Matrix:

Kosinus-Ähnlichkeitsformel

In dieser Matrix kann die Ähnlichkeit zwischen P1 und P2 folgendermaßen berechnet werden:

Kosinus-Ähnlichkeitsformel mit Ergebnis

Sie können die inhaltsbasierte Filterung über verschiedene Tools erreichen. Weitere Informationen hierzu finden Sie hier:

  • Twitter-Algorithmus zur Ähnlichkeit aller Paare: Die zu MLlib hinzugefügte CosineSimilarities-Skalafunktion kann in der Spark-Umgebung ausgeführt werden.

  • Mahout: Wenn Sie Zugriff zu weiteren Bibliotheken erhalten möchten, um MLlib-Algorithmen zu ergänzen oder zu ersetzen, können Sie Mahout auf Ihrem Dataproc-Controller-(Master)-Knoten installieren. Dafür stellen Sie entweder mithilfe von ssh eine Verbindung mit der Instanz her oder Sie verwenden eine Initialisierungsaktion:

    sudo apt-get update
    sudo apt-get install mahout -y
    

Clustering

Es ist wichtig, den Browser-Kontext und das vom Nutzer gerade Gesehene zu verstehen. Die gleiche Person, die zu unterschiedlichen Zeiten die Seite besucht, kann sich für zwei völlig unterschiedliche Produkte interessieren, oder sogar ein Geschenk für jemand anderes kaufen. Es ist essentiell, zu verstehen, welche Artikel dem aktuell dargestellten ähneln. Das K-mean-Clustering ermöglicht es dem System, ähnliche Artikel basierend auf ihren Kernattributen in Buckets zu packen.

Bei dieser Lösung ist eine Person, die beispielsweise ein Haus in Berlin mieten möchte, derzeit vermutlich nicht an einem Mietobjekt in Wien interessiert. Das System sollte diese Fälle bei einer Empfehlung aussortieren.

from pyspark.mllib.clustering import KMeans, KMeansModel
clusters = KMeans.train(parsedData, 2,
                        maxIterations=10,
                        runs=10,
                        initializationMode="random")

360-Grad-Ansicht

Sie können die Empfehlung weiter verbessern, indem Sie andere Kundendaten berücksichtigen, wie etwa vergangene Bestellungen, Support-Anfragen und persönliche Attribute wie Alter, Ort oder Geschlecht. Diese Attribute, die oft bereits in einem Customer Relationship Management (CRM) oder Enterprise Resource Planning (ERP)-System verfügbar sind, helfen beim Eingrenzen der Möglichkeiten.

Weitergedacht, sind es nicht nur interne Systemdaten, die Einfluss auf das Nutzerverhalten und die Auswahlmöglichkeiten haben; auch externe Faktoren zählen. Im Anwendungsfall einer Ferienimmobilie kann es für eine junge Familie wichtig sein, über die Luftqualität Bescheid zu wissen. Die Einbindung eines in Google Cloud mit einer anderen API, beispielsweise Breezometer, erstellten Empfehlungssystems kann also unter Umständen einen Wettbewerbsvorteil bedeuten.