Machine Learning mit Weka und Bayes’schen Klassifikatoren

Daniel Binggeli

Blogpostserie zu Machine Learning, Teil 1

Unser Daniel Binggeli setzt sich in der folgenden Blogpostserie mit dem Thema „Machine Learning“ auseinander. Bereits im Jahr 2010 hat er dieses Thema im Zuge seiner Bachelorarbeit vertieft behandelt. 

Bereits im 2010 habe ich mich ein erstes Mal intensiv mit der Thematik Machine Learning auseinandergesetzt. Heute möchte ich mir die Zeit nehmen, anhand eines einfachen Anwendungsfalls eine Implementation einer sich selbst optimierenden Zuweisung aufzuzeigen.

Der Anwendungsfall ist einfach, ich möchte meine laufenden Ausgaben im Griff haben und daher meine Ausgaben meinen Budgetpositionen zuweisen. In diesem ersten Blogpost möchte ich einen einfachen Lösungsweg aufzeigen und den gewählten Ansatz grob erläutern. In einem weiteren Post werde ich mich tiefer mit dem gewählten Algorithmus und der Java Implementation auseinandersetzen.

Doch zuerst einmal zum Ziel der hier aufgezeigten Lösung: Die Analyse meines Zahlungsverhaltens durch die Zuweisung der Zahlungen zu vordefinierten Budgetpositionen.

Ausgangslage

Als Ausgangslage habe ich;

  • eine Liste mit Zahlungen, die analysiert werden soll. Diese List besteht aus folgenden Teilen (Datum, Preis, Ort bzw. Geschäft)
  • eine Liste mit möglichen Budgetpositionen (Haushalt, Miete, Freizeit, Reisen, Essen, usw.)

Ich möchte, dass sich meine Software merkt welche Zuweisungen ich schon einmal in einer ähnlichen Form vorgenommen habe und bei neuen Zahlungen auf Basis meines Zuweisungsverhaltens einen Vorschlag erstellt. Ähnlich wie bei einem SPAM Analyseprogramm kann ich so meine Software trainieren und die Resultate sollten immer besser werden.

Mein „Analyse und Machine Learning Programm“ durchläuft dabei grob die folgenden Schritte;

  1. Vergleich der Zahlung mit einem Trainingsset (meine bisherigen Einkäufe mit der damaligen Zuweisung zu einer Budgetposition)
  2. Auswahl des wahrscheinlichsten Budgetpostens
  3. Anzeige des wahrscheinlichsten Budgetpostens und Anpassung durch Benutzer
  4. Erweitern der Trainingsdaten mit den neuen Erkenntnissen

blog_ml1

Bayes’scher Klassifikator

Es gibt somit einen Schritt des Lernens und einen Schritt des Suchens. Wobei natürlich zuerst einmal gelernt werden muss, bevor ich auch gute Zuweisungsresultate erhalten kann.

Als Grundlage für die Zuweisung der Zahlungen zu Budgetpositionen eignet sich ein Bayes’scher Klassifikator. Die Idee dabei ist ganz vereinfacht folgende; Jede Zahlung wird durch einen Feature-Vektor D repräsentiert. Jede Eigenschaft einer Zahlung (Preis, Datum usw.) ist ein Feature des Vektors D = (a1, a2, a3…). Nun wird anhand der im Trainingsset vorhandenen Vektoren für jeden möglichen Budgetposten die bedingte Wahrscheinlichkeit berechnet.

Da die Implementation der Klassifikation bereits durch Libraries zur Verfügung gestellt wird, habe ich mich für die Verwendung einer solchen entschieden.

WEKA

WEKA, eine im Bereich Data-Mining eingesetzte Klassenbibliothek in Java, bietet interessante Möglichkeiten zur Integration in Software-Lösungen. Da in WEKA sehr viele verschiedene Klassifikatoren integriert sind, habe ich mich für diese Library entschieden. So können später auch Optimierungen durch komplexere Klassifikatoren vorgenommen werden. WEKA wurde von der Universität von Waikato in Neuseeland erstellt und laufend erweitert. Es handelt sich dabei um eine Sammlung von data mining Algorithmen. Das tolle an WEKA ist, dass sowohl ein GUI für den Einsatz als Standalone-Software sowie die Möglichkeit, die Klassen direkt in Java einzusetzen besteht.

Da WEKA die nötigen Rechenoperationen vornimmt, ist es nur noch nötig, das Trainingsset und die Merkmals-Vektoren (Zahlungen) in eine für WEKA verständliche Form zu bringen. Dazu werden diese in Java-Objektstrukturen abgebildet und an das Klassifikations-Objekt übergeben. Allerdings müssen dazu noch alle Attribute einer Zahlung in ein definiertes Set von möglichen Werten umgewandelt werden.

Für meine Zahlungen habe ich daher folgende Sets definiert:

  • Datum (Montag, Dienstag, Mittwoch, Donnerstag, Freitag)
  • Geschäft (Lebensmittel, Sportartikel, Hobby, Online, Restaurants, ÖV…)
  • Betrag (klein 0-9, mittel 10-100, gross 100-1000, sehr gross > 1000)

Beispiel:

Meine Zahlung;

11.08.2016 Migros Eigerplatz 12.50

wird in folgenden Vektor umgewandelt;

D = (Donnerstag, Lebensmittel, mittel)
Für die Auswahl der Attribute habe ich dabei ganz einfache Methoden wie Regex-Pattern, Datums-Funktionen und Wertebereiche verwendet. Den damit definierten Vektor verwende ich nun für die Berechnung der Wahrscheinlichkeiten durch WEKA. Die Methode von WEKA braucht somit folgende Eingaben; Trainingsset, Vektor und die möglichen Budgetposten (Klassen).

In meiner konkreten Implementation sieht dieser Ablauf dann wie folgt aus;

 

Bild 3

 

Als Resultat erhalte ich von WEKA zu jedem Budgetposten eine berechnete Wahrscheinlichkeit für den gesuchten Vektor. Ich muss nun also nur noch den Budgetposten mit der höchsten Wahrscheinlichkeit auswählen und diesen anzeigen.

blog_ml3

Ich möchte nun die von der Software vorgeschlagenen Budgetpositionen noch korrigieren können. Da es sich bei der Lösung ja um eine selbst-lernende Zuordnung handeln soll, ist es wichtig, dass ich die Zuordnung auch weiter trainiere. Alle geprüften Budgetzuordnungen füge ich daher wieder meinem Trainingsset, welches ich für die nächste automatisierte Zuordnung durch WEKA verwende, zu.

Ich werde in einem späteren Blogpost auf die Berechnung mittels Bayes Klassifikation und auf die konkrete Java-Implementation meiner Lösung eingehen.

Für alle, die nicht so lange warten möchten, stehen alle Informationen und eine lauffähige PHP Implementation aus dem Jahre 2010 auf Sourceforge zur Verfügung.

Hier den zweiten Teil der Blogpostserie lesen. 

Hier den dritten Teil der Blogpostserie lesen. 

Kommentare sind geschlossen.