Zum Inhalt springen

~/teaching · machine learning · referenz

Der Code jedes Modells: importieren, per API herunterladen, anpassen, vorhersagen

Ein Referenz-Foliensatz, den man Zeile für Zeile liest und dann in einem Notebook erneut ausführt

Zusammenfassung

Dieser Foliensatz ist das Referenzdokument des Kurses Machine Learning an der Centrale Méditerranée (Schwerpunkt DDEFI, 2026-2027). Er ist keine Vorlesung: Er ist die Seite, die man neben dem Notebook offen hält. Für jedes Modell des Kurses liefert er ein vollständiges Python-Listing, vom ersten import bis zum letzten print, mit öffentlichen Daten, die der Code selbst aus dem Internet holt, und daneben die Ausgabe, die das Listing bei seiner Ausführung am 12. Oktober 2026 tatsächlich erzeugt hat.

Er richtet sich an Studierende, die bisher wenig programmiert haben. Er beginnt mit den sechs Python-Bausteinen, die man braucht, um jedes Listing zu lesen, zeigt, was aus einem Text, einem Bild, einem Ton oder einem Video in einer Maschine wird, und erklärt, wie man Daten über eine API herunterlädt. Danach läuft jede Modellfamilie des Kurses mit demselben Gerüst: lineare Regression, Ridge und Lasso, logistische Regression, nächste Nachbarn, Kernel, Bäume, Random Forests, Boosting, ein kleines neuronales Netz, unüberwachte Verfahren, Zeitreihen und ein vortrainiertes Sentiment-Modell.

Wer ihn durchgearbeitet hat, kann ein scikit-learn-Listing lesen und sagen, zu welchem Schritt jede Zeile gehört, eigene Daten abrufen und speichern, ein Modell durch Ändern einer einzigen Zeile gegen ein anderes austauschen und Modelle vergleichen, ohne sich selbst zu täuschen. Die Herleitungen stehen anderswo: Jedes Modell verweist auf die Sitzung, die beweist, warum es funktioniert, während dieser Foliensatz zeigt, wie man es ausführt.

Die Folien

Der Code jedes Modells: importieren, per API herunterladen, anpassen, vorhersagen

Referenz. Machine Learning, Centrale Méditerranée, Schwerpunkt DDEFI, 2026-2027. Die Folien gibt es auf Französisch und Englisch; der Link öffnet die englische Fassung.

Folien öffnen (Passwort vom Dozenten)

Der Foliensatz selbst ist für die Studierenden des Kurses verschlüsselt; diese Seite fasst ihn für alle zusammen.

Die Kursseite · Aufmerksamkeit und Transformer, Schritt für Schritt

Aufbau des Foliensatzes

  1. Python lesen. Variablen, Listen und Dictionaries, Funktionen, Schleifen, Importe und die pandas-Tabelle, dann Fehler, Objekte und Klassen.
  2. Vom Binärcode zum Video. Bits und Bytes, Gleitkommazahlen, Text und Tokens, Bilder, Ton und Video, alles auf Arrays von Zahlen zurückgeführt.
  3. Daten über eine API herunterladen. Sieben öffentliche Quellen, die der Code selbst abfragt, und eine datierte Rohkopie, die einmal gespeichert wird.
  4. Regression. Die Methode der kleinsten Quadrate auf einem Jahr Wetterdaten aus Marseille, dann Ridge und Lasso gegen zwanzig Rauschspalten.
  5. Klassifikation: logistisch, Nachbarn, Kernel. Die Muster-Pipeline auf dem German-Credit-Datensatz, der Einfluss von k, SVMs und was es kostet, die Skalierung zu vergessen.
  6. Bäume, Random Forests, Boosting. Ein als Text ausgegebener Baum, Tiefe und Überanpassung, ein Random Forest mit seinem Out-of-Bag-Score, zwei Boosting-Bibliotheken.
  7. Neuronales Netz. Ein kleines Perzeptron mit frühem Stoppen (early stopping) und wie instabil es auf 750 Zeilen ist.
  8. Ehrlich vergleichen. Alle Testscores nebeneinander, dann Kreuzvalidierung und ein Testdatensatz, der nur einmal geöffnet wird.
  9. Ohne Labels, Zeitreihen, Sentiment. Hauptkomponentenanalyse, k-Means und ein Gaußsches Mischmodell auf Länderdaten; Renditen, ARIMA, GARCH, Walk-Forward; FinBERT auf Schlagzeilen.
  10. Alles zusammenführen. Ein Skript train.py, gesteuert über eine Datei config.yaml, und wohin jedes Listing im Projekt-Repository gehört.

Sechs Bausteine genügen, um ein Listing zu lesen

Fast jede Zeile eines Machine-Learning-Skripts ist eines von sechs Dingen: ein Name für einen Wert, eine Sammlung, eine Funktion, eine Schleife, ein Import oder eine Tabelle.

Der erste Teil richtet sich an Leserinnen und Leser, die kaum Code geschrieben haben. Er lehrt nicht Programmieren im Allgemeinen; er vermittelt, was man braucht, um dem Rest des Foliensatzes zu folgen, und zeigt jeden Baustein an einem winzigen Listing zu Temperaturen samt dessen echter Ausgabe.

Schritt für Schritt

  1. Eine Variable. Ein Etikett, das an einem Wert hängt. Das Zeichen = weist zu, es vergleicht nicht (verglichen wird mit ==). Drei Typen decken die meisten Fälle ab: Text (str), Dezimalzahlen (float, immer mit Punkt) und ganze Zahlen (int); type() sagt Ihnen, welchen Sie vor sich haben.
  2. Eine Liste und ein Dictionary. Eine Liste speichert Werte in einer festen Reihenfolge und wird über die Position gelesen, ab 0; ein Dictionary speichert Paare aus Schlüssel und Wert und wird über den Namen gelesen. Ein Dictionary hat genau die Form des JSON, das APIs zurückschicken.
  3. Eine Funktion. Ein benanntes Rezept, deklariert mit def, dessen eingerückter Rumpf ein Ergebnis zurückgibt. Argumente können Standardwerte haben, und einen davon gezielt über seinen Namen zu ändern, gehört bei scikit-learn zum Alltag, etwa in LogisticRegression(max_iter=1000).
  4. Eine Schleife und eine Bedingung. for wiederholt einen Block für jedes Element, if wählt zwischen zwei Blöcken, while wiederholt, bis eine Bedingung nicht mehr gilt, und so geht man die Seiten einer API durch.
  5. Ein Import. Ein Paket (package) ist ein Werkzeugkasten, den jemand anderes gebaut hat: einmal mit pip install installiert, in jedem Skript mit import geöffnet, meist unter einem kurzen Alias wie np oder pd.
  6. Ein pandas-DataFrame. Eine Datentabelle (DataFrame) mit benannten Spalten und einem Index. Drei Reflexe bei jeder neuen Tabelle: .head(), .shape und .describe().

Drei kurze Gewohnheiten runden den Teil ab. Eine Fehlermeldung (Traceback) liest man von unten: Die letzte Zeile sagt, was schiefging, die Zeile, die Ihre eigene Datei zitiert, sagt, wo, und alles innerhalb der Bibliothek ist Rauschen. Die üblichen Verdächtigen sind KeyError (eine falsch geschriebene Spalte), NameError (eine übersprungene Notebook-Zelle) und ModuleNotFoundError (ein Paket, das in dieser Umgebung fehlt). Die Dokumentation ist nur ein help() oder ein Fragezeichen entfernt. Und derselbe Code läuft auf Kaggle, auf Colab oder in VS Code; die Sitzung zu den Werkzeugen behandelt die Konten.

Der Teil endet mit Objekten und Klassen, weil sie den Rest des Kurses erklären. Eine Klasse ist ein Bauplan, ein Objekt trägt seine eigenen Daten (Attribute) und Aktionen (Methoden), und eine Kindklasse erbt alles von ihrer Elternklasse und ändert nur, was abweicht. Jedes scikit-learn-Modell erbt von denselben Basisklassen, und der Klassifikator von XGBoost wurde so geschrieben, dass er ebenfalls von ihnen erbt. Dieser gemeinsame Vertrag ist der Grund, warum eine einzige Schleife eine logistische Regression, einen Baum und ein Boosting-Modell mit identischen Aufrufen trainieren kann.

Zurück zum Inhalt.

Ein Gerüst und drei Verben: erzeugen, anpassen, vorhersagen

Jedes Modell des Kurses wird gleich verwendet: Man wählt es aus, lässt es aus Beispielen lernen, deren Antwort man kennt, und befragt es dann zu Zeilen, die es nie gesehen hat.

Jedes Modell-Listing im Foliensatz folgt denselben acht Schritten, immer in dieser Reihenfolge: die Werkzeuge importieren, die Daten herunterladen, die Eingabetabelle X und die Zielvariable y aufbauen, in einen Trainings- und einen Testdatensatz aufteilen, auf dem Trainingsdatensatz anpassen, auf dem Testdatensatz vorhersagen, mit einer Kennzahl messen, ausgeben. Wirkt ein Listing undurchsichtig, hilft meist die Frage, zu welchem der acht Schritte eine Zeile gehört.

Innerhalb dieses Gerüsts reduziert sich scikit-learn auf drei Verben. Man erzeugt ein Modellobjekt mit seinen Einstellungen, ruft fit(X, y) auf den Trainingszeilen auf und dann predict (oder predict_proba für eine Wahrscheinlichkeit) auf neuen Zeilen. Was das Modell gelernt hat, steht in Attributen, deren Namen auf einen Unterstrich enden, etwa coef_ und intercept_. Um stattdessen einen Random Forest, eine SVM oder ein neuronales Netz auszuprobieren, ändert sich nur die Zeile, in der das Modell erzeugt wird. Das folgende Listing, für diese Seite auf simulierten Daten geschrieben, zeigt das Muster.

# Dieselben drei Verben für jedes scikit-learn-Modell
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression

X, y = make_classification(n_samples=400, random_state=1)    # simulierte Tabelle
X_tr, X_te, y_tr, y_te = train_test_split(
    X, y, test_size=0.25, stratify=y, random_state=0)

model = LogisticRegression(max_iter=1000)  # 1. erzeugen (die einzige Zeile, die man tauscht)
model.fit(X_tr, y_tr)                      # 2. auf den Trainingszeilen anpassen
proba = model.predict_proba(X_te)[:, 1]    # 3. auf ungesehenen Zeilen vorhersagen
print(model.score(X_te, y_te), proba[:3].round(2))

Das Gerüst auf echten Daten

Das erste vollständige Listing sagt die tägliche Höchsttemperatur in Marseille im Jahr 2025 aus der Tiefsttemperatur und der Luftfeuchtigkeit vorher, mit 365 von Open-Meteo heruntergeladenen Tagen, von denen ein Viertel zufällig für den Test gezogen wird. Die angepasste Ebene, wie am 12. Oktober 2026 ausgegeben, lautet:

tmax^=15.53+0.957 tmin−0.115 Luftfeuchtigkeit\widehat{\text{tmax}} = 15.53 + 0.957\,\text{tmin} - 0.115\,\text{Luftfeuchtigkeit}
(1)

Das Ergebnis lesen

  1. Koeffizienten. Ein Grad mehr Tiefsttemperatur fügt bei gleicher Luftfeuchtigkeit etwa 0,96 Grad Höchsttemperatur hinzu; ein Punkt mehr Luftfeuchtigkeit zieht etwa 0,12 ab. Für einen Tag mit 10 °C Tiefsttemperatur und 80 % Luftfeuchtigkeit ergibt die Ebene 15,53 + 9,57 − 9,20 = 15,9 °C.
  2. Fehler. Auf den 92 Testtagen beträgt die Wurzel des mittleren quadratischen Fehlers (RMSE) 1,91 °C, gegenüber 5,77 °C für ein naives Referenzmodell (baseline), das immer den Trainingsmittelwert vorhersagt. Eine Kennzahl bedeutet erst neben einem solchen Vergleichspunkt etwas.
  3. Die Falle. Benachbarte Tage ähneln sich, also gibt eine zufällige Aufteilung jedem Testtag fast identische Zwillinge im Trainingsdatensatz, und der Fehler fällt leicht optimistisch aus. Für Prognosen muss die Aufteilung der Zeit folgen.

Dasselbe Modell über statsmodels liefert dieselben Koeffizienten plus Standardfehler und p-Werte: scikit-learn ist das Werkzeug für die Vorhersage, statsmodels das für die Inferenz. Die Herleitung der Methode der kleinsten Quadrate steht in der ersten Sitzung.

Zurück zum Inhalt.

Vom Binärcode zum Video: Jede Art von Daten wird zu einem Array von Zahlen

Eine Maschine speichert nur Zahlen zur Basis 2, also endet ein Text, ein Foto, ein Ton oder ein Film immer als Array von Zahlen; nur seine Form und seine Größe ändern sich.

Ein Bit ist 0 oder 1, ein Byte besteht aus acht Bits und kann 256 Werte annehmen, von 0 bis 255. Jede Stelle zur Basis 2 ist doppelt so viel wert wie die rechts daneben, also ist das Byte 01000001 gleich 64 + 1 = 65, der Code des Buchstabens A.

010000012=26+20=6501000001_2 = 2^6 + 2^0 = 65
(2)

Daraus folgen zwei Fallen, und der Foliensatz zeigt beide im Code. Ein numpy-Array aus Ein-Byte-Ganzzahlen (uint8, der Typ von Bildern) läuft stillschweigend über: Aus 250 + 10 wird 4, ohne Warnung. Und eine Gleitkommazahl (floating-point number) kann 0,1 zur Basis 2 nicht exakt darstellen, daher ist 0.1 + 0.2 == 0.3 falsch; Gleitkommazahlen vergleicht man mit einer Toleranz (np.isclose), niemals mit ==. Der Speicher folgt dem Typ: Eine Tabelle mit 30.000 Zeilen und 24 Spalten in 64-Bit-Gleitkommazahlen belegt 5,76 MB, die Hälfte davon in 32-Bit-Gleitkommazahlen, die etwa 7 signifikante Stellen statt 16 behalten und ab 2242^{24} aufeinanderfolgende ganze Zahlen nicht mehr unterscheiden, daher sollten Kennungen ganze Zahlen oder Text bleiben.

Text durchläuft zwei Schichten. Unicode gibt jedem Zeichen eine Nummer, und UTF-8 schreibt diese Nummer als ein bis vier Bytes, weshalb eine CSV-Datei, die mit der falschen Kodierung geöffnet wird, verstümmelte Umlaute und Akzente zeigt. Ein Sprachmodell zerlegt den Text dann in Tokens, Wortstücke aus einem festen Vokabular, und liest ihre ganzzahligen Codes; ein seltenes Wort wird in mehrere Stücke zerlegt. Der Artikel zur Attention zeigt, was ein Transformer anschließend mit diesen Tokens macht.

Tabelle 1: Fünf Arten von Daten, fünf Arrays. Die Größen sind die, die die Listings des Foliensatzes bei ihrer Ausführung am 12. Oktober 2026 berechnet haben.
DatenGespeichert alsIm Foliensatz berechnete GrößeGelesen mit
Tabelleein 2D-Array von Gleitkommazahlen, eine Zeile pro Kunde5,76 MB für 30.000 Zeilen und 24 Spaltenpandas
Texteine Liste ganzzahliger Token-IDs6 Tokens für „Centrale Méditerranée“transformers
Bildein 3D-Array von Bytes (Zeilen, Spalten, Farbe)786.432 Bytes für ein quadratisches Foto mit 512 Pixeln KantenlängePillow, scikit-image
Tonein langes 1D-Array von int16-Abtastwerten176.444 Bytes für eine WAV-Datei von zwei Sekundenscipy
Videoein 4D-Array: zeitlich gestapelte Einzelbilderetwa 155,5 MB pro Sekunde Rohvideo in 1080pOpenCV, PyAV

Ein Bild ist ein dreidimensionales Array, und was ein faltendes neuronales Netz damit macht, wird im Kleinen gezeigt: Ein 3 × 3-Filter gleitet über die Pixel, multipliziert und addiert und reagiert stark auf eine Kante. Ein Ton wird 44.100-mal pro Sekunde abgetastet, genug, um Frequenzen bis etwa 20.000 Hz zu erhalten; zwei Sekunden Mono-Ton ergeben 88.200 Ganzzahlen zu je 2 Bytes, plus einen WAV-Header von 44 Bytes:

2×44 100×2+44=176 444 Bytes2 \times 44\,100 \times 2 + 44 = 176\,444 \text{ Bytes}
(3)

Eine Fourier-Transformation dieses Vektors zeigt die Spitze bei 440 Hz, dem erzeugten Ton. Rohvideo ist so umfangreich, dass es immer komprimiert wird, und ein Modell liest dekodierte Einzelbilder, einige pro Sekunde, verkleinert. Für Tabellen, den üblichen Fall im Kurs, ist der letzte Schritt die One-Hot-Kodierung (one-hot encoding): Eine Textspalte mit drei möglichen Werten wird zu drei Spalten aus 0 und 1, sodass jeder Kunde ein einfacher Zahlenvektor ist.

Zurück zum Inhalt.

Daten per API herunterladen und dann eine datierte Kopie einfrieren

Eine Programmierschnittstelle (API) ist eine Webadresse, die ein Programm abfragen kann; sie antwortet mit strukturiertem Text, den pandas in eine Tabelle verwandelt, und diese Tabelle wird einmal mit Datum gespeichert und nie bearbeitet.

Eine Web-API nimmt ihre Frage in der Adresse selbst entgegen: Nach dem Fragezeichen folgen Parameter der Form name=wert, getrennt durch &. Der Server antwortet mit einem Statuscode (200 bei Erfolg, 404 für nicht gefunden, 429 für zu viele Anfragen) und einem Rumpf, fast immer JSON oder CSV. JSON besteht aus den beiden Containern des ersten Teils, Dictionaries und Listen, und liest sich daher wie ein Python-Dictionary.

Drei Handgriffe machen einen Download robust: die Parameter als Dictionary an requests.get übergeben, ein timeout setzen, damit das Skript nicht ewig wartet, und raise_for_status() aufrufen, damit eine Ablehnung das Skript sofort mit einer klaren Meldung stoppt, statt drei Zeilen später zu scheitern. Das folgende Listing ist für diese Seite geschrieben; es folgt dem Muster des Foliensatzes für eine andere Stadt und eine andere Variable.

import requests
import pandas as pd

url = "https://archive-api.open-meteo.com/v1/archive"
params = {"latitude": 49.61, "longitude": 6.13,          # Luxemburg-Stadt
          "start_date": "2024-01-01", "end_date": "2024-12-31",
          "daily": "precipitation_sum", "timezone": "Europe/Luxembourg"}
r = requests.get(url, params=params, timeout=30)
r.raise_for_status()                       # sofort stoppen, wenn der Server ablehnt
rain = pd.DataFrame(r.json()["daily"])     # vom JSON-Dictionary zur Tabelle
rain.to_parquet("data/raw/rain_lux_2024.parquet")  # Rohkopie, nie bearbeitet
print(rain.shape)
Tabelle 2: Die sieben öffentlichen Quellen des Foliensatzes, jede vom Code selbst abgefragt.
QuelleWie sie abgefragt wirdWas der Foliensatz daraus nimmt
Open-Meteorequests, JSON, ohne Schlüsseltägliches Wetter in Marseille, 2025
ECB Data Portalpd.read_csv auf die AdresseEuro-Dollar-Referenzkurs
Weltbankrequests, JSON in Seiten, in einer Schleife gelesenBIP pro Kopf und andere Indikatoren nach Land
OpenMLfetch_openml in scikit-learnGerman-Credit-Datensatz, 1.000 Anträge
Yahoo Financeyfinancebereinigte Tageskurse eines börsennotierten Unternehmens
FREDpandas-datareaderRendite zehnjähriger US-Staatsanleihen
KaggleKommandozeilen-Clientöffentliche Datensätze und Wettbewerbsdateien

Jede Quelle hat ihre Eigenheiten, und der Foliensatz nennt Lizenz und Nutzungsbedingungen in den Foliennotizen. Die Weltbank liefert eine Seite nach der anderen und mischt Länder mit Aggregaten wie dem Euroraum; FRED lässt an Tagen, an denen der US-Markt geschlossen ist, Lücken, die man entfernen statt mit null füllen sollte; Yahoo-Kurse sind nur für den persönlichen Gebrauch bestimmt, also teilt ein öffentliches Repository das Skript, niemals die Kursdateien. Da Online-Quellen revidiert werden, wird das Rohergebnis im Parquet-Format, einem typisierten Spaltenformat, mit dem Download-Datum im Dateinamen nach data/raw/ geschrieben, und dieser Ordner bleibt außerhalb von Git.

Zurück zum Inhalt.

Ein Rundgang durch die Modellfamilien, je ein Listing

Der Foliensatz führt jede Familie des Kurses mit demselben Gerüst auf echten öffentlichen Daten aus und liest jede Ausgabe in einfachen Worten.

Jede Familie beginnt mit einer Idee in einem Satz, dann folgen das Listing und die Bedeutung der Ausgabe, und sie verweist auf die Sitzung, in der das Modell hergeleitet wird. Zuerst kommen zwei bestrafte Varianten der Methode der kleinsten Quadrate: Ridge addiert die Summe der quadrierten Koeffizienten, Lasso die Summe ihrer Beträge, was einige davon exakt auf null drückt.

min⁡β ∑i(yi−xi⊤β)2+α∑jβj2oder+α∑j∣βj∣\min_{\beta}\ \sum_i \bigl(y_i - x_i^{\top}\beta\bigr)^2 + \alpha\sum_j \beta_j^2 \quad\text{oder}\quad + \alpha\sum_j \lvert\beta_j\rvert
(4)

Die logistische Regression schickt eine gewichtete Summe durch die Sigmoidfunktion, um eine Ausfallwahrscheinlichkeit zu erhalten; ihr Listing, mit skalierten numerischen Spalten und One-Hot-kodierten kategorialen Spalten innerhalb einer Pipeline, wird zur Vorlage für jeden Klassifikationsteil. Eine Wahrscheinlichkeit entscheidet nichts, solange keine Schwelle gewählt ist, und diese Wahl ist eine Frage der Kosten, das Thema der vierten Sitzung.

p=11+e−(β0+x⊤β)p = \frac{1}{1 + e^{-(\beta_0 + x^{\top}\beta)}}
(5)
Tabelle 3: Die im Foliensatz gezeigten Familien, mit der verwendeten Klasse und einer Lehre aus ihrer echten Ausgabe (Ausführung vom 12. Oktober 2026). Die AUC-Werte beziehen sich auf denselben Testdatensatz (test set) von 250 Kunden aus dem German-Credit-Datensatz.
FamilieKlasse oder PaketWas die Ausgabe lehrt
Kleinste QuadrateLinearRegression, statsmodelsRMSE 1,91 °C gegenüber 5,77 °C für den Mittelwert
Ridge, LassoRidge, Lasso, RidgeCV, LassoCVLasso setzt 19 von 20 reinen Rauschspalten auf null
Logistische RegressionLogisticRegression in einer PipelineAUC 0,794, das zu schlagende Referenzmodell
Nächste NachbarnKNeighborsClassifierk = 1: Trainings-AUC 1,000, Test 0,589
SVM, Kernel-RidgeSVC, KernelRidgeohne Skalierung fällt die AUC von 0,808 auf 0,566
EntscheidungsbaumDecisionTreeClassifierlesbar bei Tiefe 3, aber AUC nur 0,673
Random ForestRandomForestClassifier500 Bäume, AUC 0,794, ein kostenloser Out-of-Bag-Score
Gradient BoostingHistGradientBoostingClassifier, XGBClassifierAUC 0,783 und 0,793, Baumanzahl per frühem Stoppen gewählt
Neuronales NetzMLPClassifierAUC von 0,625 bis 0,815, je nach einer Einstellung und dem Seed
Ohne LabelsPCA, KMeans, GaussianMixturezwei Achsen tragen 96 % der Varianz; das BIC bevorzugt eine einzige Gruppe
Zeitreihenstatsmodels ARIMA, arch GARCHder Mittelwert lässt sich nicht vorhersagen, die Volatilität schon
Sentimenttransformers, FinBERTdieselbe Tatsache, anders formuliert, erhält einen anderen Score

Mehrere Läufe sollen eher ein Scheitern als einen Erfolg zeigen. Das Nächste-Nachbarn-Modell mit einem einzigen Nachbarn lernt den Trainingsdatensatz auswendig, Überanpassung (Overfitting) in Reinform. Dieselbe SVM sieht, wenn man ihr einen unskalierten Kreditbetrag gibt, nur noch diese eine Variable. Ein unbegrenzter Baum erreicht 146 Blätter und schneidet im Test schlechter ab als eine einzige Frage. Das kleine Perzeptron springt vom letzten auf den ersten Platz des Foliensatzes, wenn man den Patience-Parameter seines frühen Stoppens ändert, eine Erinnerung daran, dass auf einer Tabelle mit 750 Zeilen geboostete Bäume die sicherere Wahl sind. Auf der unüberwachten Seite liefert k-Means immer genau so viele Gruppen, wie man verlangt, und das BIC des Gaußschen Mischmodells sagt, dass diese Länderindikatoren ein Kontinuum bilden. Beim Euro-Dollar ist ein ARIMA(1, 1, 1) fast ein Random Walk, und ein AR(1) im Walk-Forward schneidet nicht besser ab als die Prognose einer Rendite von null, während ein GARCH(1, 1) zeigt, wie hartnäckig die Volatilität ist.

Die Herleitungen stehen in den Sitzungen: Regularisierung, Kernel und Bäume, Random Forests und Boosting, Hauptkomponentenanalyse und Clustering, neuronale Netze und das Projekt zum Preis eines Vermögenswerts für Zeitreihen und FinBERT. Der Modellüberblick ordnet sie alle auf einer einzigen Karte ein.

Zurück zum Inhalt.

Ehrlich vergleichen, dann das Notebook in ein Skript verwandeln

Mehrere Scores auf einem einzigen Testdatensatz sind vor allem Rauschen; Modelle vergleicht man per Kreuzvalidierung auf den Trainingsdaten, und der Test wird einmal geöffnet, nur für das gewählte Modell.

Sobald jeder Klassifikator auf derselben Aufteilung gelaufen ist, ist die Versuchung groß, das Modell mit der höchsten Test-AUC zum Sieger zu küren. Der Foliensatz widersteht ihr: Die beste SVM wurde unter sechs Einstellungen ausgewählt, indem man auf eben diesen Test schaute, das Netz hängt von seinem Patience-Parameter ab, und bei 75 Ausfällen und 175 guten Kunden beträgt der Standardfehler einer AUC um 0,8 etwa 0,03 (Hanley und McNeil, 1982). Unterschiede von einem Hundertstel sagen nichts aus.

Die ehrliche Methode ist eine stratifizierte fünffache Kreuzvalidierung (cross-validation) auf dem Trainingsdatensatz: fünf Anpassungen, jede auf dem zurückgehaltenen Fold gemessen, mit denselben Folds für jeden Kandidaten, sodass der Vergleich gepaart ist. Die Entscheidungsregel wird vor der Berechnung aufgeschrieben.

Tabelle 4: Mittlere kreuzvalidierte AUC von drei Kandidaten auf dem Trainingsdatensatz der German-Credit-Daten (Lauf vom 12. Oktober 2026).
KandidatMittlere AUC über 5 FoldsSpanne der Standardabweichungen
Random Forest0,7970,038 bis 0,045
Gradient Boosting0,7880,038 bis 0,045
Logistische Regression0,7750,038 bis 0,045

Die Unterschiede sind kleiner als die Standardabweichungen, also greift die vorab festgelegte Regel: das einfachste Modell behalten. Die logistische Regression, lesbar und vertretbar im Kreditscoring, wird auf dem gesamten Trainingsdatensatz neu angepasst, und der Test wird einmal geöffnet und ergibt 0,794. Diese eine Zahl ist diejenige, die in einen Bericht kommt.

Der letzte Teil verlegt dasselbe Gerüst aus einem Notebook in ein Skript train.py, das jede Einstellung aus einer Datei config.yaml liest, das angepasste Modell mit joblib speichert und seine Kennzahl in eine JSON-Datei schreibt, sodass ein einziger Befehl alles neu ausführt. Eine Tiefe oder einen Seed ändert man dann in der Konfiguration, in einem Commit, der den Grund nennt, niemals durch Bearbeiten des Codes. Ein mit einer Version von scikit-learn gespeichertes Modell sollte mit derselben Version wieder eingelesen werden, ein Grund mehr, Versionen festzuhalten. Jede Art von Listing hat dann ihren Platz im Projekt-Repository, das im Referenzmodell des Projekts beschrieben ist.

Zurück zum Inhalt.

Das Wichtigste in Kürze

  1. Sechs Python-Bausteine (Variable, Liste und Dictionary, Funktion, Schleife, Import, DataFrame) genügen, um jedes Listing des Kurses zu lesen.
  2. Jedes Modell folgt denselben acht Schritten, und scikit-learn reduziert sie auf drei Verben: erzeugen, anpassen, vorhersagen; von einem Modell zum anderen ändert sich nur die Zeile, in der das Modell erzeugt wird.
  3. Text, Bilder, Ton und Video werden alle zu Arrays von Zahlen; achten Sie auf den Ganzzahlüberlauf bei uint8, vergleichen Sie Gleitkommazahlen nie mit ==, und speichern Sie Kennungen nicht als 32-Bit-Gleitkommazahlen.
  4. Laden Sie mit Parametern, einem Timeout und einer Statusprüfung herunter, speichern Sie das Rohergebnis dann einmal, mit Datum, und teilen Sie das Skript statt der Daten.
  5. Distanzbasierte Modelle (Nachbarn, SVMs, neuronale Netze, bestrafte Regressionen) brauchen Merkmalsskalierung (feature scaling) innerhalb der Pipeline; Bäume nicht.
  6. Eine Kennzahl liest man neben einem naiven Referenzmodell, und Modelle vergleicht man per Kreuzvalidierung, wobei der Test nur einmal geöffnet wird.

Glossar

Paket (package)
Eine von anderen geschriebene Bibliothek, einmal mit pip installiert und in jedem Skript mit import geöffnet.
Datentabelle (DataFrame)
Die Tabelle von pandas: benannte Spalten, eine Zeile pro Beobachtung, links ein Index.
Programmierschnittstelle (API)
Eine Webadresse, die ein Programm mit Parametern abfragen kann; sie antwortet in JSON oder CSV mit einem Statuscode.
Fit und Predict
Der Vertrag von scikit-learn: fit lernt aus gelabelten Zeilen, predict antwortet auf neuen Zeilen.
Pipeline
Eine Kette von Aufbereitungsschritten und ein Modell, als ein einziges Objekt angepasst, sodass die Aufbereitung nur auf den Trainingsdaten gelernt wird.
Merkmalsskalierung (feature scaling)
Jede numerische Spalte auf Mittelwert null und Standardabweichung eins bringen, was distanzbasierte Modelle erfordern.
One-Hot-Kodierung (one-hot encoding)
Eine Textspalte durch eine 0/1-Spalte pro möglichem Wert ersetzen.
Testdatensatz (test set)
Zeilen, die beiseitegelegt und einmal, am Ende, verwendet werden, um das gewählte Modell zu messen.
Referenzmodell (baseline)
Der einfache Vergleichspunkt, den ein Modell schlagen muss, etwa immer den Mittelwert vorherzusagen.
Kreuzvalidierung (cross-validation)
Mehrmals anpassen und jedes Mal auf einem anderen zurückgehaltenen Fold der Trainingsdaten messen.
Überanpassung (Overfitting)
Ein Modell lernt die Trainingszeilen auswendig und schneidet auf neuen schlechter ab.
Token
Ein Wortstück aus einem festen Vokabular, die Einheit, die ein Sprachmodell als ganze Zahl liest.
Gleitkommazahl (floating-point number)
Die näherungsweise Dezimalzahl der Maschine, etwa 16 signifikante Stellen bei 64 Bit.
Walk-Forward-Validierung
Tag für Tag nur auf der Vergangenheit neu anpassen und den nächsten Tag vorhersagen.

Die anderen Notizen des Kurses

Eine öffentliche Zusammenfassung pro Foliensatz, in der Reihenfolge des Kurses.

  1. EinführungKI-Winter, Arbeitsmarkt und Methode
  2. WerkzeugeKaggle, GitHub, Python: die Werkzeuge
  3. Sitzung 1Projektrahmen und kleinste Quadrate
  4. Sitzung 2Maximum Likelihood und logistische Regression
  5. Sitzung 3Gradientenabstieg, Ridge und Lasso
  6. Sitzung 4Entscheidungsschwelle und reproduzierbares ML
  7. HausaufgabeML-Projekt abstecken: der Projektsteckbrief
  8. Sitzung 5Kernel, SVM und Entscheidungsbäume
  9. Sitzung 6Random Forests, Boosting, ehrlicher Vergleich
  10. Sitzung 7SHAP, Fairness, PCA und Clustering
  11. HausaufgabeEin einfaches Modell mit vollständiger Methode
  12. Sitzung 8Neuronale Netze, Drift, konforme Vorhersage
  13. HausaufgabeEin ausgeliefertes Machine-Learning-Projekt
  14. Sitzung 9Ein Machine-Learning-Projekt verteidigen
  15. ReferenzProjekt zum Kreditausfallscore
  16. ReferenzAktienrenditen: XGBoost und Sentiment
  17. ReferenzPython-Code für jedes ML-Modell
  18. ReferenzDeep Learning, das Wesentliche
  19. ReferenzML-Projekte mit offenen Daten nach Branche
  20. ReferenzHandbuch für Daten- und KI-Fachleute
  21. ReferenzData Engineering, SRE und Cloud
  22. ReferenzPanorama der Machine-Learning-Modelle

Alle Notizen als Leseliste

Aufmerksamkeit und Transformer, Schritt für Schritt

Über diese Notizen

Vom Dozenten auf Grundlage der Folien verfasst, als öffentliche Zusammenfassung: die Kernideen, die Formeln und ein durchgerechnetes Beispiel. Die Übungen, ihre Lösungen, die Tests und die Bewertung bleiben im Foliensatz, für die Studierenden des Kurses.

Stand: .