© Excellent backgrounds/Shutterstock.com
Code in Machine-Learning-Modellen: Komplexität vermeiden

Kampf den schlechten Gewohnheiten


Es ist bekannt, dass der Code für Machine Learning (ML) schnell unordentlich [1] werden kann. Mit welchen Techniken lassen sich schlechte Programmiergewohnheiten vermeiden, die den Code unnötig kompliziert machen? Und welche Methoden erleichtern den Umgang mit der Komplexität?

Code, mit dem ML-Modelle trainiert werden sollen, wird normalerweise in Jupyter Notebooks geschrieben. Er steckt zum einen voller nebensächlicher Elemente (z. B. Druckanweisungen, gut lesbare DataFrames und Datenvisualisierungen), zum anderen voller Glue-Code ohne Abstraktionen, Modularisierung und automatisierte Tests. In einem echten Projekt führt das zu einem Chaos, das niemand mehr überblicken kann. Schlechte Programmiergewohnheiten resultieren in schwer verständlichem Code, dessen Änderung mühsam und fehleranfällig ist. Für Data Scientists und Entwickler*innen wird es dadurch immer schwieriger, ihre ML-Lösungen weiterzuentwickeln.

Wodurch wird Code kompliziert?

Komplex ist etwas, das aus mehreren miteinander verbundenen Teilen besteht. Mit jedem beweglichen Teil, das wir ergänzen, machen wir den Code komplexer und müssen wir ein weiteres Element im Auge behalten. Zwar können wir der grundlegenden Komplexität eines Problems nicht entgehen, doch machen wir die Dinge oft unnötig kompliziert und erhöhen die kognitive Belastung, zum Beispiel mit den folgenden schlechten Angewohnheiten:

  • Fehlende Abstraktionen: Schreiben wir den gesamten Code in ein einziges Python-Notebook oder -Skript, ohne ihn in Funktionen oder Klassen zu abstrahieren, zwingen wir die Leser*innen, viele Zeilen Code zu lesen, um das „Wie“ zu verstehen und herauszufinden, wozu der Code dient.

  • Lange Funktionen, die mehrere Dinge erledigen: Wir müssen Zwischenzustände von Datentransformationen im Kopf behalten, während wir an einem anderen Teil der Funktion arbeiten.

  • Verzicht auf Unit-Tests: Beim Refactoring können wir nur durch den Neustart des Kernels und die Ausführung des/der gesamten Notebooks überprüfen, ob alles noch funktioniert. Wir müssen uns mit der Komplexität der Codebasis auseinandersetzen, selbst wenn wir nur an einem kleinen Teil davon arbeiten möchten.

Komplexität ist unvermeidlich, aber sie lässt sich aufgliedern. Für Datenbereinigung, Feature Engineering, Fehlerkorrekturen, Verarbeitung neuer Daten usw. wird laufend neuer Code hinzugefügt. Wenn wir unsere Codebasis nicht sorgsam pflegen und regelmäßig Refactorings vornehmen (wofür wir allerdings Unit-Tests brauchen), sind Unordnung und Komplexitä...

Neugierig geworden?

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang