© ProStockStudio/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ät garantiert. In den folgenden Abschnitten stellen wir nicht nur häufige schlechte Gewohnheiten vor, die die Komplexität erhöhen, sondern auch gute Gewohnheiten, die den Umgang mit Komplexität erleichtern.

Ordnung im Code halten

Unordentlicher Code ist kompliziert, weil er sich nur schwer verstehen und ändern lässt. So wird das Ändern von Code als Reaktion auf Geschäftsanforderungen immer schwieriger und manchmal sogar unmöglich. Eine dieser schlechten Programmiergewohnheiten (auch Code Smell genannt) ist toter Code. Dabei handelt es sich um Code, der ausgeführt wird, dessen Ergebnis aber in keiner weiteren Berechnung verwendet wird. Eine überflüssige Sache, die Entwickler*innen beim Programmieren im Kopf behalten müssen. Zur Veranschaulichung zwei Codebeispiele in Listing 1 und Listing 2.

Listing 1

# bad example df = get_data() print(df) # do_other_stuff() # do_some_more_stuff() df.head() print(df.columns) # do_so_much_stuff() model = train_model(df)

Listing 2

# good example df = get_data() model = train_model(df)

Vorgehensweisen für sauberen Code wurden bereits ausführlich für mehrere Sprachen [2] beschrieben, einschließlich Python [3]. Wir haben diese Grundsätze für „Clean Code“ angepasst. Sie finden sich auch unter [4]:

  • Design (Codebeispiele unter [5])

  • Interna nicht offenlegen (...

Neugierig geworden? Wir haben diese Angebote für dich:

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