Overfitting ist eine der größten Stolpersteine im Machinellen Lernen. Jeder, der mit Daten zu tun hat, ist in diese Falle schon mal gelaufen. Hoffentlich wurde es bemerkt, denn ansonsten waren die gefunden Zusammenhänge oder der Prognose-Algorithmus für die Tonne. Muss man so hart sagen.

In diesem Artikel erfährst Du alles über Overfitting, aber auch Underfitting, und warum es so wichtig ist, das Problem in den Griff zu bekommen.

Was ist Overfitting?

Overfitting bedeutet übersetzt Überanpassung und bezeichnet eben die Überanpassung von Algorithmen bzw. deren Parameter an die beobachteten Daten. Im Machine Learning Kontext bedeutet das, der Algorithmus lernt im Prinzip den Datensatz „auswendig“, erkennt aber nicht das zugrundeliegende Muster oder System. Damit sind Prognosen, die der Algorithmus aus noch unbekannten Daten liefern soll, nicht sonderlich gut.

Auch in der Datenanalyse kommt es häufig zu Overfitting. In diesem Kontext werden Muster und Zusammenhänge erkannt, die aber eigentlich gar nicht vorhanden sind.

Nehmen wir als Beispiel eine Kurve durch vier Punkte. Statt einer Geraden durch die Punkte zu legen (als Python-Nutzer kannst Dir mein Praxis-Tutorial zur linearen Regression anschauen) könnten wir auch ein Polynom dritten Grades durch die Punkte legen. Das passt ja viel besser, denn die Kurve führt genau durch die Punkte, dementsprechend ist der Fehler 0.

Veranschaulichung Overfitting: Gerade und Polynom dritten Gerades durch vier Punkte

Ok, also was ist eigentlich das Problem hinter der Sache? Im Prinzip verwendet man ein zu komplexes Modell, das zwar genau auf den vorhandenen Datensatz passt, aber keine Verallgemeinerungskraft besitzt.

y = a*x³ + b*x² + c*x + d

Aber Moment, wenn wir a und b gleich Null setzen, haben wir ja die einfache Geradengleichung. Also theoretisch sollte auch das komplexere Modell den richtigen Zusammenhang finden. Das eigentliche Problem liegt also nicht direkt in der Modellwahl, sondern in der Anzahl verfügbarer Parameter. Dabei geht es nicht um die absolute Anzahl Parameter, sondern um das Verhältnis zwischen der Anzahl Parameter und der Anzahl Beobachtungen. Gibt es genug Beobachtungen, sollte der Algorithmus erkennen, dass die Koeffizienten a und b Null oder nahe bei Null sein sollten.

Nehmen wir an, wir haben 100 Beobachten. Dann scheint es zu funktionieren. Das Verhältnis zwischen 100 Beobachtungen und 4 Parametern ist gut genug.

 

a

b

c

d

tatsächlicher Wert

0

0

3

0

Regression mit Polynom 3.Grades

0,007271

0,004726    

2,987975    

0,078643    

Neuronale Netze, die aktuell modernste Form der Machine Learning Algorithmen, sind strukturell zwar komplizierter als so eine lineare Regression, aber das Prinzip ist das Gleiche. Wir haben Parameter, welche anhand eines Datensatzes bestimmt werden. Jetzt ist es aber so, dass die Anzahl Parameter mit der Größe bzw. Tiefe des neuronalen Netzes explodiert. Die große Version von OpenAI GPT-3, der aktuell wahrscheinlich mächtigsten künstlichen Texterzeugung, hat stolze 175 Milliarden Parameter. Dementsprechend wurde GPT-3 mit den größten Textdatensätzen gefüttert, die zur Verfügung stehen, insgesamt waren das auch mehrere hundert Milliarden Wörtern.

Das ist vielleicht ein Extrembeispiel, aber viele sich im Einsatz befindenden neuronalen Netze haben mehrere Millionen Parameter. Und damit wird dann auch klar, warum man so große Datenmengen benötigt, um diese Machine Learning Algorithmen vernünftig zu trainieren. Irgendwie müssen diese vielen Parameter eingestellt werden. Der Mensch hingegen ist ziemlich gut darin, aus wenigen Beispielen zu lernen. Daher wird auch daran geforscht, wie das mit Machine Learning gehen könnte (siehe meinen kurzen Artikel über One-Shot-Learning)

Aber auch im Kleinen ist Overfitting ein Problem. Habt ihr auch schon so häufig gehört: „Ich habe 10 Leute befragt und möchte nun diese 5 Variablen statistisch untersuchen“? Also nochmal:

Das Verhältnis zwischen der Anzahl Parameter und der Datensatzgröße ist entscheidend!

 

Ist Underfitting eigentlich auch ein Problem?

Underfitting bedeutet interessanterweise nicht das direkte Gegenteil: „Zu viele Daten und zu wenig Parameter“. Zu viele Daten kann man nie haben 😉. Mit Underfitting ist gemeint, dass das Modell zu den beobachteten Daten passt bzw. zu einfach ist, also irgendwie doch wieder zu wenig Parameter.

Stellt Euch vor, es liegt in der Realität ein quadratischer Zusammenhang vor (z.B. Bremsweg zu Geschwindigkeit), wir legen aber nur eine Gerade an.

Beispiel für Underfitting: Lineare Regression bei quadratischem Zusammenhang

Wie vermeidet man Overfitting?

Ok, nun wissen wir also, was Overfitting im Machine Learning bedeutet. Aber wie können wir es vermeiden?

Einen ersten Ansatz kennt Ihr bereits: mehr Daten. Das hilft auf jeden Fall schon mal weiter, ist aber nicht immer realisierbar oder mit hohen Kosten (z.B. Umfragen) verbunden.

Der zweite Ansatz ist auch aus dem vorherigen Abschnitt klar: weniger Parameter. Erst kürzlich hatte ich bei einer Analyse einige Variablen, die jeweils für eine bestimmte Vorerkrankung mit Werten ja oder nein standen. Anstatt alle diese Variablen in das statistische Modell zu kippen, habe ich diese Variablen zu einer Variablen zusammengefasst, die nur zählt, wie viele Vorerkrankungen der Patient hat. Solche Ansätze werden übrigens auch als Feature Engineering bezeichnet.

 

Aufteilung in Trainings- und Testdatensatz

Wie überprüft man, ob ein Modell gut ist bzw. das zugrundeliegende Muster abbildet? Man testet es an frischen Daten und analysiert das Ergebnis!

Wenn ich jetzt aber den gesamten Datensatz für das Training (also die Parameterbestimmung/-optimierung) verbraten habe, habe ich ein Problem. Ich kann nämlich nicht den gleichen Datensatz zur Bestimmung der Qualität verwenden, denn diese Daten lagen dem Algorithmus schon vor. Da beißt sich die Katze in den Schwanz. Ich müsste also irgendwoher neue Daten sammeln.

Deshalb unterteilt man den vorhandenen Datensatz in einen Trainings- und einen Testdatensatz auf. Nur mit dem Trainingsdatensatz wird der Machine Learning Algorithmus gefüttert. Der Testdatensatz kommt erst zum Einsatz, wenn der Algorithmus ausgelernt hat. Der Testdatensatz ist ausschließlich zur Bestimmung der Güte da, für nichts anderes.

Meist wird im Verhältnis 70/30, 80/20 oder bei großen Datensätzen auch mal 90/10 aufgeteilt, also 70%, 80% oder 90% für das Training und der Rest entsprechend für den Test.

 

Und was ist der Validierungsdatensatz?

Im Zusammenhang mit ML-Algorithmen wie neuronalen Netzen gibt es noch einen weiteren Typ, nämlich den Validierungsdatensatz. Dieser wird verwendet, um die sogenannten Hyperparameter des ML-Algorithmus zu optimieren. Bei neuronalen Netzen versteht man darunter zum Beispiel die Topologie des neuronalen Netzes, also wie viele Ebenen, Knoten, Art der Ebenen usw. es besitzt.

Denn auch diese Parameter müssen festgelegt werden. Hyperparameter deshalb, weil sie noch vor dem eigentlichen Training gesetzt werden.

Das Vorgehen ist dann so, dass für die Hyperparameter mehrere mögliche Werte definiert werden. D ann wird für jede Kombination anhand des Trainingsdatensatzes gelernt. Anschließend wird mit Hilfe des Validierungsdatensatz die Qualität bestimmt und dadurch die beste Wahl der Hyperparameter herausgefunden. Der Testdatensatz kommt erst wieder ganz zum Schluss zum Einsatz, wenn alle Parameter festgelegt sind und die finale Qualität beurteilt werden soll.

 

 

Also, haltet euch fit, aber niemals overfit 😉

So long,

Euer Holger