Ich habe in den letzten Tagen mit Mahout zusammengearbeitet, um eine Empfehlungs-Engine zu erstellen. Das Projekt, an dem ich gerade arbeite, enthält folgende Daten:
Ich experimentiere jetzt mit 1/3 der gesamten Menge, die wir haben (d. h. 6M von 18M Empfehlungen). Bei jeder Konfiguration, die ich versuchte, lieferte Mahout ziemlich enttäuschende Ergebnisse. Einige Empfehlungen dauerten 1,5 Sekunden, andere eine Minute. Ich denke, eine angemessene Zeit für eine Empfehlung sollte ungefähr 100 ms sein.
Warum arbeitet Mahout so langsam?
Ich führe die Anwendung auf einem Tomcat mit den folgenden JVM-Argumenten aus (obwohl das Hinzufügen von ihnen keinen großen Unterschied machte):
Nachfolgend finden Sie Codeschnipsel für meine Experimente:
Benutzerähnlichkeit 1:
%Vor%Benutzerähnlichkeit 2:
%Vor%Artikelähnlichkeit 1:
%Vor%Mit der gnädigen Hilfe der Mahout-Gemeinschaft über ihre Mailingliste haben wir eine Lösung für mein Problem gefunden. Der gesamte mit der Lösung zusammenhängende Code wurde in Mahout 0.6 gespeichert. Weitere Details finden Sie in dem entsprechenden JIRA-Ticket .
Mit VisualVM habe ich festgestellt, dass der Leistungsengpass in der Berechnung der Ähnlichkeiten zwischen den einzelnen Elementen besteht. Dies wurde von @Sean mit einer sehr einfachen, aber effektiven Lösung behoben (weitere Informationen finden Sie im SVN-Commit ) Details)
Außerdem haben wir besprochen, wie die SamplingCandidateItemsStrategy verbessert werden kann, um eine feinere Kontrolle über die Abtastrate zu ermöglichen.
Schließlich habe ich mit den oben genannten Fixes einige Tests mit meiner Anwendung durchgeführt. Alle Empfehlungen nahmen weniger als 1,5 Sekunden in Anspruch, wobei die überwältigende Mehrheit weniger als 500 ms benötigte. Mahout könnte problemlos 100 Empfehlungen pro Sekunde verarbeiten (ich habe nicht versucht, es mehr zu betonen).
Kleiner Vorschlag: Ihr letztes Snippet sollte GenericBooleanPrefItemBasedRecommender
verwenden.
Für Ihren Datensatz sollte der auf Elementen basierende Algorithmus der beste sein.
Das klingt etwas langsam und die Minuten sind viel zu lang. Der Schuldige sind klumpige Daten; Die Zeit kann mit der Anzahl der Bewertungen, die ein Benutzer angegeben hat, skaliert werden.
Sehen Sie sich SamplingCandidateItemsStrategy
an. Auf diese Weise können Sie die Menge der in dieser Hinsicht geleisteten Arbeit begrenzen, indem Sie bei besonders dichten Daten Proben nehmen. Sie können dies an GenericBooleanPrefItemBasedRecommender
anschließen, anstatt den Standardwert zu verwenden. Ich denke, dies wird Ihnen einen Hebel geben, um die Geschwindigkeit zu erhöhen und die Reaktionszeit vorhersehbarer zu machen.
Tags und Links performance recommendation-engine mahout