Cookie Consent by FreePrivacyPolicy.com rheindata GmbH | Konstruktion eines Machine Learning-Modells mit Python Konstruktion eines Machine Learning-Modells mit Python

Konstruktion eines Machine Learning-Modells mit Python


Stephan NeureiterDas rasante Wachstum in der Welt des maschinellen Lernens bringt nicht nur bessere Methoden für die Erstellung von Modellen mit sich, sondern vereinfacht auch den Prozess diese Modelle bereitzustellen. So können Machine Learning Lösungen schneller produktiv gesetzt werden, womit sie auch schneller nützliche Ergebnisse für das Unternehmen liefern können. Wie einfach dieser ganze Prozess ist zeigen wir in zwei Blog-Posts.

Wir beginnen in diesem ersten Post mit der Konstruktion verschiedener Machine Learning Klassifikatoren, inklusive Gradient Boosting Ansätzen. Zusätzlich gehen wir auch auf einige wichtige Punkte der Modellkonstruktion ein, wie Datenexploration, Feature Extraktion, Dimensionsreduktion, Kreuzvalidierung von Modellen und die Validierung der Modellergebnisse. Alle Daten zum Beispiel finden Sie unter diesem Gitlab-Link.




Erstellung Eines Machine Learning Modells


Datenexploration

Beginnen wir mit dem wichtigsten Teil der Datenanalyse, den Daten. Für dieses Beispiel wird ein Datensatz genutzt, der sich für die Analyse der Abwanderungsquote von Kunden (Customer Churn) eignet. Der Datensatz bietet Vertragsdaten und demographische Variablen eines Telekommunikationsanbieters, welche in den ersten drei Quartalen des Jahres erhoben wurden. Zudem wurde festgehalten, welche Kunden im letzten Quartal das Unternehmen verlassen haben. Demnach bietet der Datensatz eine gute Grundlage für ein Vorhersagemodell, auf Basis dessen wir Kunden identifizieren können, die daran denken den Anbieter zu wechseln. Diese Kunden könnten dann gezielt mit interessanten Rabattangeboten kontaktiert werden, um so die langfristige Kundenbindung (Customer Retention) zu steigern. Die Zielsetzung ist hier also ein Supervised Learning Modell zur Klassifikation von abwanderungsgefährdeten Kunden.

Supervised Learning allgemein befasst sich mit Daten und Fragestellungen, welche sowohl Informationen auf erklärenden Variablen bieten als auch auf mindestens einer Ergebnisvariable. So können Modelle zur Regression oder Klassifikation geschätzt werden, die versuchen die Ergebnisvariable anhand der erklärenden Variablen vorherzusagen (Input-Output Mapping).

Das Gegenteil bietet das Unsupervised Learning, welches bei Fragestellungen ohne bekannte Zielvariable eingesetzt wird, um bisher unbekannte Muster oder Zusammenhänge in Variablen zu finden (z.B. Clustering, Anomalieerkennung). In unserem Beispiel haben wir aber Informationen über den Ausgang des interessanten Prozesses und können ein Klassifikationsmodell bauen.

Nun kommen wir zur Datenexploration

  • Die Zielvariable Churn ist binär kodiert und hält fest, ob jemand das Unternehmen im Beobachtungszeitraum verlassen hat oder nicht.
  • Weiterhin gibt es deutlich mehr Personen, welche dem Unternehmen treu blieben, als Personen, die abgewandert sind (unbalanced data).
  • Es gibt einige numerische Variablen zur Länge der Kundenbeziehung und der Höhe der geleisteten Zahlung.
  • Der Rest der Variablen befasst sich hauptsächlich mit der Vertragsart oder damit, ob der Kunde einen entsprechenden Service gewählt hat (z.B. mehrere Telefonleitungen, Glasfaseranschluss, TV-Streaming Paket, …).

Die numerischen Variablen sollten für manche Modelle skaliert werden, da beispielsweise eine logistische Regression sensibel auf unterschiedliche numerische Maßstäbe reagiert.

Der Rest der Variablen wird zu binären Dummy-Variablen umkodiert (one-hot-encoding). Das bedeutet alle Ausprägungen jeder Variable werden in einzelne Variablen zerlegt mit dem Wert 1, wenn der Fall zutrifft, und dem Wert 0, wenn der Fall nicht zutrifft. Beispielsweise wird die Variable Vertrag mit drei Ausprägungen in drei binäre 1/0 Variablen zerlegt. Die volle Datenexploration lässt sich in Gitlab als Jupyter Notebook finden.

Dimensionsreduktion

Nach einer ersten Betrachtung der Zusammenhänge wollen wir nun verschiedene einfache ML-Learning Modelle anwenden, um die hohe Anzahl der Variablen/Features zu reduzieren. Dies wird später angewandten, komplexeren Modellen, die viel Rechenzeit in Anspruch nehmen, zugutekommen.

Zuerst werden die Daten zufällig in ein Train- und ein Test-Set verteilt. Die Train-Daten werden, wie der Name schon sagt, zum Trainieren des Modells verwendet und die Test-Daten werden am Ende zur Validierung des Modells verwendet.

Danach beginnen wir mit einem einfachen logistischen Regressionsmodell, welches die Verteilung einer diskreten Variable modelliert oder besser gesagt die Wahrscheinlichkeit errechnet, ob ein gewisser Zustand eintritt.

Zusätzlich nutzen wir auch noch einen Random Forest Klassifikator. Dieses Klassifikationsverfahren basiert auf der Logik von Entscheidungsbäumen und es werden hier mehrere unkorrelierte Bäume auf Basis von Zufallsstichproben unserer Daten erstellt und eine durchschnittliche Klassifikation gebildet (Bagging).

Diese simplen Modelle bieten uns zwar nicht die genaueste Klassifikation, aber sie eignen sich sehr gut für eine kurze Dimensionsreduktion mit Recursive Feature Elimination. Hierbei wird den einzelnen Variablen eine Rangfolge für ihre Bedeutung an dem Ausgang der Klassifikation gegeben, was es uns erlaubt nur die wichtigsten Variablen für weitere Modelle zu behalten.

Sowohl bei der logistischen Regression als auch bei unserem einfachen Random Forest Klassifikator überschneiden sich die meisten Variablen mit denen, welche schon in der Exploration als bedeutend wahrgenommen wurden. So können wir den ursprünglichen Dimensionsraum auf nur elf relevante unabhängige Variablen reduzieren und verlieren trotzdem nur weniger als 0,5% Genauigkeit in der finalen Klassifikation.

Für neue Vorhersagen benötigt das Modell nun nur noch elf Variablen. So lässt sich der Aufwand in der Datensammlung für zukünftige Vorhersagen verringern.

Cross-Validation

Bevor wir mit dem finalen, komplexeren Modell beginnen müssen wir uns noch einem Problem widmen. Denn die zufällige Einteilung der Personen zu Train- und Test-Gruppe könnte potenziell zu einem Modell führen, welches untypische Vorhersagen trifft aufgrund einer zufälligen, aber auch untypischen Selektion von Trainingsfällen. Beispielsweise wäre es möglich in einer Zufallsziehung fasst nur Kunden zu selektieren, die nicht abwandern, wodurch wir nichts über Abwanderungskriterien erfahren würden. Dieses Modell würde zwar gute Vorhersagen für die Trainingsdaten liefern, aber sich nicht auf die Allgemeinheit generalisieren lassen, das sogenannte Over-fitting. Um dies zu verhindern sollte man eine Form der Kreuz-Validierung, oder Cross-validation, anwenden.

In unserem Beispiel verwenden wir die sehr kompliziert klingende Repeated-Stratified-K-Fold Cross Validation. Aber lassen Sie sich nicht vom Namen abschrecken. K-Fold bedeutet nur, dass das Test-Set in K Untergruppen (Folds) zerlegt wird, von denen jeweils eine als Pseudo-Test-Set dient, während die anderen die respektiven Trainingsdaten spielen.

Hier wird das Modell für jede Kombination der Folds neu berechnet und bewertet. Die Modellgüte wird dabei beispielweise durch den durchschnittlichen Prozentsatz der korrekten Schätzungen bestimmt.

Die Stratifizierung in Repeated-Stratified-K-Fold sorgt dafür, dass das Verhältnis von Personen, die das Unternehmen verlassen und die bei dem Unternehmen bleiben, in etwa gleich bleibt für jede Untergruppe. Dieser Prozess kann wiederholt durchgeführt werden, um einen stabileren Durchschnittswert zu bekommen.

Finales Modell

Jetzt können wir mit der Validierung eines finalen Modells beginnen, indem wir verschiedene Modelle trainieren. In unserem Fall konnten AdaBoost, LightGBM und CatBoost Klassifikatoren den Prozentsatz der korrekt vorhergesagten Fälle erhöhen, verglichen mit den einfachen Modellen aus dem Dimensionsreduktionsteil.

AdaBoost, LightGBM und CatBoost basieren auf der Logik von Entscheidungsbäumen und sind sogenannte Gradient Boosting Ansätze. Die Grundidee ist hierbei mehrere schwache Klassifikatoren zu einem starken Klassifikator zu vereinen. Alle drei Modelle zeigen nach kurzer Anpassung der Modellparameter, wie z.B. Lernrate, Anzahl der Schätzer (Dies nennt man übrigens Hyperparametertuning) ähnliche Modellgüte in der Kreuzvalidierung und treffen etwa 82% korrekte Vorhersagen in den Testdaten.

Da in unserem Fall kein bedeutender Unterschied in der Modellgüte zwischen den Modellen besteht, wählen wir den CatBoost-Klassifikator für das weitere Vorgehen als Beispiel aus.

Nachdem wir unser bestes Modell ausgewählt haben muss dieses gespeichert werden, um für die Weiterverwendung, z.B. für ein Cloud Deployment, bereitgestellt zu werden. Hierbei können Libraries wie Pickle oder Joblib hilfreich sein. Pickle speichert das Modell mit allen nötigen Parametern, Koeffizienten oder Gewichten als Binärdatei, die nur maschinenlesbar ist. Damit kann das Modell an anderer Stelle wieder geladen werden und ist direkt bereit für weitere Schätzungen.



Zusammenfassung

In unserem Beispiel haben wir mit einem Datensatz begonnen, aus dem wir Rückschlüsse über die Abwanderung von Kunden schließen wollten, um schlussendlich handlungsrelevante Vorhersagen zu treffen. Nach der Datenexploration wurden die relevantesten Variablen mittels Recursive Feature Elimination extrahiert. Diese konnten dann zur Konstruktion verschiedener Gradient Boosting Klassifikatoren genutzt werden. Die Modellgüte wurde ebenfalls mit Cross-Validation getestet. Als nächsten Schritt könnte man sein eigens erstelltes Modell auf einem Cloud Service, wie der Google Cloud Plattform bereitstellen. Wie das geht, erfahren Sie in diesem Artikel.