~/teaching · machine learning · sitzung 2, mittwoch, 14. oktober 2026
Maximum-Likelihood-Schätzung, logistische Regression und ehrliche Validierung, Schritt für Schritt
Warum die Verlustfunktion aus der Verteilung folgt und wie man ein Modell misst, ohne sich selbst zu täuschen.
Zusammenfassung
Dieser Foliensatz ist der Nachmittagsteil der zweiten Sitzung des Kurses Machine Learning an der Centrale Méditerranée (Schwerpunkt DDEFI, 2026-2027). Er beantwortet eine Frage, die der Vormittag zu den kleinsten Quadraten offengelassen hat: Warum gerade Quadrate? Die Antwort ist ein Rezept. Man wählt eine Wahrscheinlichkeitsverteilung für die Zielvariable, schreibt die Wahrscheinlichkeit der beobachteten Daten auf, nimmt den Logarithmus, kehrt das Vorzeichen um und erhält die Verlustfunktion. Eine normalverteilte Zielvariable liefert die kleinsten Quadrate, eine 0/1-Zielvariable den Log-Loss der logistischen Regression.
Danach baut der Foliensatz die logistische Regression Stück für Stück auf: die Sigmoidfunktion und ihre Umkehrung, das Logit, den Gradienten in drei Zeilen, die Hesse-Matrix und die Konvexität, die ein einziges Minimum garantiert, die Softmax-Funktion für mehrere Klassen und die Lesart eines Koeffizienten als Odds Ratio. Der zweite Teil behandelt die Generalisierung: die Bias-Varianz-Zerlegung, die Kreuzvalidierung, die beiden häufigsten Formen von Data Leakage und die Frage, wie viele Testzeilen eine Kennzahl braucht, bevor man ihr glauben sollte.
Das durchgehende Beispiel ist ein Kreditausfallproblem, der UCI-Datensatz mit 30.000 Kreditkarteninhabern aus Taiwan (Yeh und Lien, 2009, Daten von 2005) und 22,1 % Ausfällen. Nach der Lektüre können Sie den logistischen Gradienten von Hand herleiten, einen Koeffizienten in einem Bericht korrekt erklären und eine Validierung ohne Data Leakage aufsetzen.
Aufbau des Foliensatzes
- Von der Verteilung zur Verlustfunktion. Bernoulli-Likelihood, Logarithmus, Log-Loss und dasselbe Rezept für eine normalverteilte Zielvariable, das wieder die kleinsten Quadrate ergibt.
- Die Sigmoidfunktion und das Logit. Wie ein reeller Score zu einer Wahrscheinlichkeit wird, die Ableitung, die man sich merken sollte, und warum die logistische Regression auf den Log-Odds linear ist.
- Gradient, Hesse-Matrix, Konvexität. Der Gradient ist Vorhersage minus Beobachtung, gewichtet mit den Merkmalen, und die Verlustfunktion hat kein falsches Minimum.
- Softmax und Kreuzentropie. Dieselbe Idee mit K Klassen und der binäre Fall als Sonderfall K = 2.
- Einen Koeffizienten lesen. Odds, Odds Ratios, Konfidenzintervalle und der klassische Fehler, ein Odds Ratio als Veränderung des Risikos zu lesen.
- Bias-Varianz und Validierung ohne Data Leakage. Die Zerlegung in drei Terme, Kreuzvalidierung, Data Leakage, zeitlich geordnete Aufteilungen und die Hoeffding-Schranke für den Testdatensatz.
- Start des Teamprojekts. SQL-Audit mit DuckDB, Datenblatt, Leakage-Karte, eingefrorene stratifizierte Aufteilung, zwei Referenzmodelle und eine erste schriftliche Entscheidung.
Von der Bernoulli-Likelihood zum Log-Loss
Ein guter Klassifikator gibt dem, was tatsächlich passiert ist, eine hohe Wahrscheinlichkeit, und der Log-Loss ist einfach der Preis, den er zahlt, wenn das nicht der Fall ist.
Jeder Kunde fällt entweder aus () oder nicht (). Dieses Ergebnis modelliert man als gezinkte Münze, deren Trefferwahrscheinlichkeit von den Merkmalen des Kunden abhängt. Das ist eine Bernoulli-Verteilung. Mit einem kleinen Trick in den Exponenten lässt sich die Wahrscheinlichkeit des beobachteten Ergebnisses ohne Fallunterscheidung schreiben, denn ist gleich , wenn der Kunde ausgefallen ist, und gleich , wenn nicht.
Nimmt man an, dass die Kunden bei gegebenen Merkmalen unabhängig sind, ist die Wahrscheinlichkeit des gesamten Datensatzes das Produkt dieser Terme. Dieses Produkt, als Funktion der Parameter betrachtet, ist die Likelihood-Funktion (likelihood), kurz Likelihood. Die Maximum-Likelihood-Schätzung (maximum likelihood estimation, MLE) wählt das , das sie am größten macht.
Zwei praktische Gründe sprechen für den Logarithmus. Ein Produkt aus 30.000 Zahlen unter 1 rutscht in Gleitkommaarithmetik unter den darstellbaren Bereich (Underflow), und eine Summe lässt sich leichter ableiten als ein Produkt. Da der Logarithmus monoton steigt, verschiebt sich die Maximalstelle nicht. Im Machine Learning minimiert man lieber, also kehrt man das Vorzeichen um und erhält den Log-Loss, auch binäre Kreuzentropie (binary cross-entropy) genannt.
Für einen Kunden, der tatsächlich ausfällt, bleibt nur übrig. Die Tabelle zeigt, wie hart die Verlustfunktion selbstsichere Fehler bestraft (natürlicher Logarithmus, die Einheit ist also das Nat).
| Vorhergesagtes | Verlust | Deutung |
|---|---|---|
| 0,99 | 0,010 | sicher und richtig: fast kostenlos |
| 0,80 | 0,223 | ziemlich sicher, moderate Kosten |
| 0,50 | 0,693 | ein Münzwurf, |
| 0,10 | 2,303 | falsch, und das kostet |
| 0,01 | 4,605 | sicher und falsch: 460-mal die erste Zeile |
Dasselbe Rezept, normalverteilte Zielvariable: die kleinsten Quadrate
Die kleinsten Quadrate sind keine willkürliche Wahl, sondern genau das, was die Maximum-Likelihood-Schätzung liefert, wenn das Rauschen um die Vorhersage normalverteilt ist.
Wenden wir das Rezept auf eine stetige Zielvariable an. Angenommen, der beobachtete Preis ist normalverteilt um die lineare Vorhersage, . Jede Dichte ist eine Konstante mal , wobei das Residuum ist. Nimmt man den Logarithmus des Produkts, sammeln sich die Konstanten in einem Term, der nicht von abhängt, und die Exponenten addieren sich zu einer Summe quadrierter Residuen.
Ein positiver Faktor und eine additive Konstante verschieben kein Minimum, also ist die Maximum-Likelihood-Schätzung unter Normalverteilung genau der gewöhnliche Kleinste-Quadrate-Schätzer des Vormittags, mit seinen Normalgleichungen. Wäre das Rauschen stattdessen Laplace-verteilt, stünde im Exponenten , und das Rezept ergäbe die Methode der kleinsten absoluten Abweichungen, also den Median statt des Mittelwerts.
Bemerkung (Eine Verteilung, eine Verlustfunktion). Fragt jemand, warum ein Modell eine bestimmte Verlustfunktion verwendet, ist die Antwort die für die Zielvariable angenommene Verteilung, nicht eine Voreinstellung der Bibliothek. Normalverteilung: Quadrate. Bernoulli: Log-Loss. Der Rest ist Optimierung.
Die Untergrenze, die jedes Modell schlagen muss
Man sagt für jeden Kunden die Basisrate voraus. Ihr mittlerer Log-Loss ist die Entropie der Zielvariable, etwa 0,528 Nat. Ein Kreditmodell, das auf dem Validierungsdatensatz nicht unter diesen Wert kommt, hat nichts Brauchbares gelernt.
Der Foliensatz zeigt außerdem die Form, die Bibliotheken tatsächlich berechnen, geschrieben mit dem Score , nämlich den Mittelwert von . Die Funktion ist die Softplus-Funktion, die sich auch für stark negative Scores ohne Überlauf auswerten lässt.
Die Sigmoidfunktion und das Logit
Die Sigmoidfunktion presst jeden reellen Score in eine Wahrscheinlichkeit, und ihre Umkehrung zeigt, dass die logistische Regression auf der Skala der Log-Odds eine Gerade ist.
Ein linearer Score durchläuft die ganze reelle Achse, eine Wahrscheinlichkeit liegt in . Die Sigmoidfunktion (sigmoid) verbindet beides. Da ist, ist der Nenner größer als 1, und das Ergebnis bleibt streng zwischen 0 und 1: Das Modell sagt nie Gewissheit voraus, was den Log-Loss auch von fernhält.
Die Ableitung ist die eine Formel, die man auswendig kennen sollte: Mit ihr ergibt sich der Gradient in wenigen Zeilen, und ihr Maximum von einem Viertel bei wird später erklären, warum Gradienten in tiefen Netzen mit Sigmoid-Aktivierung verschwinden. Löst man nach auf, erhält man das Logit (log-odds), den Logarithmus der Odds:
Probe bei einem Score von 2
- Exponentialfunktion. , der Nenner beträgt also etwa 1,135.
- Wahrscheinlichkeit. .
- Steigung. , unter der Obergrenze von 0,25.
- Zurück zum Score. , das Logit macht die Sigmoidfunktion also rückgängig.
Gradient, Hesse-Matrix und Konvexität
Die Richtung, in die sich die Koeffizienten bewegen sollen, ergibt sich aus der Differenz zwischen Vorhersage und tatsächlichem Ergebnis, und die Verlustfunktion hat nur ein einziges Tal.
Jeder Term der Log-Likelihood hängt von nur über den Score ab. Man leitet zuerst nach dem Score ab: Dank kürzen sich alle Nenner, und übrig bleibt , Beobachtung minus Vorhersage. Die Kettenregel multipliziert dann mit , und das Stapeln der Kunden ergibt ein Matrixprodukt.
Zum Vergleich die kleinsten Quadrate, deren Gradient ist. Dieselbe Form, ein anderes Residuum. Die Sigmoidfunktion verhindert eine Lösung in geschlossener Form, daher werden die Koeffizienten iterativ bestimmt, durch Gradientenabstieg (gradient descent) oder mit dem Newton-Verfahren (in der Statistik als IRLS bekannt).
Eine weitere Ableitung liefert die Hesse-Matrix (Hessian), eine -Matrix mit derselben Struktur wie , aber gewichtet mit , also mit Zahlen zwischen 0 und einem Viertel. Für jede Richtung ist die quadratische Form eine gewichtete Quadratsumme und damit nie negativ. Der Log-Loss ist also konvex: Jedes lokale Minimum ist global, und es ist eindeutig, wenn die Spalten von linear unabhängig sind.
Durchgerechnetes Beispiel: fünf Kunden, ein Merkmal (Monate im Zahlungsrückstand)
- Daten. Rückstände , Ergebnisse , vorhergesagte Wahrscheinlichkeiten (Zahlen zur Veranschaulichung).
- Abweichungen. , die beiden ausgefallenen Kunden werden also unterschätzt.
- Gradient. Jede Abweichung mit gewichten und addieren: . Negativ, also senkt eine Erhöhung des Rückstandskoeffizienten den Verlust.
- Hesse-Matrix. , die Verlustfunktion ist also nach oben gekrümmt.
- Newton-Schritt. Minus Gradient durch Hesse-Matrix, , ist der Betrag, um den der Koeffizient in einem Schritt steigen würde.
Bemerkung (Wenn das Minimum nicht existiert). Trennt eine Hyperebene die ausgefallenen Kunden perfekt von den übrigen, steigt die Likelihood immer weiter, während die Koeffizienten unbeschränkt wachsen (Albert und Anderson, 1984). Scikit-learn verdeckt das, weil es standardmäßig regularisiert; das Gegenmittel, die Regularisierung, ist Thema der nächsten Sitzung.
Softmax und Kreuzentropie für mehrere Klassen
Bei mehr als zwei Klassen bekommt jede Klasse einen Score, die Softmax-Funktion macht daraus Wahrscheinlichkeiten, und der Gradient behält die Form Vorhersage minus Beobachtung.
Man gibt jeder der Klassen einen eigenen linearen Score, wendet die Exponentialfunktion an, damit alle positiv werden, und teilt durch ihre Summe. Die Zielvariable ist ein One-Hot-Vektor, daher behält die Kreuzentropie nur einen Term: minus den Logarithmus der Wahrscheinlichkeit, die der wahren Klasse zugewiesen wird. Die Ableitung durch die Log-Sum-Exp-Funktion hindurch liefert ein verblüffend einfaches Ergebnis.
Mit den Scores betragen die Exponentialwerte etwa 7,389; 2,718 und 1 (Summe 11,107), die Wahrscheinlichkeiten 0,665; 0,245 und 0,090. Ist die erste Klasse die wahre, beträgt der Verlust , und der Gradient hebt den wahren Score an und senkt die anderen. Er summiert sich zu null, weil es nichts ändert, wenn man zu allen Scores dieselbe Konstante addiert.
Bei zwei Klassen ergibt das Teilen von Zähler und Nenner durch den Ausdruck . Die binäre logistische Regression ist die Softmax-Funktion mit , und nur die Differenz der Scores zählt, weshalb sie mit einem einzigen Koeffizientenvektor auskommt. Dieselbe Schicht schließt fast jedes Klassifikationsnetz ab (siehe den Artikel zu Attention).
Einen Koeffizienten als Odds Ratio lesen
Ein logistischer Koeffizient multipliziert die Odds mit einem festen Faktor, doch die Änderung der Wahrscheinlichkeit hängt davon ab, wo der Kunde startet.
Die Odds (die Chance im statistischen Sinn) sind , ein Kunde mit 10 % Ausfallwahrscheinlichkeit hat also Odds von 1 zu 9, etwa 0,111. Da das Logit linear ist, addiert eine Erhöhung von um eine Einheit bei sonst gleichen Werten zu den Log-Odds und multipliziert die Odds mit , dem Chancenverhältnis (Odds Ratio). Dieser Faktor ist für alle Kunden gleich, und genau deshalb ist er die richtige Zahl für eine Veröffentlichung.
Das Intervall wird auf der Skala des Koeffizienten gebildet, wo die Normalapproximation gilt, und dann exponenziert, daher ist es asymmetrisch um das Odds Ratio. Der Standardfehler stammt aus der inversen Hesse-Matrix am Schätzwert.
| Kunde | zu Beginn | Odds | Odds danach | am Ende | Änderung |
|---|---|---|---|---|---|
| geringes Risiko | 0,10 | 0,111 | 0,202 | 0,168 | +6,8 Prozentpunkte |
| Odds 1 zu 1 | 0,50 | 1,000 | 1,822 | 0,646 | +14,6 Prozentpunkte |
Gleiches Odds Ratio, doppelte Wirkung auf die Wahrscheinlichkeit. Die Formulierung „das Risiko steigt um 82 %“ ist daher falsch, und Validierer bemerken das sofort. Ein solider Bericht nennt das Odds Ratio mit seinem Intervall sowie die Wahrscheinlichkeit vorher und nachher für einen typischen Kunden. Sind kategoriale Variablen One-Hot-kodiert, nennt er außerdem die Referenzkategorie.
Bias-Varianz und Validierung ohne Data Leakage
Der Testfehler hat drei Quellen, von denen Sie nur eine beeinflussen, und ihn ehrlich zu messen heißt, dass keine Information aus dem Testdatensatz das Modell erreichen darf.
Für und ein Modell , das auf einer Zufallsstichprobe angepasst wurde, zerfällt der erwartete quadratische Fehler an einer Stelle in das nicht reduzierbare Rauschen, den quadrierten Bias (die systematische Abweichung einer zu einfachen Modellfamilie) und die Varianz (wie stark sich die Anpassung bewegt, wenn die Stichprobe neu gezogen wird). Das ist das Bias-Varianz-Dilemma (bias-variance trade-off). Der Beweis addiert und subtrahiert zweimal die mittlere Vorhersage, und beide Kreuzterme verschwinden.
| Polynomgrad | Bias² | Varianz | Diagnose | Gemessener Fehler |
|---|---|---|---|---|
| 0 | 0,999 | 0,019 | Unteranpassung | 1,103 |
| 3 | 0,000 | 0,011 | ungefähr richtig | 0,102 |
| 9 | 0,000 | 0,055 | Überanpassung | 0,145 |
In der Praxis sieht man die drei Terme nie getrennt; man sieht einen Trainingsfehler, der immer weiter sinkt, und einen Validierungsfehler, der wieder ansteigt. Die Kreuzvalidierung (cross-validation) schätzt diese zweite Kurve, ohne den Testdatensatz anzurühren: Man teilt die übrigen Zeilen in stratifizierte Teilmengen (Folds), trainiert auf , bewertet den zurückgehaltenen Fold und mittelt. Der Mittelwert ist für das Verfahren nahezu erwartungstreu, die angezeigte Standardabweichung ist aber kein Konfidenzintervall, da sich die Trainingsdatensätze stark überlappen (Bengio und Grandvalet, 2004).
Als Data Leakage gilt jede Statistik der Testdaten, die in das Modell einfließt. Die zwei Klassiker sind das Skalieren der Merkmale auf der gesamten Datei vor der Aufteilung (Abhilfe: eine Pipeline, die innerhalb jedes Folds angepasst wird) und ein Target Encoding, das auf allen Zeilen berechnet wird, sodass jede Zeile ihr eigenes Label sieht (Abhilfe: eine Kodierung außerhalb des jeweiligen Folds). Bei datierten Daten lassen gemischte Folds das Modell auf der Zukunft trainieren; ein TimeSeriesSplit trainiert auf der Vergangenheit und validiert auf dem, was folgt.
Bleibt die Frage, wie weit man einem Testergebnis trauen kann. Die Hoeffding-Ungleichung (Hoeffding's inequality) beschränkt die Abweichung zwischen gemessenem und wahrem Fehler für eine Verlustfunktion mit Werten in und unabhängige Zeilen, ohne jede Annahme über das Modell. Legt man das Risiko fest und löst auf, erhält man die Fehlermarge:
Mit und 1.000 Testzeilen ist ; teilt man durch 2.000 und zieht die Wurzel, erhält man etwa 0,043: Zwei Modelle mit 81 % und 84 % lassen sich nicht unterscheiden. Die Marge schrumpft wie , sie zu halbieren kostet also viermal so viele Zeilen; die 6.000 Testzeilen des Projekts ergeben etwa 1,8 Prozentpunkte. Die Garantie gilt nur, wenn man den Testdatensatz ein einziges Mal ansieht.
Der Start des Teamprojekts wendet all das auf die Kreditdaten an: ein SQL-Audit mit DuckDB, ein Datenblatt, das genau festhält, was die Zielvariable bedeutet, eine Leakage-Karte, die jede Spalte relativ zum Vorhersagezeitpunkt datiert, eine stratifizierte 60/20/20-Aufteilung, eingefroren durch einen Seed und einen Datei-Hash, und zwei Referenzmodelle (das konstante Modell bei 0,528 und eine logistische Regression mit Standardeinstellungen in einer Pipeline). Wie es weitergeht, zeigt die Projektseite.
Das Wichtigste in Kürze
- Wer eine Verteilung für die Zielvariable wählt, wählt die Verlustfunktion: Normalverteiltes Rauschen ergibt die kleinsten Quadrate, eine Bernoulli-Zielvariable den Log-Loss.
- Die Sigmoidfunktion bildet einen Score auf eine Wahrscheinlichkeit ab, ihre Ableitung ist , und ihre Umkehrung, das Logit, ist linear in den Merkmalen.
- Der logistische Gradient ist , dieselbe Form wie bei den kleinsten Quadraten; die Hesse-Matrix macht die Verlustfunktion konvex.
- Ein Koeffizient multipliziert die Odds mit . Berichten Sie das Odds Ratio mit seinem Intervall und die Wahrscheinlichkeiten vorher und nachher, nie eine prozentuale Änderung des Risikos.
- Der Testfehler ist Rauschen plus quadrierter Bias plus Varianz; nur der Kompromiss zwischen den beiden letzten hängt von Ihren Modellierungsentscheidungen ab.
- Jede Statistik des Testdatensatzes, die das Modell erreicht, ist ein Leak: Skalierung und Kodierungen innerhalb der Folds anpassen und bei datierten Daten die zeitliche Reihenfolge respektieren.
- Ein Testergebnis hat eine Marge von ungefähr , daher können einige hundert Testzeilen nahe beieinanderliegende Modelle nicht trennen.
Glossar
- Likelihood-Funktion (likelihood)
- Die Wahrscheinlichkeit der beobachteten Daten, betrachtet als Funktion der Modellparameter.
- Maximum-Likelihood-Schätzung (maximum likelihood estimation, MLE)
- Die Wahl der Parameter, unter denen die beobachteten Daten am wahrscheinlichsten sind.
- binäre Kreuzentropie (binary cross-entropy)
- Auch Log-Loss genannt: minus die mittlere Log-Likelihood einer 0/1-Zielvariable; die Verlustfunktion, die die logistische Regression minimiert.
- Sigmoidfunktion (sigmoid)
- Die Funktion , die einen reellen Score auf eine Wahrscheinlichkeit streng zwischen 0 und 1 abbildet.
- Logit (log-odds)
- Der Logarithmus von , die Umkehrfunktion der Sigmoidfunktion; in der logistischen Regression linear in den Merkmalen.
- Chancenverhältnis (Odds Ratio)
- Der Faktor , mit dem sich die Odds multiplizieren, wenn ein Merkmal um eine Einheit steigt.
- Hesse-Matrix (Hessian)
- Die Matrix der zweiten Ableitungen der Verlustfunktion; hier positiv semidefinit, daher die Konvexität.
- Softmax
- Wandelt K Scores durch Exponenzieren und Normieren in K Wahrscheinlichkeiten um.
- Bias-Varianz-Dilemma (bias-variance trade-off)
- Einfachere Modelle irren systematisch, flexible schwanken mit der Stichprobe; der Testfehler addiert beides zum Rauschen.
- Kreuzvalidierung (cross-validation)
- Mittelung des Fehlers über k Folds, von denen jeder einmal zurückgehalten wird, um den Fehler eines Verfahrens zu schätzen.
- Data Leakage
- Jede Information aus den Testdaten oder aus der Zukunft, die in das Training des Modells einfließt.
- Target Encoding
- Ersetzt eine Kategorie durch den Mittelwert der Zielvariable in dieser Kategorie; erzeugt ein Leak, wenn es nicht außerhalb des Folds berechnet wird.
- Hoeffding-Ungleichung (Hoeffding's inequality)
- Eine Schranke für die Abweichung zwischen gemessenem und wahrem Fehler, die nur eine beschränkte Verlustfunktion und unabhängige Zeilen voraussetzt.
Die anderen Notizen des Kurses
Eine öffentliche Zusammenfassung pro Foliensatz, in der Reihenfolge des Kurses.
Zurück: Projektrahmen und kleinste QuadrateWeiter: Gradientenabstieg, Ridge und Lasso
- 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: .