KNIME Analytics Platform
Michael Berthold und Kollegen der Universität Konstanz entwickeln seit 2004 diese Data-Science-Plattform. KNIME Analytics steht als Open-Source-Software (Lizenz: GPL) zur Verfügung. Wir können es zur interaktiven Datenanalyse verwenden, ohne dass wir Programmierkenntnisse benötigen. Im Zentrum stehen Workflows, die wir grafisch aus den Programmbausteinen – den Knoten – modellieren. Dabei können wir die Daten aus verschiedenen Quellen über diverse Knoten einlesen, transformieren, analysieren, visualisieren und speichern. KNIME Analytics basiert auf der Plattform Eclipse und ist ebenfalls in Java programmiert. Die Bezeichnung KNIME steht übrigens für Konstanz Information Miner. KN ist auch das Autokennzeichen der Stadt Konstanz.
Anaconda/Python
Der Niederländer Guido van Rossum entwickelte Anfang der 1990er Jahre die Open-Source-Programmiersprache Python. Seit 2001 entwickelt die Organisation Python Software Foundation (PSF) die Programmiersprache weiter. Python zeichnet sich durch seine Einfachheit, Übersichtlichkeit und Erweiterbarkeit aus. Die Sprache kommt mit relativ wenigen Schlüsselwörtern (vereinfacht: Vokabeln) aus. Eine Besonderheit ist, dass wir Anweisungsblöcke durch Einrückungen (Tabs) strukturieren können. Mit dem Paketmanager PIP lassen sich Programmbibliotheken als zusätzliche Pakete vom zentralen Repository Python Package Index (PyPI) installieren. Im Bereich Data Science gibt es eine große Auswahl an wissenschaftlichen Bibliotheken. Die Python-Distribution Anaconda enthält bereits viele solcher Pakete und außerdem das Jupyter Notebook.
Reproduzierbarkeit
Die Forschung ist daran interessiert, mit identischen Daten und Berechnungsmethoden die gleichen Ergebnisse zu erzielen. Einige Methoden bzw. Algorithmen arbeiten jedoch mit Zufallszahlen. Diese sind aber nicht wirklich zufällig, sondern sie lassen sich ebenfalls reproduzieren. Hierzu können wir einen sogenannten Random Seed einstellen. Im Rahmen des Data Science Trainings setzen wir diesen Zahlenwert auf null. Damit erzeugen wir exakt die gleiche Folge von Zufallszahlen. Es handelt sich also eigentlich um Pseudozufallszahlen.
Die Ergebnisse sind jedoch nur dann reproduzierbar, wenn wir die gleichen Werkzeuge verwenden. Allerdings werden diese Tools fortlaufend weiterentwickelt. Die Versionen, die wir schließlich für das Data Science Training benutzt haben, sind:
- KNIME Analytics Platform Version 5.1.0
- Anaconda 3 Version 2023.09
Im Folgenden möchten wir unsere Erfahrungen zum Thema Reproduzierbarkeit kurz schildern. Die ersten Modelle trainierten wir bereits 2020 und zwar mit Hilfe der Werkzeuge:
- KNIME Analytics Platform Version 4.1.2
- Anaconda 3 Version 2020.02
Die Ergebnisse, die wir mit verschiedenen Versionen der KNIME Analytics Platform erzielten, sind weitestgehend auch mit älteren Versionen reproduzierbar. Die Namen einiger Knoten haben sich jedoch geändert: Aus Column Rename wurde Column Renamer, aus <Grafik> (local) wurde <Grafik> (legacy), wobei der Platzhalter <Grafik> für diverse grafische (blaue) Knoten steht: Pie Chart, Scatter Plot, Scatter Matrix, Box Plot, Histogram, Interactive Histogram, ROC Curve. In den Versionen 5.3 und 5.4 der KNIME Analytics Platform stehen neue Knoten für Row Filter und Row Splitter zur Verfügung. Die bisherigen tragen nun die Bezeichnungen Row Filter (deprecated) und Row Splitter (deprecated). Sie funktionieren aktuell aber nach wie vor und aus diesem Grund haben wir die Workflows noch nicht aktualisiert.
In der Python-Welt konnten wir die Ergebnisse mit unterschiedlichen Anaconda-Versionen nicht immer reproduzieren. Beispielsweise führen die Methoden k-Nearest Neighbor (kNN) [062, 063] und Multilayer Perceptron (MLP) [092] mit den Daten der Version 5 zu geringfügig anderen Trainings- bzw. Testresultaten. Die Technik Backward Feature Elimination (BFE) in Kombination mit der Methode Naive Bayes (NB) und den Daten der Versionen 7 und 8 [181] führen zwar zu ähnlichen Ergebnissen, kommen allerdings ohne das Feature Pclass_2 aus. Die Optimierungstechniken Randomized Search (RS) [193], Halving Grid Search (HGS) [194] und Halving Random Search (HRS) [195] führen in Kombination mit der Methode Gradient Boosting (GB) und den Daten der Version 9 allerdings zu sehr unterschiedlichen Ergebnisse. Das hätte prinzipiell Auswirkungen auf die Kapitel 20 und 21.
Warum kommt es zu diesen Abweichungen?
Ein allgemeiner Grund hierfür kann die unterschiedliche Implementierung (von Algorithmen) in verschiedenen Softwareversionen sein. Außerdem benutzen wir im Data Science Training normalerweise der Einfachheit halber zunächst immer die Default-Parameterwerte, wenn wir eine neue Methode kennenlernen und diese einsetzen. Diese Default-Parameter können für verschiedene Versionen der scikit-Bibliothek unterschiedlich sein. Beispielsweise ist die Kostenfunktion des Gradient Boosting Classifiers aktuell die LogLoss-Funktion, während sie ursprünglich die Summe der Abweichungsquadrate (deviance) war. Des Weiteren haben die Techniken HGS und HRS aktuell noch den Status „experimental“. Insofern können sich das Application Interface (API) und die Ergebnisse dieser Techniken ändern, ohne dass diese zuvor angekündigt wurden.
Für die nachfolgenden Versionen der Anaconda-Distribution 3 (ab 2024.02) erzielten wir dann weitestgehend reproduzierbare Ergebnisse verglichen mit der Vorgängerversion (2023.09). Bemerkenswert ist, dass das scikit-learn-Paket zunächst ein Downgrade erfuhr (1.3.0 => 1.2.2) und danach wieder angemessen aktualisiert wurde. Allerdings werden nun in einige Python-Funktionen Warnungen ausgegeben. Zwecks Kompatibilität und zukünftiger Erweiterbarkeit haben wir die aktuellen Quellcodes für diese Version als Gesamtarchiv in den Formaten RAR und ZIP ebenfalls bereitgestellt (siehe Anaconda/Python).
Die nachfolgende Tabelle enthält die Versionsnummern der Pakete bzw. Bibliotheken zu den verwendeten und getesteten Anaconda-Distributionen.
Anaconda 3 | 2020.02 | 2023.09 | 2024.02 | 2024.06 | 2024.10 |
conda | 4.8.2 | 23.7.4 | 24.3.0 | 24.9.1 | 24.11.0 |
python | 3.7.6 | 3.11.5 | 3.11.7 | 3.12.4 | 3.12.7 |
ipython | 7.12.0 | 8.15.0 | 8.20.0 | 8.25.0 | 8.27.0 |
notebook | 6.0.3 | 6.5.4 | 7.0.8 | 7.0.8 | 7.2.2 |
numpy | 1.18.1 | 1.24.3 | 1.26.4 | 1.26.4 | 1.26.4 |
pandas | 1.0.1 | 2.0.3 | 2.1.4 | 2.2.2 | 2.2.2 |
scipy | 1.4.1 | 1.11.1 | 1.11.4 | 1.13.1 | 1.13.1 |
scikit-learn | 0.22.1 | 1.3.0 | 1.2.2 | 1.4.2 | 1.5.1 |
matplotlib | 3.1.3 | 3.7.2 | 3.8.0 | 3.8.4 | 3.9.2 |
seaborn | 0.10.0 | 0.12.2 | 0.12.2 | 0.13.2 | 0.13.2 |
pickleshare | 0.7.5 | 0.7.5 | 0.7.5 | 0.7.5 | 0.7.5 |
imbalanced-learn | 0.6.1 | 0.10.1 | 0.11.0 | 0.12.3 | 0.12.3 |