Machine Learning mit Apache Spark 2

Apache Spark bietet ausgereifte Werkzeuge für das Umsetzen von Software im Bereich maschinelles Lernen. Ein Beispielprojekt zeigt Bilderkennung für handgeschriebene Ziffern.

In Pocket speichern vorlesen Druckansicht 5 Kommentare lesen
Maschinelles Lernen mit Apache Spark 2
Lesezeit: 15 Min.
Von
  • Heiko Spindler
Inhaltsverzeichnis

Die Vernetzung der Welt und mit ihr die Komplexität nehmen stetig zu. Der Bedarf, gute Entscheidungen schneller zu treffen, führt zu mehr Automatisierung. Intelligente Software erobert den Alltag mit Methoden des maschinellen Lernens. Sie reicht von einfachen statistischen Verfahren bis hin zu komplexen neuronalen Netzen, die aufwendig trainiert werden.

Menschliches Denken bringt erstaunliche Leistungen hervor, die den "Nutzern" nicht bewusst sind. Das stellt Daniel Kahneman in seinem Buch "Schnelles Denken, langsames Denken" auf lesenswerte Weise vor [1]. Die Softwareentwicklung hat sich viele Jahre schwer getan, ansatzweise intelligente Systeme zu erstellen, und sich dabei auf die Automatisierung von Routineaufgaben beschränkt. Komplexe Tätigkeiten wie das Bewerten von Informationen und das Treffen von Entscheidungen blieben bisher die Domäne der Menschen. Das scheint sich aktuell zu ändern.

Die Kosten für Rechenleistung und Speicherplatz sinken, und spezielle Hardware wie GPUs beschleunigen das verteilte Rechnen. Big Data liefert die technischen Grundlagen für das Verarbeiten riesiger Datenmengen, und Frameworks wie Apache Spark bieten einen standardisierten, einfachen Einstieg in die Umsetzung lernender Algorithmen.

Maschinelles Lernen hat das Ziel, Methoden zu liefern, die durch Training aus Daten Modelle ableiten, die danach für neue Eingaben Vorhersagen treffen ("predictive computing"). Die wirklichen Zusammenhänge, die im Modell stecken, bleiben meist im Detail unbekannt oder schwer nachvollziehbar. Am Ende zählt nur, dass es funktioniert.

Folgende Liste zeigt eine kleine Auswahl möglicher Einsatzbereiche:

  • Das Aufkommen elektronischer Zahlungen wächst rasant. Es wird wichtig, Nutzungsmuster automatisch zu analysieren, um Betrugsversuche zu verhindern (Fraud Detection).
  • Mit Assistenten wie Google Now, Siri und Alexa hält die Spracherkennung (Speech Recognition) Einzug ins tägliche Leben.
  • Bilder oder Teile automatisch zu erkennen (Image Recognition), ist eine Basisfunktion vieler Bereiche. Autonomes Fahren ist ohne diese Grundlage kaum möglich.
  • Unternehmen sind an der Meinung ihrer Kunden interessiert: Algorithmen sichten massenweise Bewertungen oder Kurznachrichten und erkennen frühzeitig Trends (Sentiment Analysis) und leiten Aktionen ein.
  • Unter dem Schlagwort "Industrie 4.0" erobert die Informatik erneut die Produktion in allen Branchen. Zusätzlich zur Automatisierung der Abläufe analysiert Software massenhaft Sensoren, um früh auf Defekte oder Abnutzung zu reagieren.

Nach der ersten Idee zu einem Projekt teilt sich die Umsetzung meist in zwei Phasen: Aus der großen Menge an Verfahren ist die passende Variante zu wählen. Manche erfordern für das Training klassifizierte (gelabelte) Daten: Jeder Datensatz muss das gewünschte Resultat enthalten. Somit steckt oft viel Aufwand im Beschaffen und Aufbereiten qualitativ hochwertiger Trainings- und Testdaten.

Die meisten Verfahren erfordern umfangreiche Konfigurationen. Gute Ergebnisse erreichen Forscher oft nur durch Experimente mit unterschiedlichen Einstellungen. Nach dem Training ist das Ergebnis ein Modell, in dem Wissen über die Zusammenhänge der vorgelegten Daten steckt. Die Qualität sollte ein Lauf mit separaten Testdaten prüfen, die nicht Teil des Trainings sind. Liefert das Modell auch dafür gute Ergebnisse, kann es in die zweite Phase übergehen.

Jetzt trifft das trainierte Modell Vorhersagen auf neuen, echten Produktionsdaten. Die Ergebnisse sind anschließend Grundlage für weitere Geschäftsprozesse. Die folgende Abbildung zeigt die zwei Prozesse mit beiden Phasen:

Ablaufschema Machine-Learning-Projekte (Abb. 1)

Allein das Training kann bei komplexen Modellen und großen Datenmengen lange dauern – Stunden oder Tage sind keine Ausnahme. Dagegen ist das Anwenden meist weniger zeitaufwendig.

Spark hat in den letzten Monaten deutlich an Popularität gewonnen, und das Entwickler-Team veröffentlicht regelmäßig neue Funktionen. Derzeit ist die zweite Hauptversion verfügbar, über die heise Developer ausführlich berichtet hat (BEITRAG 1869067). Spark 2.1 enthält ein Beispiel zur "linearen Regression", das aus Datenpunkten einen Trend ableitet. Man kann dieses Beispiel als "Hello World" des Machine Learning ansehen.

Das umfangreiche Machine-Learning-Paket spark.ml bietet einen einfachen Einstieg in das Thema mit vielen vordefinierten Algorithmen und mächtige Transformatoren für das Aufbereiten der Daten. Über das Pipeline-Konzept lassen sich einzelne Schritte als Abläufe konfigurieren, optimieren und speichern. Trainierte Modelle lassen sich zwischen Entwicklung und Produktion und sogar zwischen den von Spark unterstützten Sprachen (Scala, Java, Python und R) austauschen.

Da Spark auf Scala basiert, nutzen die meisten Beispiele diese JVM-Sprache. Mit Java 8 und Lambdas ist die Spark API mittlerweile elegant einsetzbar. Der Overhead anonymer Klassen entfällt inzwischen.

Das für den Artikel verwendete Beispiel soll handgeschriebene Ziffern erkennen. Letztlich handelt es sich um eine Klassifizierung. Um es einfach zu halten, ist es ein eigenständiges Programm – die Konfiguration der Spark-Bibliotheken erfolgt mit Maven. Der Quellcode ist ebenso auf GitHub zu finden wie die Trainingsdaten und die Log-Ausgaben zu allen Beispielen.

Der MNIST-Datensatz des National Institute of Standards and Technology umfasst 60.000 Trainings- und 10.000 Testbilder. Jedes der 28 mal 28 Punkte großen Bilder zeigt eine Ziffer (0 bis 9) in Graustufen (Werte 0 bis 255). Die Daten liegen im CSV-Format im Verzeichnis "Resources". Über die MNIST-Projektseite finden sich zusätzliche Dateiformate. Das Feld label in der ersten Spalte dokumentiert die korrekte Ziffer. In den folgenden 784 Spalten liegen die Daten für die Bildpunkte:

label,p0,p1,...p783
7,0,0,...,0,84,185,159,151,60,36,0,0,..,0

Beispiele für Ziffern aus dem MNIST-Bestand (Abb. 2)

Grundsätzlich implementiert das Beispiel folgende Schritte:

  • Einlesen der Daten
  • Vorbereiten der Daten: Zerlegen in Label und Feature-Vektor
  • Konfigurieren des ML-Algorithmus
  • Trainieren des Modells
  • Prüfen des Modells mit Testdaten
  • Auswertung