Erstellen eines Spam-Klassifikators: PySpark + MLLib vs SageMaker + XGBoost

In diesem Artikel werde ich Ihnen zunächst zeigen, wie Sie mit Apache Spark, seiner Python-API (auch bekannt als PySpark) und einer Vielzahl von in Spark MLLib implementierten Algorithmen für maschinelles Lernen einen Spam-Klassifikator erstellen.

Anschließend verwenden wir den neuen Amazon Sagemaker-Dienst zum Trainieren, Speichern und Bereitstellen eines XGBoost-Modells, das für denselben Datensatz trainiert wurde.

Der gesamte Code läuft in einem Jupyter-Notizbuch, das auf Github verfügbar ist :)

PySpark + MLLib

Das große Bild

Unser Rohdatensatz besteht aus einzeiligen Nachrichten, die in zwei Dateien gespeichert sind:

  • die Ham-Datei: 4827 gültige Nachrichten,
  • Die Spam-Datei: 747 Nachrichten.

Um diese Nachrichten zu klassifizieren, müssen wir einen Zwischendatensatz mit zwei Klassen erstellen. Zu diesem Zweck verwenden wir eine einfache, aber effiziente Technik namens Feature-Hashing:

  • Für jede Nachricht im Datensatz werden zuerst die Wörter in eine feste Anzahl von Buckets (z. B. 1000) gehasht.
  • Dann erstellen wir einen Vektor, der für jedes Wort ein Vorkommen ungleich Null angibt: Dies sind die Funktionen, die verwendet werden, um zu entscheiden, ob eine Nachricht Spam ist oder nicht.
  • Für eine gültige Nachricht ist die entsprechende Bezeichnung Null, d. H. Die Nachricht ist kein Spam. Dementsprechend ist das Etikett für eine Spam-Nachricht eins.

Sobald wir fertig sind, lautet unser Zwischendatensatz:

  • 4827 mit einer Null gekennzeichnete Wortvektoren,
  • 747 Wortvektoren, die mit einer Eins gekennzeichnet sind.

Wir werden es zu Schulungs- und Validierungszwecken auf 80/20 aufteilen und eine Reihe von Klassifizierungsalgorithmen durchlaufen.

Für die Vorhersage ist der Prozess ähnlich: Hash der Nachricht, Senden des Wortvektors an das Modell und Abrufen des vorhergesagten Ergebnisses.

Nicht so schwer, hey? Lass uns zur Arbeit gehen!

Erstellen des Zwischendatensatzes

Unser erster Schritt besteht darin, beide Dateien zu laden und die Nachrichten in Wörter aufzuteilen.

Anschließend wird jede Nachricht in Eimer mit 1.000 Wörtern aufgeteilt. Wie Sie sehen können, wird jede Nachricht in einen spärlichen Vektor umgewandelt, der die Bucket-Nummern und Vorkommen enthält.

Der nächste Schritt besteht darin, unsere Funktionen zu kennzeichnen: 1 für Spam, 0 für Nicht-Spam. Das Ergebnis ist eine Sammlung von etikettierten, gebrauchsfertigen Proben.

Schließlich teilen wir den Datensatz 80/20 für Training und Test auf und zwischenspeichern beide RDDs, da wir sie wiederholt verwenden werden.

Jetzt werden wir eine Reihe von Modellen mit diesem Datensatz trainieren. Um ihre Genauigkeit zu messen, verwenden wir die folgende Bewertungsfunktion: Sie können einfach alle Proben im Testset vorhersagen, das vorhergesagte Etikett mit dem tatsächlichen Etikett vergleichen und die Genauigkeit berechnen.

Klassifizieren des Datensatzes mit Spark MLLib

Wir werden die folgenden Klassifizierungsalgorithmen verwenden:

  • Logistische Regression mit dem SGD-Optimierer,
  • Logistische Regression mit dem LBFGS-Optimierer,
  • Support-Vektor-Maschinen,
  • Entscheidungsbäume,
  • Bäume mit Farbverlauf,
  • Zufällige Wälder,
  • Naive Bayes.

Logistische Regression

Beginnen wir mit Logistic Regression, der Mutter aller Klassifikatoren.

Support-Vektor-Maschinen

Was ist mit SVMs, einem anderen beliebten Algorithmus?

Bäume

Versuchen wir nun drei Varianten der baumbasierten Klassifizierung. Die API unterscheidet sich geringfügig von früheren Algen.

Naive Bayes

Versuchen wir zum Schluss den Naives Bayes-Klassifikator.

Es ist allen anderen Algen weit überlegen. Versuchen wir, einige Beispiele aus der Praxis vorherzusagen.

Sie wurden richtig vorhergesagt. Das sieht nach einem ziemlich guten Modell aus. Warum versuchen Sie nicht, diese Werte zu verbessern? Ich habe für die meisten Algorithmen Standardparameter verwendet. Es gibt sicherlich Verbesserungspotenzial :) Sie finden im Notizbuch Links zu allen APIs.

Das ist toll, aber ...

Bisher haben wir nur vor Ort gearbeitet. Dies wirft einige Fragen auf:

  1. Wie würden wir auf einem viel größeren Datensatz trainieren?
  2. Wie würden wir unser Modell für die Produktion einsetzen?
  3. Wie könnten wir wissen, ob unser Modell skalieren würde?

Diese Fragen - Skalierbarkeit und Bereitstellung - sind häufig die Hauptursache für maschinelles Lernen. Die Umstellung von „Es funktioniert auf meiner Maschine“ auf „Es funktioniert rund um die Uhr in der Produktion“ erfordert normalerweise viel Arbeit.

Es gibt Hoffnung. Weiter lesen :)

SageMaker + XGBoost

Die Lösung dieser Schwachstellen ist das Kernstück von Amazon SageMaker. Schauen wir uns unseren Anwendungsfall noch einmal an.

Eingebaute Algorithmen

Wie wir bereits gesehen haben, gibt es zahlreiche Klassifizierungsalgorithmen. Die Auswahl des „richtigen“ und seiner „besten“ Implementierung (viel Glück beim Versuch, „richtig“ und „am besten“ zu definieren) ist keine leichte Aufgabe. Glücklicherweise bietet Ihnen SageMaker mehrere integrierte Algorithmen. Sie wurden von Amazon implementiert, daher können Sie davon ausgehen, dass sie ordnungsgemäß funktionieren und skaliert werden :)

Sie können auch Ihren eigenen Code, Ihr eigenes vorgefertigtes Modell usw. mitbringen. Wird in zukünftigen Artikeln besprochen! Weitere SageMaker-Beispiele zu Github: Regression, Klassifizierung mehrerer Klassen, Bildklassifizierung usw.

Hier verwenden wir XGBoost, eine beliebte Implementierung von Gradient Boosted Trees, um einen binären Klassifikator zu erstellen.

Kurz gesagt, das SageMaker SDK lässt uns:

  • Erstellen einer verwalteten Infrastruktur zum Trainieren von XGBoost in unserem Datensatz,
  • Speichern Sie das Modell in SageMaker.
  • Konfigurieren Sie einen REST-Endpunkt für unser Modell.
  • eine verwaltete Infrastruktur erstellen, um das Modell auf dem REST-Endpunkt bereitzustellen,
  • Rufen Sie das Modell an einigen Beispielen auf.

Lass uns das machen!

Speicher und Daten einrichten

Das Wichtigste zuerst: S3 wird zum Speichern des Datensatzes und aller Artefakte verwendet (was für eine Überraschung). Lassen Sie uns dann ein paar Dinge erklären. Hinweis: Der S3-Bucket muss sich in derselben Region wie SageMaker befinden.

Für diese Implementierung von XGBoost müssen die Daten entweder im CSV- oder im libsvm-Format vorliegen. Versuchen wir Letzteres, kopieren Sie die resultierenden Dateien nach S3 und greifen Sie auf die SageMaker IAM-Rolle zu.

Gut aussehen. Nun richten wir den Trainingsjob ein.

Einrichten des Schulungsauftrags

Amazon SageMaker verwendet Docker-Container, um Schulungsaufträge auszuführen. Wir müssen den Containernamen auswählen, der der Region entspricht, in der wir ausgeführt werden.

Leicht genug. Zeit zum Konfigurieren des Trainings. Wir werden:

  • Erstellen Sie einen binären Klassifikator,
  • Abrufen der Trainings- und Validierungsdatensätze im libsvm-Format aus S3,
  • Trainieren Sie für 100 Iterationen eine einzelne m4.4xlarge-Instanz.

Das ist ein ziemlicher Schluck, aber keine Panik:

  • Parameter, die allen Algorithmen gemeinsam sind, werden in der Dokumentation zur CreateTrainingJob-API definiert.
  • Algorithmusspezifische Parameter werden auf der Algorithmus-Seite definiert, z. XGBoost.

Das Modell trainieren und speichern

OK, lass uns diese Party starten. Es ist Zeit mit dem Training zu beginnen.

6 Minuten später ist unser Modell fertig. Natürlich ist das für einen so kleinen Datensatz etwas lang :) Wenn wir jedoch Millionen von Zeilen hätten, hätten wir einen Schulungsjob auf mehreren Instanzen mit genau demselben Code starten können. Ziemlich cool, oder?

OK, lassen Sie uns dieses Modell in SageMaker speichern. Ganz einfach mit der CreateModel-API.

Endpunkt erstellen

Hier kommt der wirklich gute Teil. Wir werden dieses Modell bereitstellen und es aufrufen. Ja, genau so.

Zuerst müssen wir eine Endpunktkonfiguration mit der CreateEndpointConfig-API erstellen: Wir verwenden ein einzelnes m4.xlarge als Inferenz, wobei 100% des Datenverkehrs zu unserem Modell geleitet werden. .

Bereitstellen des Modells

Jetzt können wir unser trainiertes Modell mit der CreateEndpoint-API auf diesem Endpunkt bereitstellen.

Endpunkt aufrufen

Jetzt können Sie den Endpunkt aufrufen. Nehmen wir ein paar Beispiele (im libsvm-Format) aus dem Datensatz und sagen sie voraus.

Beide Stichproben werden korrekt vorhergesagt. Woohoo.

Fazit

Wie Sie sehen, unterstützt Sie SageMaker bei der vollständigen Durchführung Ihrer Maschinellen Lernprojekte: Experimentieren mit Notebooks, Modelltraining, Modellhosting und Modellbereitstellung.

Wenn Sie sich für andere Möglichkeiten interessieren, wie Sie SageMaker verwenden können (und wenn Sie nicht auf die unvermeidlichen zukünftigen Posts warten können!), Finden Sie hier eine Übersicht, die ich kürzlich aufgenommen habe.

Das war `s für heute. Vielen Dank fürs Lesen.

Dieser Monster-Post wurde geschrieben, während man immer wieder dieser legendären Foreigner-Show von 1981 zuhörte (es war ein langer Post).