~/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.
Aufbau des Foliensatzes
- Python lesen. Variablen, Listen und Dictionaries, Funktionen, Schleifen, Importe und die pandas-Tabelle, dann Fehler, Objekte und Klassen.
- Vom Binärcode zum Video. Bits und Bytes, Gleitkommazahlen, Text und Tokens, Bilder, Ton und Video, alles auf Arrays von Zahlen zurückgeführt.
- Daten über eine API herunterladen. Sieben öffentliche Quellen, die der Code selbst abfragt, und eine datierte Rohkopie, die einmal gespeichert wird.
- Regression. Die Methode der kleinsten Quadrate auf einem Jahr Wetterdaten aus Marseille, dann Ridge und Lasso gegen zwanzig Rauschspalten.
- 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.
- 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.
- Neuronales Netz. Ein kleines Perzeptron mit frühem Stoppen (early stopping) und wie instabil es auf 750 Zeilen ist.
- Ehrlich vergleichen. Alle Testscores nebeneinander, dann Kreuzvalidierung und ein Testdatensatz, der nur einmal geöffnet wird.
- Ohne Labels, Zeitreihen, Sentiment. Hauptkomponentenanalyse, k-Means und ein Gaußsches Mischmodell auf Länderdaten; Renditen, ARIMA, GARCH, Walk-Forward; FinBERT auf Schlagzeilen.
- 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
- 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. - 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.
- 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 inLogisticRegression(max_iter=1000). - Eine Schleife und eine Bedingung.
forwiederholt einen Block für jedes Element,ifwählt zwischen zwei Blöcken,whilewiederholt, bis eine Bedingung nicht mehr gilt, und so geht man die Seiten einer API durch. - Ein Import. Ein Paket (package) ist ein Werkzeugkasten, den jemand anderes gebaut hat: einmal mit
pip installinstalliert, in jedem Skript mitimportgeöffnet, meist unter einem kurzen Alias wienpoderpd. - Ein pandas-DataFrame. Eine Datentabelle (DataFrame) mit benannten Spalten und einem Index. Drei Reflexe bei jeder neuen Tabelle:
.head(),.shapeund.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.
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:
Das Ergebnis lesen
- 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.
- 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.
- 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.
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.
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 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.
| Daten | Gespeichert als | Im Foliensatz berechnete Größe | Gelesen mit |
|---|---|---|---|
| Tabelle | ein 2D-Array von Gleitkommazahlen, eine Zeile pro Kunde | 5,76 MB für 30.000 Zeilen und 24 Spalten | pandas |
| Text | eine Liste ganzzahliger Token-IDs | 6 Tokens für „Centrale Méditerranée“ | transformers |
| Bild | ein 3D-Array von Bytes (Zeilen, Spalten, Farbe) | 786.432 Bytes für ein quadratisches Foto mit 512 Pixeln Kantenlänge | Pillow, scikit-image |
| Ton | ein langes 1D-Array von int16-Abtastwerten | 176.444 Bytes für eine WAV-Datei von zwei Sekunden | scipy |
| Video | ein 4D-Array: zeitlich gestapelte Einzelbilder | etwa 155,5 MB pro Sekunde Rohvideo in 1080p | OpenCV, 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:
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.
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)
| Quelle | Wie sie abgefragt wird | Was der Foliensatz daraus nimmt |
|---|---|---|
| Open-Meteo | requests, JSON, ohne Schlüssel | tägliches Wetter in Marseille, 2025 |
| ECB Data Portal | pd.read_csv auf die Adresse | Euro-Dollar-Referenzkurs |
| Weltbank | requests, JSON in Seiten, in einer Schleife gelesen | BIP pro Kopf und andere Indikatoren nach Land |
| OpenML | fetch_openml in scikit-learn | German-Credit-Datensatz, 1.000 Anträge |
| Yahoo Finance | yfinance | bereinigte Tageskurse eines börsennotierten Unternehmens |
| FRED | pandas-datareader | Rendite zehnjähriger US-Staatsanleihen |
| Kaggle | Kommandozeilen-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.
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.
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.
| Familie | Klasse oder Paket | Was die Ausgabe lehrt |
|---|---|---|
| Kleinste Quadrate | LinearRegression, statsmodels | RMSE 1,91 °C gegenüber 5,77 °C für den Mittelwert |
| Ridge, Lasso | Ridge, Lasso, RidgeCV, LassoCV | Lasso setzt 19 von 20 reinen Rauschspalten auf null |
| Logistische Regression | LogisticRegression in einer Pipeline | AUC 0,794, das zu schlagende Referenzmodell |
| Nächste Nachbarn | KNeighborsClassifier | k = 1: Trainings-AUC 1,000, Test 0,589 |
| SVM, Kernel-Ridge | SVC, KernelRidge | ohne Skalierung fällt die AUC von 0,808 auf 0,566 |
| Entscheidungsbaum | DecisionTreeClassifier | lesbar bei Tiefe 3, aber AUC nur 0,673 |
| Random Forest | RandomForestClassifier | 500 Bäume, AUC 0,794, ein kostenloser Out-of-Bag-Score |
| Gradient Boosting | HistGradientBoostingClassifier, XGBClassifier | AUC 0,783 und 0,793, Baumanzahl per frühem Stoppen gewählt |
| Neuronales Netz | MLPClassifier | AUC von 0,625 bis 0,815, je nach einer Einstellung und dem Seed |
| Ohne Labels | PCA, KMeans, GaussianMixture | zwei Achsen tragen 96 % der Varianz; das BIC bevorzugt eine einzige Gruppe |
| Zeitreihen | statsmodels ARIMA, arch GARCH | der Mittelwert lässt sich nicht vorhersagen, die Volatilität schon |
| Sentiment | transformers, FinBERT | dieselbe 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.
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.
| Kandidat | Mittlere AUC über 5 Folds | Spanne der Standardabweichungen |
|---|---|---|
| Random Forest | 0,797 | 0,038 bis 0,045 |
| Gradient Boosting | 0,788 | 0,038 bis 0,045 |
| Logistische Regression | 0,775 | 0,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.
Das Wichtigste in Kürze
- Sechs Python-Bausteine (Variable, Liste und Dictionary, Funktion, Schleife, Import, DataFrame) genügen, um jedes Listing des Kurses zu lesen.
- 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.
- 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. - 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.
- Distanzbasierte Modelle (Nachbarn, SVMs, neuronale Netze, bestrafte Regressionen) brauchen Merkmalsskalierung (feature scaling) innerhalb der Pipeline; Bäume nicht.
- 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.
Zurück: Aktienrenditen: XGBoost und SentimentWeiter: Deep Learning, das Wesentliche
- EinführungKI-Winter, Arbeitsmarkt und Methode
- WerkzeugeKaggle, GitHub, Python: die Werkzeuge
- Sitzung 1Projektrahmen und kleinste Quadrate
- Sitzung 2Maximum Likelihood und logistische Regression
- Sitzung 3Gradientenabstieg, Ridge und Lasso
- Sitzung 4Entscheidungsschwelle und reproduzierbares ML
- HausaufgabeML-Projekt abstecken: der Projektsteckbrief
- Sitzung 5Kernel, SVM und Entscheidungsbäume
- Sitzung 6Random Forests, Boosting, ehrlicher Vergleich
- Sitzung 7SHAP, Fairness, PCA und Clustering
- HausaufgabeEin einfaches Modell mit vollständiger Methode
- Sitzung 8Neuronale Netze, Drift, konforme Vorhersage
- HausaufgabeEin ausgeliefertes Machine-Learning-Projekt
- Sitzung 9Ein Machine-Learning-Projekt verteidigen
- ReferenzProjekt zum Kreditausfallscore
- ReferenzAktienrenditen: XGBoost und Sentiment
- ReferenzPython-Code für jedes ML-Modell
- ReferenzDeep Learning, das Wesentliche
- ReferenzML-Projekte mit offenen Daten nach Branche
- ReferenzHandbuch für Daten- und KI-Fachleute
- ReferenzData Engineering, SRE und Cloud
- ReferenzPanorama der Machine-Learning-Modelle
Ü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: .