diff --git a/05-skalierung-und-optimierung/01-autoklassen-sklearn-sol.ipynb b/05-skalierung-und-optimierung/01-autoklassen-sklearn-sol.ipynb index a5d621ba00caa38aa04fc267ec2a168398ffcbf9..810c9f0b90362ef40deb3b3ae9f890709db9f2d1 100644 --- a/05-skalierung-und-optimierung/01-autoklassen-sklearn-sol.ipynb +++ b/05-skalierung-und-optimierung/01-autoklassen-sklearn-sol.ipynb @@ -90,9 +90,9 @@ "metadata": {}, "source": [ "Die Genauigkeit beträgt ungefähr – je nach zufälliger Aufteilung der\n", - "Trainings- und Testmengen – zwischen 41% und 70% und im Mittel ungefähr:" + "Trainings- und Testmengen – zwischen 44% und 68% und im Mittel ungefähr:" ], - "id": "0009-19f963d04e0849544556edd745a9be471ceb58af797b4db2b38d22fa480" + "id": "0009-ec3faf868b9fd06d732d32259934a4e0d4efcb34b9dea469c3f0e15359c" }, { "cell_type": "code", @@ -103,23 +103,23 @@ "output_type": "stream", "name": "stdout", "text": [ - "56.91%" + "56.9%" ] } ], "source": [ - "print(f'{score:.2%}')" + "print(f'{score:.1%}')" ], - "id": "0010-851f37ceb0a7044dfa1fd10aaaa6c95b36520a0daa77af6d92a2ffc565c" + "id": "0010-ce3c158735c9ccc98fbaccd48e82ac864bd06d11baee65cf59bee8af7c6" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wenn wir eine Toleranz von 1 Fahrzeugklasse verwenden, liegt die\n", - "Genauigkeit ungefähr zwischen und 83% und 100% und im Mittel ungefähr:" + "Genauigkeit ungefähr zwischen und 87% und 100% und im Mittel ungefähr:" ], - "id": "0011-c808456d33568ef391dd7f3b317070d77e2bf593a17ab55b3c39720291d" + "id": "0011-b528b01b16630de1ea4e40535ed8b41a636a13f3baeead08cd4ebe0f7d1" }, { "cell_type": "code", @@ -130,15 +130,15 @@ "output_type": "stream", "name": "stdout", "text": [ - "93.50%" + "92.7%" ] } ], "source": [ "near_miss_score = ((y_test - y_pred).abs() <= 1).mean()\n", - "print(f'{near_miss_score:.2%}')" + "print(f'{near_miss_score:.1%}')" ], - "id": "0012-1a056c770eab1c5dbdead803360ee3d448c0fd07feafcd3cca3af571230" + "id": "0012-d9d61bda13f255b0bcb6b0571e469e15514da2e324299034c21b8b5ca97" }, { "cell_type": "markdown", @@ -185,10 +185,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nun beträgt die Genauigkeit ungefähr zwischen 53% und 80% (anstatt 41%\n", - "und 70% ohne Skalierung) und im Mittel ungefähr:" + "Nun beträgt die Genauigkeit ungefähr zwischen 56% und 80% (anstatt 44%\n", + "und 68% ohne Skalierung) und im Mittel ungefähr:" ], - "id": "0019-0bf204d53815dfc0965e543aae77b558e780a212333b5db15702b0d78ae" + "id": "0019-4d1acdf985d02fef5a0cb6d08fba7376c042e81bf361de92247171a6136" }, { "cell_type": "code", @@ -199,14 +199,14 @@ "output_type": "stream", "name": "stdout", "text": [ - "67.48%" + "67.5%" ] } ], "source": [ - "print(f'{score_scaled:.2%}')" + "print(f'{score_scaled:.1%}')" ], - "id": "0020-7371b9a07c7f1fe25d35f203d86a7e69a1192272662e6ac06a14fe78ab2" + "id": "0020-2b227bfac245954cca77944ae660f99c7225c910eb3334e6717243ee9e2" }, { "cell_type": "markdown", @@ -259,10 +259,10 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Nun beträgt die Genauigkeit ungefähr zwischen 63.5% und 70.5% (anstatt\n", - "53% und 80% ohne Kreuzvalidierung) und im Mittel unverändert ungefähr:" + "Nun beträgt die Genauigkeit ungefähr zwischen 63.6% und 70.4% (anstatt\n", + "56% und 80% ohne Kreuzvalidierung) und im Mittel unverändert ungefähr:" ], - "id": "0027-3bfb561f3875f077095b32a0c7d0377f93fe688d38d4bb75de6898ef257" + "id": "0027-e8da2d1d8de5024f297751a4bff906c35c2edf2860ffdc8a9c5615a187f" }, { "cell_type": "code", @@ -273,23 +273,23 @@ "output_type": "stream", "name": "stdout", "text": [ - "67.15%" + "67.2%" ] } ], "source": [ - "print(f'{score_scaled_cv:.2%}')" + "print(f'{score_scaled_cv:.1%}')" ], - "id": "0028-98a7f9a2738231b6905840f64f990616c7cacfb64bc2570d40af1bfa18d" + "id": "0028-b37cb549f7ca0b03d5a4d6629c5cafb8f5a20152339f4939100b1f47cb7" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mit `RepeatedStratifiedKFold` mit Default-Werten (also `n_splits=5` und\n", - "`n_repeats=10`) liegt die Genauigkeit zwischen 66.4% und 68.6%. Das ist\n", - "eine sehr geringe Spanne, die besser für eine Hyperparameteroptimierung\n", - "geeignet ist.\n", + "`n_repeats=10`) liegt die Genauigkeit zwischen 66.2% und 68.6% und im\n", + "Mittel bei ungefähr 67.5%. Das ist eine sehr geringe Spanne, die besser\n", + "für eine Hyperparameteroptimierung geeignet ist.\n", "\n", "## d) Optuna\n", "\n", @@ -298,10 +298,12 @@ "\n", "1. Der Startcode implementiert bereits die Optimierung von $k$ und $p$\n", " mit Optuna. Schauen Sie sich den Startcode an und probieren ihn aus.\n", - "2. Fügen Sie in die `objective`-Funktion für jedes Feature jeweils\n", - " einen Skalierungsfaktor als Hyperparameter hinzu, der das Feature\n", - " nach der Skalierung umskaliert. Vielleicht ist es von Vorteil, wenn\n", - " einige Features den Abstand stärker beeinflussen als andere.\n", + "2. Fügen Sie in die `objective`-Funktion für jedes der sechs Feature\n", + " (Grundpreis etc.) jeweils einen Skalierungsfaktor mittels\n", + " `trial.suggest_float(name, low, high)` als Hyperparameter hinzu, der\n", + " das Feature nach der Skalierung umskaliert. *Hinweis: Es gibt noch\n", + " einen Booleschen Parameter `log` um den Wert logarithmisch zu\n", + " optimieren und später auch zu visualisieren.*\n", "3. Führen Sie die Optimierung durch.\n", "4. Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und\n", " wählen Sie gute Parameter.\n", @@ -313,7 +315,7 @@ "$[10^{-2}, 10^0] = [0.01, 1]$ genauso wahrscheinlich ist, wie der\n", "Bereich $[10^0, 10^2] = [1, 100]$." ], - "id": "0034-ae5d5a5918f209ffcbd24188436259e7ef46c1b452327ef493c1324aeef" + "id": "0034-99b712c6dde4c224091d9e61c112d4d7de601f43c428d8047fbc5cb168e" }, { "cell_type": "code", @@ -351,11 +353,38 @@ }, "outputs": [], "source": [ - "study = optuna.create_study(direction='maximize', sampler=optuna.samplers.GPSampler(deterministic_objective=True)) # less duplicate trials\n", - "study.optimize(objective, n_trials=100, n_jobs=4)\n", - "fig = optuna.visualization.plot_parallel_coordinate(study)" + "study = optuna.create_study(direction='maximize')\n", + "study.optimize(objective, n_trials=100, n_jobs=4)" ], - "id": "0037-79487c80368ad85001b24281bc990d3a53e0e926e8d11a2d56ee7b43d52" + "id": "0037-64c45d4d68fec04dc857c908355dc28f6b9a085d1aec4c9ce469da8e09c" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "style": "python" + }, + "outputs": [], + "source": [ + "fig = optuna.visualization.plot_parallel_coordinate(study)\n", + "fig.show()" + ], + "id": "0038-d681bc8da4b8bed01a50012745e461c2284df7720f1b11dc2298839da91" + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Aus dem Ergebnis lässt sich ablesen, dass das Leergewicht und der\n", + "Verbrauch ungefähr den Faktor 10 bekommen, die Türanzahl 0.01 und der\n", + "Rest den Faktor 100. Wenn wir das umsetzen schwankt das Ergebnis mit\n", + "einem `RepeatedStratifiedKFold` mit Default-Werten (also `n_splits=5`\n", + "und `n_repeats=10`) zwischen 66.8% und 69.5% und liegt im Mittel\n", + "ungefähr bei 68.1% anstatt 67.5% ohne optimierte Skalierung. Durch die\n", + "Optimierung konnte die Genauigkeit also im Mittel um 0.6 Prozentpunkte\n", + "verbessert werden." + ], + "id": "0039-71ac3459b1f4c926322d9f087ac4b16c2b55bb269c7df97ba19382bf0fa" } ], "nbformat": 4, diff --git a/05-skalierung-und-optimierung/01-autoklassen-sklearn.ipynb b/05-skalierung-und-optimierung/01-autoklassen-sklearn.ipynb index 15a76b66bed87e12fc2a03e074d00db7a98cde83..0cfb5cb879de237212f82ebbbd388a39744f5eb6 100644 --- a/05-skalierung-und-optimierung/01-autoklassen-sklearn.ipynb +++ b/05-skalierung-und-optimierung/01-autoklassen-sklearn.ipynb @@ -46,7 +46,7 @@ "import pandas as pd\n", "import optuna\n", "from sklearn.metrics import accuracy_score\n", - "from sklearn.model_selection import cross_val_score, StratifiedKFold, train_test_split\n", + "from sklearn.model_selection import cross_val_score, StratifiedKFold, RepeatedStratifiedKFold, train_test_split\n", "from sklearn.neighbors import KNeighborsClassifier\n", "from sklearn.preprocessing import RobustScaler\n", "\n", @@ -60,7 +60,7 @@ "\n", "# TODO: Genauigkeit ausgeben" ], - "id": "0005-682ba86e4b2ef1a270871f098102d4349b3f2b0977c41614e4b442895f7" + "id": "0005-10e2d5cbeeffb18b853f569fe4d991bd3fa0deb348f46e7a98dfc05777a" }, { "cell_type": "markdown", @@ -126,15 +126,17 @@ "\n", "1. Der Startcode implementiert bereits die Optimierung von $k$ und $p$\n", " mit Optuna. Schauen Sie sich den Startcode an und probieren ihn aus.\n", - "2. Fügen Sie in die `objective`-Funktion für jedes Feature jeweils\n", - " einen Skalierungsfaktor als Hyperparameter hinzu, der das Feature\n", - " nach der Skalierung umskaliert. Vielleicht ist es von Vorteil, wenn\n", - " einige Features den Abstand stärker beeinflussen als andere.\n", + "2. Fügen Sie in die `objective`-Funktion für jedes der sechs Feature\n", + " (Grundpreis etc.) jeweils einen Skalierungsfaktor mittels\n", + " `trial.suggest_float(name, low, high)` als Hyperparameter hinzu, der\n", + " das Feature nach der Skalierung umskaliert. *Hinweis: Es gibt noch\n", + " einen Booleschen Parameter `log` um den Wert logarithmisch zu\n", + " optimieren und später auch zu visualisieren.*\n", "3. Führen Sie die Optimierung durch.\n", "4. Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und\n", " wählen Sie gute Parameter." ], - "id": "0015-1a2cb5f0269a7d88b4861ef37715bd33303afa2fbaa8fa3b50c9bcc2ab2" + "id": "0015-d383366da2c95086a6bb5d2d706285955ac6e8a9c88a34334363d362458" }, { "cell_type": "code", @@ -171,11 +173,23 @@ }, "outputs": [], "source": [ - "study = optuna.create_study(direction='maximize', sampler=optuna.samplers.GPSampler(deterministic_objective=True)) # less duplicate trials\n", - "study.optimize(objective, n_trials=100, n_jobs=4)\n", - "fig = optuna.visualization.plot_parallel_coordinate(study)" + "study = optuna.create_study(direction='maximize')\n", + "study.optimize(objective, n_trials=100, n_jobs=4)" ], - "id": "0018-79487c80368ad85001b24281bc990d3a53e0e926e8d11a2d56ee7b43d52" + "id": "0018-64c45d4d68fec04dc857c908355dc28f6b9a085d1aec4c9ce469da8e09c" + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "style": "python" + }, + "outputs": [], + "source": [ + "fig = optuna.visualization.plot_parallel_coordinate(study)\n", + "fig.show()" + ], + "id": "0019-d681bc8da4b8bed01a50012745e461c2284df7720f1b11dc2298839da91" } ], "nbformat": 4,