Blog

Führen Sie die Ergebnisse der Mahout artikelbasierten Empfehlungen aus verschiedenen Algorithmen zusammen.

Giovanni Lanzani

Aktualisiert Oktober 22, 2025
5 Minuten

Apache Mahout ist eine Bibliothek für maschinelles Lernen, die die Leistungsfähigkeit von Hadoop nutzt, um maschinelles Lernen mit Hilfe des MapReduce-Paradigmas zu implementieren. Einer der implementierten Algorithmen ist die kollaborative Filterung, die bis heute erfolgreichste Empfehlungstechnik. Die Grundidee hinter dem kollaborativen Filtern besteht darin, die Handlungen oder Meinungen von Benutzern zu analysieren, um ähnliche Artikel zu empfehlen wie die, mit denen der Benutzer interagiert.

Speicherbasierte kollaborative Filteralgorithmen lassen sich grob in zwei Kategorien einteilen: benutzerbasiert und objektbasiert.

Benutzerbasierte kollaborative Filterung

Der Grundgedanke des benutzerbasierten kollaborativen Filterns besteht darin, festzustellen, ob ein Benutzer einer Gruppe von Benutzern ähnlich ist (die sich alle auf die eine oder andere Weise ähneln), und dann Produkte vorzuschlagen, die auf den Vorlieben der Gruppe von Benutzern basieren. Dieser Ansatz verwendet in der Regel Nearest-Neighbors-Techniken, um die Zugehörigkeit eines Benutzers zu einem oder mehreren Clustern zu bestimmen, und ist die übliche Wahl, wenn die Anzahl der Artikel im Katalog viel größer ist als die Anzahl der Benutzer (denken Sie an Amazon).

Elementbasierte kollaborative Filterung

Andererseits wird die artikelbasierte kollaborative Filterung verwendet, wenn die Anzahl der Nutzer viel größer ist als die Anzahl der Artikel im Katalog. Denken Sie an einen schnelllebigen Immobilienmakler, einen Händler für Oldtimer (das ist das Beispiel, das wir in diesem Beitrag verwenden werden), usw.

Um festzustellen, ob zwei Artikel ähnlich sind, analysiert der Algorithmus das Verhalten aller Benutzer, die mit beiden Artikeln interagiert haben. Nach einer gewissen Renormierung ergibt sich ein Ähnlichkeitsmaß, sagen wir $s_{ij}$, das angibt, wie sehr Artikel $u_i$ dem Artikel $u_j$ ähnlich ist. Es ist wichtig zu beachten, dass die Ähnlichkeit zwischen $u_i$ und $u_j$ nicht auf den Produkten (z.B. Preis, Farbe, Verwendungszweck) basiert, sondern lediglich auf den Interaktionen, die die Benutzer mit ihnen hatten.

Um ein Beispiel zu geben: Wenn viele Benutzer ähnliche Interaktionen mit einem Ferrari Testarossa hatten und im gleichen Moment ähnliche Interaktionen mit einem Fiat 500, würde das nicht bedeuten, dass die beiden Autos ähnlich sind (obwohl sie beide italienisch sind): Es würde Artikel anzeigen, die je nach Benutzerinteraktion ähnlich sind!

Ein mögliches Problem bei diesem Ansatz

Bei GoDataDriven hatten wir genau das Problem mit dem Testarossa/500 bei einem unserer Kunden. In unseren Tests konnten wir feststellen, dass das System Autos, die nicht miteinander verwandt waren, als (sehr) ähnlich einstufte. Die Art und Weise, wie wir Mahout mit den Eingabedaten aufriefen, war

    mahout itemsimilarity --input $SCORES --output $OUTPUT_PEARSON 
        -s SIMILARITY_PEARSON_CORRELATION

Das bedeutet, dass wir die sofort einsatzbereite Pearson-Produkt-Moment-Korrelation von Mahout verwendet haben. Nachdem wir die Eingabedaten (die sich im Ordner $SCORES befanden) analysiert hatten, sahen wir etwas Interessantes: Das Testarossa/500-Problem (und viele andere ähnliche Probleme) tauchte auf, weil zwei Benutzer (bei denen es sich um denselben Benutzer mit einer anderen IP-Adresse gehandelt haben könnte) genau die gleichen Interaktionen mit den beiden Artikeln hatten.

Geben Sie den Co-occurrence Ähnlichkeitsalgorithmus ein

Die Lösung des Problems war ganz klar. Wir mussten alle Empfehlungen herausfiltern, die durch die Interaktionen von weniger als $x$ Nutzern entstanden waren (später haben wir diese Zahl auf 3 festgelegt). Das 'Wie' ist der interessante Teil, wie immer bei technischen Problemen (sagt ein theoretischer Physiker).

Glücklicherweise kann Mahout Ähnlichkeiten mit dem Co-Occurrence-Algorithmus berechnen, bei dem das Ähnlichkeitsmaß einfach dadurch gegeben ist, wie viele Benutzer mit den beiden Objekten interagiert haben, d.h. unser $x$! Um Mahout dieses Mal aufzurufen, können wir einfach verwenden

    mahout itemsimilarity --input $SCORES --output $OUTPUT_COOCCURRENCE 
        -s SIMILARITY_COOCCURRENCE

Zusammenführen der Daten

Sobald wir die Ausgabe der beiden Empfehlungsalgorithmen haben, besteht der letzte Schritt darin, die Daten zusammenzuführen. Für den Zusammenführungsprozess haben wir Hive mit dem folgenden Skript verwendet:

    -- Remember that Mahout output is in the form (id1, id2, score)
    CREATE EXTERNAL TABLE cooccurrence_mahout
    (object_id1 BIGINT, object_id2 BIGINT, score FLOAT)
    LOCATION '${env:OUTPUT_COOCCURRENCE}';

    CREATE EXTERNAL TABLE pearson_mahout
    (object_id1 BIGINT, object_id2 BIGINT, score FLOAT)
    LOCATION '${env:OUTPUT_PEARSON}';

    -- The following is a simple join on the first two columns
    CREATE TABLE recommendations
    AS
    SELECT p.object_id1, p.object_id2, p.score, c.score as co-occurrence
    FROM pearson_mahout p
    JOIN cooccurrence_mahout c
    ON p.object_id1 = c.object_id1 and p.object_id2 = c.object_id2;

    -- This table ignores items with low co-occurrence
    CREATE TABLE highly_recommended
    AS SELECT object_id1, object_id2, score FROM recommendations
    WHERE cooccurrence > 2;

Eine letzte Anmerkung

Wenn wir das obige Skript so ausführten, wie es war, sahen wir uns mit einer weiteren Eigenart konfrontiert: Die zusammengeführte Tabelle war selbst vor dem Löschen von Objekten mit geringer Koinzidenz und der Berücksichtigung der Symmetrie der Objekt-IDs viel kleiner als die beiden ursprünglichen Tabellen. Nach einigem Nachforschen fanden wir heraus, dass die Standardanzahl von Objekten, die Mahout ausgibt, zu niedrig war, so dass die Menge, die bei einem Algorithmus eine hohe Punktzahl erreichte, bei Verwendung des anderen Algorithmus nicht immer eine hohe Punktzahl erreichte. Um dieses Problem zu beheben, änderten wir den Mahout-Code in

    mahout itemsimilarity --input $SCORES --output $OUTPUT_PEARSON 
        -s SIMILARITY_PEARSON_CORRELATION --maxSimilaritiesPerItem 100000
    mahout itemsimilarity --input $SCORES --output $OUTPUT_COOCCURRENCE 
        -s SIMILARITY_COOCCURRENCE --maxSimilaritiesPerItem 100000

Das war's! Ich hoffe, dass Sie mit diesem Beitrag Ihre Empfehlungen richtig einordnen können!

Verfasst von

Giovanni Lanzani

Contact

Let’s discuss how we can support your journey.