Wer meine früheren Blogeinträge gesehen hat, der weiß, dass ich sowohl ein großer Fan von R als auch von Python in der täglichen Arbeit bin.
So mächtig R auch im Funktionsumfang für Datenanalyse und Modellierung ist, so schnell wird der Elan beim "number crunching" auch gedämpft, wenn der Arbeitsspeicher auf Oberkante läuft.
Eine schöne Serverinstallation mit viel Blech (z. B. 96 Gig-RAM) wirkt dabei Wunder.
Da diese Option nicht immer zur Verfügung steht, habe ich aus der Not eine Tugend gemacht und mich der performanteren Alternative, nämlich den Python-basierten R-Alternativen zugewandt, zumal ich eh schon seit langem Python für ETLs und Datenaufbereitungen einsetze.
Python-basierte R-Alternativen
Klingt leichter gesagt als getan. Wie so häufig im Open-Source-Umfeld offenbarte sich dort ein neues Ökosystem an Tools mit einer reichhaltigen, exotischen und internationalen Flora an Code-Gewächsen.
Es war auf den ersten Blick gar nicht so einfach, die Abkürzungen für die einzelnen Tools und ihre Schwerpunkte klar voneinander abzugrenzen. Zusätzlich wurde auch sehr schnell klar, dass die Motivationen für die Entwickler und die fachlichen Hintergründe der ersten User ganz klar andere waren als die eines SPSS- oder SAS-Jockeys. Sie waren ganz klar an Machine Learning orientiert. Damit meine ich z. B.:
- Deutlich technische Orientierung: mehr Möglichkeiten, wieder selbst auf Low-Level-Ebene die Daten zu beeinflussen. Die Nähe zur zugrunde liegenden Implementierung in C ist zu spüren und die explizite Wahl von Datentypen wird gefördert und zahlt sich wieder aus.
- Hohe Akzeptanz von Black-Box-Verfahren (bei scikit): Der Zweck heiligt die Mittel und wenn ein Scoring mit einem exotischen Verfahren bessere Performance liefert, dann ist das auch dann in Ordnung, wenn ich das Zusammenspiel der Prädiktoren nicht simpel veranschaulichen kann.
- Brute Force führt zum Ziel: Sowohl die bereits ab Werk vorhandene Möglichkeit für Parallelisierung wie auch die Grid-Search-Verfahren zur Parameteroptimierung bringen den User schnell in Versuchung, die CPUs einfach mal aufglühen zu lassen. :-)
Machine Learning in Python hat diese Punkte nicht für sich allein reserviert, da sie genauso auch für R-Nutzung zutreffen können, wenn auch häufig nur mit entsprechenden Erweiterungen. Es ist vielmehr mein subjektiver Eindruck, der entsteht, wenn ich die Dokumentationen, die Tutorials und die Schwerpunkte der Funktionsumfänge sehe. Allein wenn man sich das Cheat-Sheet für scikit-learn-Algorithmen zu Gemüte führt, sieht es auf den ersten Blick so aus, als würden herkömmliche Regressionsverfahren gar nicht auftauchen. Es wird direkt der Sprung zu regularisierten Methoden gemacht und statt logistischer Regression werden SVMs für ein binäres Klassifikationsproblem nahegelegt.
Auch wenn dieses ganze Sammelsurium an Python-Modulen etwas wirr und unzugänglich erscheint - ein Korb voller Schlangen -, sehe ich in dieser Technologie gewaltiges Potential. Es ermöglicht sehr performante, formal stringente, höchst automatisierbare, zu großen Anwendungen skalierbare und leicht deploybare Machine-Learning-Anwendungen.
Python-Module: Übersicht an Paketen
Folgende Auflistung von Elementen soll für Einsteiger eine kleine Orientierungshilfe durch den Jungle an Abkürzungen geben:
NumPy
NumPy stellt höchst performante Datenstrukturen bereit. Es eignet sich hervorragend für die Verarbeitung von Daten in sehr umfangreichen Vektoren und Matrizen. Die Grundlagen wurden in C und Fortran implementiert, worauf die gute Performance zurückzuführen ist.
NumPy beinhaltet auch bereits Möglichkeiten zu mathematischen Berechnungen, dies gehört aber nicht zum primären Einsatzzweck.
Die Datentypen und Datenstrukturen von NumPy bilden die Grundlagen für alle weiteren hier aufgeführten Python-Technologien.
SciPy
SciPy setzt auf NumPy auf und erweitert es um Möglichkeiten für Scientific Computing. SciPy mit NumPy darunter kann sozusagen als kleine Python-Alternative für Matlab gesehen werden.
Für das alltägliche Analysieren oder im Bereich von Machine Learning ist SciPy direkt eher uninteressant.
Pandas
Pandas baut ebenfalls auf NumPy auf und verbessert die Usability hin auf Datentransformation und Analyse.
NumPy-Strukturen werden in Objekte verpackt, die den R-Datentypen recht ähnlich sind. Es gibt also Series (R-Vektoren) und Dataframes. Das Subsetting/Filtern, Neuberechnen von Variablen, Aggregieren und Verknüpfen von Dataframes funktioniert relativ intuitiv und ist von der Bedienung ganz klar an R angelehnt.
Pandas-Objekte erleichtern die Arbeit, indem sie über Methoden zur deskriptiven Statistik und zur Visualisierung verfügen. Die Standards für eine explorative Datenanalyse sind also schon gleich mitgeliefert. Es lohnt sich bei der Fülle an Methoden ab Werk, öfter mal die Doku zu überfliegen.
scikit-learn
Dieses Paket ist die zentrale Machine-Learning-Bibliothek von Python. Sie bietet viele moderne Verfahren für jeden Bereich des Machine Learnings. Dadurch, dass jede Art der Modellierung über dasselbe Interface angesprochen wird, kann man sehr einfach mit noch generischerem Code als in R verschiedene Modelle gegeneinander testen. Bemerkenswert ist auch das beinhaltete Set an Standardtools für Variablentransformationen.
Ein Wermutstropfen dabei ist die Tatsache, dass die scikit-Modellierung zunächst nur modelliert und nicht viel mehr macht. Es gibt keine Modellzusammenfassung, keine Charts, selbst einfachste Diagnostiken wie die Residuen muss man sich z. T. selbst berechnen und so fort.
Der Name scikit stammt von "SciPy Toolkit". Es wurde also ausgehend von SciPy entwickelt, da SciPy selbst nicht über entsprechende Methoden verfügt.
Statsmodel
Statsmodel ist eine sehr neue Alternative zu scikit-learn, die deutlich näher an R angelehnt ist und den Schwerpunkt mehr auf klassische Modellierung bzw. Datamining legt. Hier erhält man nach Berechnung eines Modells eine schöne Zusammenfassung mit einer nützlichen Auswahl an Kennzahlen. Das Modellobjekt enthält auch viele weiterverwertbare Berechnungen, wie man es aus R gewohnt ist. Es existiert sogar ein Interface, das Modellformeln in derselben Notation wie in R akzeptiert.
IPython
IPython ist zunächst eine interaktive Kommandozeile für Python. Die intelligente Autovervollständigung erleichtert das Explorieren von Daten dramatisch.
Man darf die Konsole aber nicht automatisch mit dem IPython Notebook gleichsetzen. Das Notebook hebt die IPython-Konsole nochmals auf eine webbasierte Arbeitsumgebung, die viele Usability-Features enthält, Charts und Output während des Arbeitens im Code visualisiert und Veröffentlichungsmöglichkeiten im Sinne von "reproducible research" bietet. Wer also eine Python-Alternative zu Rs knitr sucht, landet zwangsläufig beim IPython Notebook.
matplotlib
Machine Learning unter Python ist erst eine richtig runde Sache mit schicken Visualisierungen und hier springt matplotlib in die Bresche. Die Grafikbibliothek, die ursprünglich unabhängig von den oben genannten Technologien entstand, ermöglicht mit ausreichendem Skill des Entwicklers jede erdenkliche Visualisierung, da alle noch so kleinen Objekte in einem Chart selektierbar und modifizierbar bleiben. Gleichzeitig bietet es aber auch für Einsteiger genügend "High-Level"-Funktionen, um schnell die ersten Charts auf Publikationsniveau zu erstellen.
Produktionsreife
Der Hype mit Machine Learning in Python startete wohl erst so richtig parallel zum Buzzword "Data Science". Das soll aber nicht den Eindruck erzeugen, dass die aufgeführten Technologien ebenso brandneu sind. Im Gegenteil, die meisten Module, mit Ausnahme von Statsmodels, reichen in der Historie viel weiter zurück und numpy z. B. kann auf 20 Jahre zurückblicken.
Ich selbst habe beispielsweise matplotlib vor etwa 7 Jahren bereits produktiv für Präsentationscharts eingesetzt. Man kann mittlerweile durchaus behaupten, dass für einen fachkundigen User die Technologien an einem belastbaren Entwicklungsstand angelangt sind. NumPy und Pandas werden unter anderem auch in der Finanzwelt eingesetzt, und da ist Belastbarkeit definitiv kein bloßes "Nice-to-have". Mein Hinweis auf "fachkundige User" begründet sich damit, dass man aktuell noch häufig mit nicht sehr schlüssigen Fehlermeldungen konfrontiert wird und ein gewisser Erfahrungsstand sehr hilfreich ist, um das Problem zu umschiffen.
Einstieg
Schwieriges Setup
Wenn man selbst diese Technologien ausprobieren möchte, scheitert man leider ziemlich sicher schon bei der ersten Installation von Paketen, unter Windows zumindest. Normalerweise reicht auf einer aktuellen Python-Installation ein Befehl wie "pip install sklearn". Dieser bricht aber wieder ab, wenn nicht ein Sammelsurium an Compilern, z. B. Visual Studio, installiert ist. Solange man keinen Informatikhintergrund besitzt und Ähnliches anderweitig benötigt, möchte man seine Installation nicht mit diversen Compilern zumüllen. Eine Alternative wäre eine Installation von bereits kompilierten inoffiziellen Binaries, wie ich es gelöst habe.
Anaconda
Der beste Einstieg dagegen ist vermutlich gleich die Installation einer erweiterten Python-Distribution wie Anaconda. Diese beinhaltet alle oben genannten Pakete und noch viel mehr. Sie ist etwas umfangreicher als eine normale Python-Installation, dafür ist der Umfang für Datenanalyse maßgeschneidert und es sind sogar von Continuum Analytics Enterprise-Versionen verfügbar.
Ausblick
Der Überblick hier ist natürlich nur eine subjektive Sicht ohne Anspruch auf Vollständigkeit. Abgesehen davon entwickelt sich die Python-Community so schnell, dass der Post morgen schon wieder veraltet ist.
Ich hoffe, dieser Post hat dennoch Interessierten geholfen, sich etwas im Jungle der Begrifflichkeiten zurechtzufinden.