diff --git a/Regression/Wine-Alcohol/Vorhersage des Alkoholgehalts von Wein.ipynb b/Regression/Wine-Alcohol/Vorhersage des Alkoholgehalts von Wein.ipynb index 7cd8c29..02a24d8 100644 --- a/Regression/Wine-Alcohol/Vorhersage des Alkoholgehalts von Wein.ipynb +++ b/Regression/Wine-Alcohol/Vorhersage des Alkoholgehalts von Wein.ipynb @@ -18,7 +18,7 @@ }, "source": [ "---\n", - "Die Klasse von Wein finden Sie in Notebook _\"Klassifikation von Wein\"_ heraus. Aber manchmal sind andere Eigenschaften des Weins von Interessse, die sich nicht in eine finite Anzahl von Klassen einteilen lassen. In diesem Notebook befassen wir uns daher mit der Vorhersage des Alkoholgehalts von Wein mittels Regressionsanalyse.\n", + "Die Klasse von Wein finden Sie im Notebook _\"Klassifikation von Wein\"_ heraus. Aber manchmal sind andere Eigenschaften des Weins von Interessse, die sich nicht in eine finite Anzahl von Klassen einteilen lassen. In diesem Notebook befassen wir uns daher mit der Vorhersage des Alkoholgehalts von Wein mittels Regressionsanalyse.\n", "\n", "\n", "\"Title\n", @@ -57,6 +57,8 @@ " \n", "\n", "\n", + "**Hinweis:** In diesem Notebook sind einige Stellen enthalten, an denen Zufallszahlen zum Einsatz kommen (z.B. die Einteilung in Trainings- und Testset). Dadurch kann es passieren, dass manche Ergebnisse für Sie nicht exakt reproduzierbar sind und das relative Ranking der verschiedenen Regressionsmodelle oder die optimalen Werte mancher Hyperparameter bei Ihnen etwas anders aussehen. Das ändert allerdings nichts an der generellen Vorgehensweise oder den Programmiermustern. \n", + "\n", "---\n" ] }, @@ -212,14 +214,14 @@ "source": [ "Wir stellen drei wichtige Tatsachen fest:\n", "\n", - "1. Es gibt insgesamt 6497 Weine gibt, für die uns Daten vorliegen (__```count```__), zumindest gibt es so viele Einträge in jeder Spalte. Wir müssen also erfreulicherweise keine Daten auffüllen! \n", + "1. Es gibt insgesamt 6497 Weine, für die uns Daten vorliegen (__```count```__), zumindest gibt es so viele Einträge in jeder Spalte. Wir müssen also erfreulicherweise keine Daten auffüllen! \n", "2. Alle Merkmale sind rein numerisch. Wir müssen also auch keine Daten konvertieren!\n", "3. Die Daten sind sehr unterschiedlich skaliert, da die Mittelwerte (__```mean```__) und Standardabweichungen (__```std```__) über mehrere Größenordnungen hinweg streuen.\n", "\n", "Daher bietet es sich an, die Spalten zunächst einzeln zu standardisieren, so dass sie jeweils einen Mittelwert von 0 und eine Standardabweichung von 1 haben (auch $z$-Score Normalisierung genannt). Dadurch sind werden also alle Merkmale in die gleiche Größenordnung gebracht, ohne die relative Verteilung zu vereinfachen.\n", "\n", "Unser Fahrplan für die Säuberung der Daten ist also klar:\n", - "- Kein konvertieren oder auffüllen nötig\n", + "- Kein Konvertieren oder Auffüllen nötig\n", "- Standardisierung der Daten empfehlenswert\n", "---" ] @@ -530,9 +532,9 @@ "editable": false }, "source": [ - "**Hinweis:** Bei Regressionsmodellen höherer Ordnung verwendet man häufig nicht nur die Merkmale in der jeweiligen Potenz, sonder auch die sogenannten \"Interaktionsterme\", also die paarweisen Multiplikationen der Merkmale. Für nur zwei Merkmale $(x_1, x_2) würde das also das folgende Modell ergeben:\n", + "**Hinweis:** Bei Regressionsmodellen höherer Ordnung verwendet man häufig nicht nur die Merkmale in der jeweiligen Potenz, sonder auch die sogenannten \"Interaktionsterme\", also die paarweisen Multiplikationen der Merkmale. Für nur zwei Merkmale $(x_1, x_2)$ würde das also das folgende Modell ergeben:\n", "\n", - "$$\\hat{y} = w_0 + w_1 \\cdot x_1 + w_2 \\cdot x_1 \\cdot x_2 + w_3 \\cdot x_1^2 + w_4\\cdot x_2^2$$\n", + "$$\\hat{y} = w_0 + w_1 \\cdot x_1 + w_2 \\cdot x_1 \\cdot x_2 + w_3 \\cdot x_1^2 + w_4\\cdot x_2 + w_5\\cdot x_2^2$$\n", "\n", "Bei einer größeren Anzahl Merkmale wird die Merkmaltransformation hierzu sehr aufwändig. Darum bietet ```sklearn``` das Objekt [```PolynomialFeatures```](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.PolynomialFeatures.html) an, mit dem diese Transformation erheblich einfacher implementiert werden kann. Schauen Sie sich doch die verlinkte Dokumentation mal an und versuchen Sie die Transformation für zweite und dritte Ordnung doch mal damit zu machen!\n", "\n", @@ -648,7 +650,7 @@ "editable": false }, "source": [ - "In der Vorlesung wurde erwähnt, dass auch Support Vector Machines (SVM) für die Regression angewendet werden können. Auch wenn diese Methoden nicht Gegenstand der Vorlesung sind und ihr theoretischer Hintergrund an dieser Stelle den Rahmen sprechen würde, wollen wir sie doch ausprobieren, da sie ein sehr mächtiges Modell darstellen und durch ```sklearn```auch ohne tieferes Wissen implementierbar sind.\n", + "In der Vorlesung wurde erwähnt, dass auch Support Vector Machines (SVM) für die Regression angewendet werden können. Auch wenn diese Methoden nicht Gegenstand der Vorlesung sind und ihr theoretischer Hintergrund an dieser Stelle den Rahmen sprengen würde, wollen wir sie doch ausprobieren, da sie ein sehr mächtiges Modell darstellen und durch ```sklearn```auch ohne tieferes Wissen implementierbar sind.\n", "\n", "Die (sehr stark vereinfachte) Grundidee bei der Regression mit Support Vector Machines ist, dass sich ähnlich wie bei der Klassifikation die zu findende Funktion nicht auf alle Datenpunkte stützt, sondern nur auf einige wenige Supportvektoren, durch die dann die Regressionsfunktion gelegt wird. Ein Parameter $\\epsilon$ steuert, wie viele Punkte noch berücksichtigt werden, wobei ein größeres $\\epsilon$ eine geringere Empfindlichkeit auf Ausreißer bedeutet. Auch bei der Regression können Sie den Kernel-Trick (siehe Vorlesung) anwenden und durch den Parameter $C$ regularisieren.\n", "\n", @@ -695,7 +697,9 @@ "\n", "**Es empfiehlt sich sehr, die Hyperparameteroptimierung auf einem parallen Rechner auszuführen!*** Da jede Hyperparameterkonfiguration und jede Kreuzvalidierung unabhängig voneinander berechnet werden können, ist hier ein nahezu perfekter paralleler [Speedup](https://de.wikipedia.org/wiki/Speedup) möglich. Ein einfaches Beispiel (gilt analog für Hyperparameter in der Regression):\n", "\n", - "Sie wollen prüfen, welche Zahl zwischen 1 und 10 die beste Zahl von Nachbarn in dem $k$ Nächste Nachbarn Klassifikator darstellt. Dazu müssen Sie also 10 Modelle mit 10 verschiedenen Werten für $k$ berechnen und diese miteinander vergleichen. Zum Vergleich wollen Sie jedes Modell mit 4 Folds validieren. Dazu müssen Sie also für jeden der 10 Werte von $k$ schon 4 Modell berechnen, also insgesamt 40 Trainingsvorgänge. Auf einem Single-CPU Rechner dauert dies dann zum Beispiel eine Minute. Da alle Berechnungen getrennt voneinander gemacht werden könne, kann das exakt gleiche Training auf einem Parallelrechner mit z.B. 20 CPUs in 1/20 der Zeit gerechnet werden, also in diesem Beispiel in nur 3 Sekunden. Wenn noch weitere Hyperparameter optimiert oder mehr Werte ausprobiert werden sollen, explodiert der Rechenaufwand entsprechend durch die kombinatorische Vielfalt des Gitters. Parallele Ausführung ist hier also enorm wichtig. ***Wir empfehlen daher nachdrücklich das Arbeiten auf dem HPC (siehe [Einführung ins Praktikum](https://bildungsportal.sachsen.de/opal/auth/RepositoryEntry/23165501449/CourseNode/101490883666782))!***" + "Sie wollen prüfen, welche Zahl zwischen 1 und 10 die beste Zahl von Nachbarn in dem $k$ Nächste Nachbarn Klassifikator darstellt. Dazu müssen Sie also 10 Modelle mit 10 verschiedenen Werten für $k$ berechnen und diese miteinander vergleichen. Zum Vergleich wollen Sie jedes Modell mit 4 Folds validieren. Dazu müssen Sie also für jeden der 10 Werte von $k$ schon 4 Modell berechnen, also insgesamt 40 Trainingsvorgänge. Auf einem Single-CPU Rechner dauert dies dann zum Beispiel eine Minute. Da alle Berechnungen getrennt voneinander gemacht werden könne, kann das exakt gleiche Training auf einem Parallelrechner mit z.B. 20 CPUs in 1/20 der Zeit gerechnet werden, also in diesem Beispiel in nur 3 Sekunden. Wenn noch weitere Hyperparameter optimiert oder mehr Werte ausprobiert werden sollen, explodiert der Rechenaufwand entsprechend durch die kombinatorische Vielfalt des Gitters. Parallele Ausführung ist hier also enorm wichtig. ***Wir empfehlen daher nachdrücklich das Arbeiten auf dem HPC (siehe [Einführung ins Praktikum](https://bildungsportal.sachsen.de/opal/auth/RepositoryEntry/23165501449/CourseNode/101490883666782))!***\n", + "\n", + "**Achtung:** Die Dauer des Trainings ist stark abhängig von der Größe des Parameters $C$. Für kleine Werte von $C$ kann das Training schon nach wenigen Sekunden abgeschlossen sein, während es bei großen Werten durchaus mehrere Minuten dauern kann. Wundern Sie sich also nicht, wenn die Kreuzvalidierung zwischendurch \"eingefroren\" erscheint." ] }, {