Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Data Science Notebooks
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Code
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Christof Kaufmann
Data Science Notebooks
Commits
07077bd8
Commit
07077bd8
authored
May 16, 2024
by
Christof Kaufmann
Browse files
Options
Downloads
Patches
Plain Diff
Notebooks from applied-cs/data-science@362d8c56
parent
cf67b231
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
05-skalierung-und-optimierung/01-autoklassen-sklearn-sol.ipynb
+63
-34
63 additions, 34 deletions
...alierung-und-optimierung/01-autoklassen-sklearn-sol.ipynb
05-skalierung-und-optimierung/01-autoklassen-sklearn.ipynb
+25
-11
25 additions, 11 deletions
05-skalierung-und-optimierung/01-autoklassen-sklearn.ipynb
with
88 additions
and
45 deletions
05-skalierung-und-optimierung/01-autoklassen-sklearn-sol.ipynb
+
63
−
34
View file @
07077bd8
...
@@ -90,9 +90,9 @@
...
@@ -90,9 +90,9 @@
"metadata": {},
"metadata": {},
"source": [
"source": [
"Die Genauigkeit beträgt ungefähr – je nach zufälliger Aufteilung der\n",
"Die Genauigkeit beträgt ungefähr – je nach zufälliger Aufteilung der\n",
"Trainings- und Testmengen – zwischen 4
1
% und
70
% und im Mittel ungefähr:"
"Trainings- und Testmengen – zwischen 4
4
% und
68
% und im Mittel ungefähr:"
],
],
"id": "0009-
19f963d04e0849544556edd745a9be471ceb58af797b4db2b38d22fa480
"
"id": "0009-
ec3faf868b9fd06d732d32259934a4e0d4efcb34b9dea469c3f0e15359c
"
},
},
{
{
"cell_type": "code",
"cell_type": "code",
...
@@ -103,23 +103,23 @@
...
@@ -103,23 +103,23 @@
"output_type": "stream",
"output_type": "stream",
"name": "stdout",
"name": "stdout",
"text": [
"text": [
"56.9
1
%"
"56.9%"
]
]
}
}
],
],
"source": [
"source": [
"print(f'{score:.
2
%}')"
"print(f'{score:.
1
%}')"
],
],
"id": "0010-
851f37ceb0a7044dfa1fd10aaaa6c95b36520a0daa77af6d92a2ffc565c
"
"id": "0010-
ce3c158735c9ccc98fbaccd48e82ac864bd06d11baee65cf59bee8af7c6
"
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
"metadata": {},
"metadata": {},
"source": [
"source": [
"Wenn wir eine Toleranz von 1 Fahrzeugklasse verwenden, liegt die\n",
"Wenn wir eine Toleranz von 1 Fahrzeugklasse verwenden, liegt die\n",
"Genauigkeit ungefähr zwischen und 8
3
% und 100% und im Mittel ungefähr:"
"Genauigkeit ungefähr zwischen und 8
7
% und 100% und im Mittel ungefähr:"
],
],
"id": "0011-
c808456d33568ef391dd7f3b317070d77e2bf593a17ab55b3c39720291d
"
"id": "0011-
b528b01b16630de1ea4e40535ed8b41a636a13f3baeead08cd4ebe0f7d1
"
},
},
{
{
"cell_type": "code",
"cell_type": "code",
...
@@ -130,15 +130,15 @@
...
@@ -130,15 +130,15 @@
"output_type": "stream",
"output_type": "stream",
"name": "stdout",
"name": "stdout",
"text": [
"text": [
"9
3.50
%"
"9
2.7
%"
]
]
}
}
],
],
"source": [
"source": [
"near_miss_score = ((y_test - y_pred).abs() <= 1).mean()\n",
"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",
"cell_type": "markdown",
...
@@ -185,10 +185,10 @@
...
@@ -185,10 +185,10 @@
"cell_type": "markdown",
"cell_type": "markdown",
"metadata": {},
"metadata": {},
"source": [
"source": [
"Nun beträgt die Genauigkeit ungefähr zwischen 5
3
% und 80% (anstatt 4
1
%\n",
"Nun beträgt die Genauigkeit ungefähr zwischen 5
6
% und 80% (anstatt 4
4
%\n",
"und
70
% ohne Skalierung) und im Mittel ungefähr:"
"und
68
% ohne Skalierung) und im Mittel ungefähr:"
],
],
"id": "0019-
0bf204d53815dfc0965e543aae77b558e780a212333b5db15702b0d78ae
"
"id": "0019-
4d1acdf985d02fef5a0cb6d08fba7376c042e81bf361de92247171a6136
"
},
},
{
{
"cell_type": "code",
"cell_type": "code",
...
@@ -199,14 +199,14 @@
...
@@ -199,14 +199,14 @@
"output_type": "stream",
"output_type": "stream",
"name": "stdout",
"name": "stdout",
"text": [
"text": [
"67.
48
%"
"67.
5
%"
]
]
}
}
],
],
"source": [
"source": [
"print(f'{score_scaled:.
2
%}')"
"print(f'{score_scaled:.
1
%}')"
],
],
"id": "0020-
7371b9a07c7f1fe25d35f203d86a7e69a1192272662e6ac06a14fe78ab
2"
"id": "0020-
2b227bfac245954cca77944ae660f99c7225c910eb3334e6717243ee9e
2"
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
...
@@ -259,10 +259,10 @@
...
@@ -259,10 +259,10 @@
"cell_type": "markdown",
"cell_type": "markdown",
"metadata": {},
"metadata": {},
"source": [
"source": [
"Nun beträgt die Genauigkeit ungefähr zwischen 63.
5
% und 70.
5
% (anstatt\n",
"Nun beträgt die Genauigkeit ungefähr zwischen 63.
6
% und 70.
4
% (anstatt\n",
"5
3
% und 80% ohne Kreuzvalidierung) und im Mittel unverändert ungefähr:"
"5
6
% und 80% ohne Kreuzvalidierung) und im Mittel unverändert ungefähr:"
],
],
"id": "0027-
3bfb561f3875f077095b32a0c7d0377f93fe688d38d4bb75de6898ef257
"
"id": "0027-
e8da2d1d8de5024f297751a4bff906c35c2edf2860ffdc8a9c5615a187f
"
},
},
{
{
"cell_type": "code",
"cell_type": "code",
...
@@ -273,23 +273,23 @@
...
@@ -273,23 +273,23 @@
"output_type": "stream",
"output_type": "stream",
"name": "stdout",
"name": "stdout",
"text": [
"text": [
"67.
15
%"
"67.
2
%"
]
]
}
}
],
],
"source": [
"source": [
"print(f'{score_scaled_cv:.
2
%}')"
"print(f'{score_scaled_cv:.
1
%}')"
],
],
"id": "0028-
98a7f9a2738231b6905840f64f990616c7
ca
c
fb
64bc2570d40af1bfa18d
"
"id": "0028-
b37cb549f7ca0b03d5a4d6629c5
cafb
8f5a20152339f4939100b1f47cb7
"
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
"metadata": {},
"metadata": {},
"source": [
"source": [
"Mit `RepeatedStratifiedKFold` mit Default-Werten (also `n_splits=5` und\n",
"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",
"`n_repeats=10`) liegt die Genauigkeit zwischen 66.
2
% und 68.6%
und im
\n",
"eine sehr geringe Spanne, die besser
für eine Hyperparameteroptimierung
\n",
"
Mittel bei ungefähr 67.5%. Das ist
eine sehr geringe Spanne, die besser\n",
"geeignet ist.\n",
"
für eine Hyperparameteroptimierung
geeignet ist.\n",
"\n",
"\n",
"## d) Optuna\n",
"## d) Optuna\n",
"\n",
"\n",
...
@@ -298,10 +298,12 @@
...
@@ -298,10 +298,12 @@
"\n",
"\n",
"1. Der Startcode implementiert bereits die Optimierung von $k$ und $p$\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",
" 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",
"2. Fügen Sie in die `objective`-Funktion für jedes der sechs Feature\n",
" einen Skalierungsfaktor als Hyperparameter hinzu, der das Feature\n",
" (Grundpreis etc.) jeweils einen Skalierungsfaktor mittels\n",
" nach der Skalierung umskaliert. Vielleicht ist es von Vorteil, wenn\n",
" `trial.suggest_float(name, low, high)` als Hyperparameter hinzu, der\n",
" einige Features den Abstand stärker beeinflussen als andere.\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",
"3. Führen Sie die Optimierung durch.\n",
"4. Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und\n",
"4. Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und\n",
" wählen Sie gute Parameter.\n",
" wählen Sie gute Parameter.\n",
...
@@ -313,7 +315,7 @@
...
@@ -313,7 +315,7 @@
"$[10^{-2}, 10^0] = [0.01, 1]$ genauso wahrscheinlich ist, wie der\n",
"$[10^{-2}, 10^0] = [0.01, 1]$ genauso wahrscheinlich ist, wie der\n",
"Bereich $[10^0, 10^2] = [1, 100]$."
"Bereich $[10^0, 10^2] = [1, 100]$."
],
],
"id": "0034-
ae5d5a5918f209ffcbd24188436259e7ef46c1b452327e
f4
9
3c
1324aeef
"
"id": "0034-
99b712c6dde4c224091d9e61c112d4d7de601
f43c
428d8047fbc5cb168e
"
},
},
{
{
"cell_type": "code",
"cell_type": "code",
...
@@ -351,11 +353,38 @@
...
@@ -351,11 +353,38 @@
},
},
"outputs": [],
"outputs": [],
"source": [
"source": [
"study = optuna.create_study(direction='maximize', sampler=optuna.samplers.GPSampler(deterministic_objective=True)) # less duplicate trials\n",
"study = optuna.create_study(direction='maximize')\n",
"study.optimize(objective, n_trials=100, n_jobs=4)\n",
"study.optimize(objective, n_trials=100, n_jobs=4)"
"fig = optuna.visualization.plot_parallel_coordinate(study)"
],
],
"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,
"nbformat": 4,
...
...
%% Cell type:markdown id:0005-d5cffa8f0704cf548e53737237da4d3ed2a6e83201311bc15ef4335e995 tags:
%% Cell type:markdown id:0005-d5cffa8f0704cf548e53737237da4d3ed2a6e83201311bc15ef4335e995 tags:
# Auto-Klassen mit Scikit-Learn
# Auto-Klassen mit Scikit-Learn
Anbei liegt wieder die Datei
`autos.csv`
mit Merkmalen von Autos und der
Anbei liegt wieder die Datei
`autos.csv`
mit Merkmalen von Autos und der
zugehörigen Klasse (im Sinne von Kleinstwagen etc.). Stellen Sie ihr
zugehörigen Klasse (im Sinne von Kleinstwagen etc.). Stellen Sie ihr
Arbeitsverzeichnis auf das Verzeichnis des Scripts ein. Sie können das
Arbeitsverzeichnis auf das Verzeichnis des Scripts ein. Sie können das
aktuelle Arbeitsverzeichnis in einer IPython-Konsole einfach mit
`pwd`
aktuelle Arbeitsverzeichnis in einer IPython-Konsole einfach mit
`pwd`
(print working directory) ausgeben. Mit
`cd PFAD`
(z. B.
`cd ..`
) können
(print working directory) ausgeben. Mit
`cd PFAD`
(z. B.
`cd ..`
) können
Sie das Verzeichnis wechseln.
Sie das Verzeichnis wechseln.
## a) k Nearest Neighbors mit Scikit-Learn
## a) k Nearest Neighbors mit Scikit-Learn
-
Lesen Sie die Daten mit Pandas ein.
-
Lesen Sie die Daten mit Pandas ein.
-
Teilen Sie den DataFrame in
`X`
und
`y`
auf, wobei
`X`
nur
-
Teilen Sie den DataFrame in
`X`
und
`y`
auf, wobei
`X`
nur
numerische Features enthalten soll und
`y`
die Fahrzeugklasse.
`X`
numerische Features enthalten soll und
`y`
die Fahrzeugklasse.
`X`
und
`y`
werden wir auch im nächsten Aufgabenteil brauchen.
und
`y`
werden wir auch im nächsten Aufgabenteil brauchen.
-
Splitten Sie Ihre Daten in Trainings- und Testmenge auf.
-
Splitten Sie Ihre Daten in Trainings- und Testmenge auf.
-
Erstellen Sie ein
`KNeighborsClassifier`
-Objekt mit den
-
Erstellen Sie ein
`KNeighborsClassifier`
-Objekt mit den
Standardwerten.
Standardwerten.
-
Trainieren Sie das Modell indem Sie die
`fit`
-Methode mit der
-
Trainieren Sie das Modell indem Sie die
`fit`
-Methode mit der
Trainingsmenge aufrufen.
Trainingsmenge aufrufen.
-
Machen Sie eine Vorhersage (auch: Inferenz) für die Testmenge.
-
Machen Sie eine Vorhersage (auch: Inferenz) für die Testmenge.
-
Geben Sie die Genauigkeit aus, indem Sie die Test-Labels und die
-
Geben Sie die Genauigkeit aus, indem Sie die Test-Labels und die
vorhergesagten Labels in die Funktion
`accuracy_score`
übergeben.
vorhergesagten Labels in die Funktion
`accuracy_score`
übergeben.
Alternativ können Sie einfach
`(y_test == y_pred).mean()`
verwenden.
Alternativ können Sie einfach
`(y_test == y_pred).mean()`
verwenden.
-
*
Bonus: Wie hoch ist die Genauigkeit, wenn die vorhergesagte
-
*
Bonus: Wie hoch ist die Genauigkeit, wenn die vorhergesagte
Fahrzeugklasse um eine Klasse daneben liegen darf?
*
Fahrzeugklasse um eine Klasse daneben liegen darf?
*
### Lösung zu a)
### Lösung zu a)
Wir laden zunächst die Daten und teilen sie in
`X_train`
,
`X_test`
,
Wir laden zunächst die Daten und teilen sie in
`X_train`
,
`X_test`
,
`y_train`
,
`y_test`
auf:
`y_train`
,
`y_test`
auf:
%% Cell type:code id:0006-c1652ecfe289903fe272ddb057b2b8ee0182c2f23c2e173384b6f1b9fde tags:
%% Cell type:code id:0006-c1652ecfe289903fe272ddb057b2b8ee0182c2f23c2e173384b6f1b9fde tags:
```
```
import optuna
import optuna
import pandas as pd
import pandas as pd
from sklearn.metrics import accuracy_score
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score, RepeatedStratifiedKFold, StratifiedKFold, train_test_split
from sklearn.model_selection import cross_val_score, RepeatedStratifiedKFold, StratifiedKFold, train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import RobustScaler
from sklearn.preprocessing import RobustScaler
df = pd.read_csv('autos.csv')
df = pd.read_csv('autos.csv')
X = df.drop(columns=['Marke', 'Modell', 'Fahrzeugklasse'])
X = df.drop(columns=['Marke', 'Modell', 'Fahrzeugklasse'])
y = df['Fahrzeugklasse']
y = df['Fahrzeugklasse']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y)
```
```
%% Cell type:markdown id:0007-7355d79e0338534377a20e748034d9dbe360c14acf738d309a076505c1c tags:
%% Cell type:markdown id:0007-7355d79e0338534377a20e748034d9dbe360c14acf738d309a076505c1c tags:
Als nächstes erstellen wir ein Modell für $k$ Nearest Neighbors mit
Als nächstes erstellen wir ein Modell für $k$ Nearest Neighbors mit
Standardwerten ($k = 5$, $p = 2$ und alle Nachbarn zählen gleich viel),
Standardwerten ($k = 5$, $p = 2$ und alle Nachbarn zählen gleich viel),
trainieren es und werten es auf der Testmenge aus:
trainieren es und werten es auf der Testmenge aus:
%% Cell type:code id:0008-6bd58ca167e0053fe33b658469a10f17e6b43f6896dadf06a0cf8dc6fd6 tags:
%% Cell type:code id:0008-6bd58ca167e0053fe33b658469a10f17e6b43f6896dadf06a0cf8dc6fd6 tags:
```
```
model = KNeighborsClassifier()
model = KNeighborsClassifier()
model.fit(X_train, y_train)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
y_pred = model.predict(X_test)
score = accuracy_score(y_test, y_pred)
score = accuracy_score(y_test, y_pred)
```
```
%% Cell type:markdown id:0009-
19f963d04e0849544556edd745a9be471ceb58af797b4db2b38d22fa480
tags:
%% Cell type:markdown id:0009-
ec3faf868b9fd06d732d32259934a4e0d4efcb34b9dea469c3f0e15359c
tags:
Die Genauigkeit beträgt ungefähr – je nach zufälliger Aufteilung der
Die Genauigkeit beträgt ungefähr – je nach zufälliger Aufteilung der
Trainings- und Testmengen – zwischen 4
1
% und
70
% und im Mittel ungefähr:
Trainings- und Testmengen – zwischen 4
4
% und
68
% und im Mittel ungefähr:
%% Cell type:code id:0010-
851f37ceb0a7044dfa1fd10aaaa6c95b36520a0daa77af6d92a2ffc565c
tags:
%% Cell type:code id:0010-
ce3c158735c9ccc98fbaccd48e82ac864bd06d11baee65cf59bee8af7c6
tags:
```
```
print(f'{score:.
2
%}')
print(f'{score:.
1
%}')
```
```
%% Output
%% Output
56.9
1
%
56.9%
%% Cell type:markdown id:0011-
c808456d33568ef391dd7f3b317070d77e2bf593a17ab55b3c39720291d
tags:
%% Cell type:markdown id:0011-
b528b01b16630de1ea4e40535ed8b41a636a13f3baeead08cd4ebe0f7d1
tags:
Wenn wir eine Toleranz von 1 Fahrzeugklasse verwenden, liegt die
Wenn wir eine Toleranz von 1 Fahrzeugklasse verwenden, liegt die
Genauigkeit ungefähr zwischen und 8
3
% und 100% und im Mittel ungefähr:
Genauigkeit ungefähr zwischen und 8
7
% und 100% und im Mittel ungefähr:
%% Cell type:code id:0012-
1a056c770eab1c5dbdead803360ee3d448c0fd07feafcd3cca3af571230
tags:
%% Cell type:code id:0012-
d9d61bda13f255b0bcb6b0571e469e15514da2e324299034c21b8b5ca97
tags:
```
```
near_miss_score = ((y_test - y_pred).abs() <= 1).mean()
near_miss_score = ((y_test - y_pred).abs() <= 1).mean()
print(f'{near_miss_score:.
2
%}')
print(f'{near_miss_score:.
1
%}')
```
```
%% Output
%% Output
9
3.50
%
9
2.7
%
%% Cell type:markdown id:0017-4dd0afa75578cad75b210fc616896d2ec10d95932f06e3996c0b5274d10 tags:
%% Cell type:markdown id:0017-4dd0afa75578cad75b210fc616896d2ec10d95932f06e3996c0b5274d10 tags:
Das bedeutet vermutlich, dass die Vorhersage nicht komplett daneben
Das bedeutet vermutlich, dass die Vorhersage nicht komplett daneben
liegt.
liegt.
## b) Skalierung
## b) Skalierung
Skalieren Sie die Daten und ermitteln die Genauigkeit erneut.
Skalieren Sie die Daten und ermitteln die Genauigkeit erneut.
### Lösung zu b)
### Lösung zu b)
Wir skalieren die Daten mit dem hier am besten geeigneten
`RobustScaler`
Wir skalieren die Daten mit dem hier am besten geeigneten
`RobustScaler`
und machen dasselbe wie zuvor. Beim Skalieren muss man darauf achten,
und machen dasselbe wie zuvor. Beim Skalieren muss man darauf achten,
dass man nur einmal
`fit`
mit den Trainingsdaten aufruft, weil das die
dass man nur einmal
`fit`
mit den Trainingsdaten aufruft, weil das die
Perzentile (25%, 50%, 75%) berechnet. Man skaliert dann die
Perzentile (25%, 50%, 75%) berechnet. Man skaliert dann die
Trainingsdaten und die Testdaten mit denselben werten.
Trainingsdaten und die Testdaten mit denselben werten.
%% Cell type:code id:0018-5e1919c285c5f9db87f5ade5c8a7f39c26f8bdd4958c4c6c021886296c4 tags:
%% Cell type:code id:0018-5e1919c285c5f9db87f5ade5c8a7f39c26f8bdd4958c4c6c021886296c4 tags:
```
```
scaler = RobustScaler()
scaler = RobustScaler()
scaler.fit(X_train)
scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
X_test_scaled = scaler.transform(X_test)
model = KNeighborsClassifier()
model = KNeighborsClassifier()
model.fit(X_train_scaled, y_train)
model.fit(X_train_scaled, y_train)
y_pred_s = model.predict(X_test_scaled)
y_pred_s = model.predict(X_test_scaled)
score_scaled = accuracy_score(y_test, y_pred_s)
score_scaled = accuracy_score(y_test, y_pred_s)
```
```
%% Cell type:markdown id:0019-
0bf204d53815dfc0965e543aae77b558e780a212333b5db15702b0d78ae
tags:
%% Cell type:markdown id:0019-
4d1acdf985d02fef5a0cb6d08fba7376c042e81bf361de92247171a6136
tags:
Nun beträgt die Genauigkeit ungefähr zwischen 5
3
% und 80% (anstatt 4
1
%
Nun beträgt die Genauigkeit ungefähr zwischen 5
6
% und 80% (anstatt 4
4
%
und
70
% ohne Skalierung) und im Mittel ungefähr:
und
68
% ohne Skalierung) und im Mittel ungefähr:
%% Cell type:code id:0020-
7371b9a07c7f1fe25d35f203d86a7e69a1192272662e6ac06a14fe78ab
2 tags:
%% Cell type:code id:0020-
2b227bfac245954cca77944ae660f99c7225c910eb3334e6717243ee9e
2 tags:
```
```
print(f'{score_scaled:.
2
%}')
print(f'{score_scaled:.
1
%}')
```
```
%% Output
%% Output
67.
48
%
67.
5
%
%% Cell type:markdown id:0025-3ba483c9689e0d7ba3eb16e1838979f16c9bee44ce69a979eb97d285ca5 tags:
%% Cell type:markdown id:0025-3ba483c9689e0d7ba3eb16e1838979f16c9bee44ce69a979eb97d285ca5 tags:
## c) Kreuzvalidierung
## c) Kreuzvalidierung
Ermitteln Sie die Genauigkeit über eine Kreuzvalidierung (aber mit der
Ermitteln Sie die Genauigkeit über eine Kreuzvalidierung (aber mit der
Testmenge, also quasi eine Kreuzevaluation).
Testmenge, also quasi eine Kreuzevaluation).
1.
Dazu verwenden wir zunächst die gesamte Menge
*ohne*
eine Aufteilung
1.
Dazu verwenden wir zunächst die gesamte Menge
*ohne*
eine Aufteilung
in Trainings- und Testmengen. Skalieren Sie also das gesamte
`X`
.
in Trainings- und Testmengen. Skalieren Sie also das gesamte
`X`
.
*
Hinweis: Anstatt
`fit`
und
`transform`
separat aufzurufen, können
*
Hinweis: Anstatt
`fit`
und
`transform`
separat aufzurufen, können
Sie auch
`fit_transform`
aufrufen.
*
Sie auch
`fit_transform`
aufrufen.
*
2.
Erstellen Sie ein
`StratifiedKFold`
-Objekt (bereits importiert).
2.
Erstellen Sie ein
`StratifiedKFold`
-Objekt (bereits importiert).
*
Bonus: Erstellen Sie stattdessen ein
*
Bonus: Erstellen Sie stattdessen ein
`RepeatedStratifiedKFold`
-Objekt
`RepeatedStratifiedKFold`
-Objekt
(
[
doc
](
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RepeatedStratifiedKFold.html
)
).
*
(
[
doc
](
https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RepeatedStratifiedKFold.html
)
).
*
3.
Verwenden Sie
`cross_val_score`
wie in den Folien, aber mit
3.
Verwenden Sie
`cross_val_score`
wie in den Folien, aber mit
`X_scaled`
.
`X_scaled`
.
4.
Geben Sie den Mittelwert der Ergebnisse aus.
4.
Geben Sie den Mittelwert der Ergebnisse aus.
### Lösung zu c)
### Lösung zu c)
Wir skalieren nun die gesamten Daten wieder mit dem
`RobustScaler`
und
Wir skalieren nun die gesamten Daten wieder mit dem
`RobustScaler`
und
rufen
`cross_val_score`
mit
`X_scaled`
auf. Dabei gibt es kein
rufen
`cross_val_score`
mit
`X_scaled`
auf. Dabei gibt es kein
Data-Leakage, weil in jedem Training die Testmenge außen vor bleibt und
Data-Leakage, weil in jedem Training die Testmenge außen vor bleibt und
– ganz wichtig – wir das Ergebnis nicht nutzen um uns auf einem Teil der
– ganz wichtig – wir das Ergebnis nicht nutzen um uns auf einem Teil der
Menge zu verbessern.
Menge zu verbessern.
%% Cell type:code id:0026-a91779d7fcfbedb201cbceb62273acc7d645c72b54c7dec33f4a53e48a8 tags:
%% Cell type:code id:0026-a91779d7fcfbedb201cbceb62273acc7d645c72b54c7dec33f4a53e48a8 tags:
```
```
scaler = RobustScaler()
scaler = RobustScaler()
X_scaled = scaler.fit_transform(X)
X_scaled = scaler.fit_transform(X)
folds = StratifiedKFold(5, shuffle=True)
folds = StratifiedKFold(5, shuffle=True)
scores_scaled_cv = cross_val_score(model, X_scaled, y, cv=folds, scoring='accuracy')
scores_scaled_cv = cross_val_score(model, X_scaled, y, cv=folds, scoring='accuracy')
score_scaled_cv = scores_scaled_cv.mean()
score_scaled_cv = scores_scaled_cv.mean()
```
```
%% Cell type:markdown id:0027-
3bfb561f3875f077095b32a0c7d0377f93fe688d38d4bb75de6898ef257
tags:
%% Cell type:markdown id:0027-
e8da2d1d8de5024f297751a4bff906c35c2edf2860ffdc8a9c5615a187f
tags:
Nun beträgt die Genauigkeit ungefähr zwischen 63.
5
% und 70.
5
% (anstatt
Nun beträgt die Genauigkeit ungefähr zwischen 63.
6
% und 70.
4
% (anstatt
5
3
% und 80% ohne Kreuzvalidierung) und im Mittel unverändert ungefähr:
5
6
% und 80% ohne Kreuzvalidierung) und im Mittel unverändert ungefähr:
%% Cell type:code id:0028-
98a7f9a2738231b6905840f64f990616c7
ca
c
fb
64bc2570d40af1bfa18d
tags:
%% Cell type:code id:0028-
b37cb549f7ca0b03d5a4d6629c5
cafb
8f5a20152339f4939100b1f47cb7
tags:
```
```
print(f'{score_scaled_cv:.
2
%}')
print(f'{score_scaled_cv:.
1
%}')
```
```
%% Output
%% Output
67.
15
%
67.
2
%
%% Cell type:markdown id:0034-
ae5d5a5918f209ffcbd24188436259e7ef46c1b452327e
f4
9
3c
1324aeef
tags:
%% Cell type:markdown id:0034-
99b712c6dde4c224091d9e61c112d4d7de601
f43c
428d8047fbc5cb168e
tags:
Mit
`RepeatedStratifiedKFold`
mit Default-Werten (also
`n_splits=5`
und
Mit
`RepeatedStratifiedKFold`
mit Default-Werten (also
`n_splits=5`
und
`n_repeats=10`
) liegt die Genauigkeit zwischen 66.
4
% und 68.6%
. Das ist
`n_repeats=10`
) liegt die Genauigkeit zwischen 66.
2
% und 68.6%
und im
eine sehr geringe Spanne, die besser
für eine Hyperparameteroptimierung
Mittel bei ungefähr 67.5%. Das ist
eine sehr geringe Spanne, die besser
geeignet ist.
für eine Hyperparameteroptimierung
geeignet ist.
## d) Optuna
## d) Optuna
In diesem Teil geht es darum zusätzliche Skalierungsfaktoren zu
In diesem Teil geht es darum zusätzliche Skalierungsfaktoren zu
optimieren.
optimieren.
1.
Der Startcode implementiert bereits die Optimierung von $k$ und $p$
1.
Der Startcode implementiert bereits die Optimierung von $k$ und $p$
mit Optuna. Schauen Sie sich den Startcode an und probieren ihn aus.
mit Optuna. Schauen Sie sich den Startcode an und probieren ihn aus.
2.
Fügen Sie in die
`objective`
-Funktion für jedes Feature jeweils
2.
Fügen Sie in die
`objective`
-Funktion für jedes der sechs Feature
einen Skalierungsfaktor als Hyperparameter hinzu, der das Feature
(Grundpreis etc.) jeweils einen Skalierungsfaktor mittels
nach der Skalierung umskaliert. Vielleicht ist es von Vorteil, wenn
`trial.suggest_float(name, low, high)`
als Hyperparameter hinzu, der
einige Features den Abstand stärker beeinflussen als andere.
das Feature nach der Skalierung umskaliert.
*
Hinweis: Es gibt noch
einen Booleschen Parameter
`log`
um den Wert logarithmisch zu
optimieren und später auch zu visualisieren.
*
3.
Führen Sie die Optimierung durch.
3.
Führen Sie die Optimierung durch.
4.
Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und
4.
Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und
wählen Sie gute Parameter.
wählen Sie gute Parameter.
### Lösung zu d)
### Lösung zu d)
Wir skalieren die Features jeweils zwischen $[10^{-2}, 10^2]$ mit
Wir skalieren die Features jeweils zwischen $[10^{-2}, 10^2]$ mit
logarithmischwer Verteilung, weil wir wollen, dass der Bereich
logarithmischwer Verteilung, weil wir wollen, dass der Bereich
$[10^{-2}, 10^0] = [0.01, 1]$ genauso wahrscheinlich ist, wie der
$[10^{-2}, 10^0] = [0.01, 1]$ genauso wahrscheinlich ist, wie der
Bereich $[10^0, 10^2] = [1, 100]$.
Bereich $[10^0, 10^2] = [1, 100]$.
%% Cell type:code id:0035-2239964036f73944f5196e8c13aab9159de4669ccec74a6d83ea087ec8d tags:
%% Cell type:code id:0035-2239964036f73944f5196e8c13aab9159de4669ccec74a6d83ea087ec8d tags:
```
```
folds = RepeatedStratifiedKFold()
folds = RepeatedStratifiedKFold()
def objective(trial):
def objective(trial):
k = trial.suggest_int('k', 1, 9)
k = trial.suggest_int('k', 1, 9)
p = trial.suggest_categorical('p', [1, 2, 4, float('inf')])
p = trial.suggest_categorical('p', [1, 2, 4, float('inf')])
scale_factores = [trial.suggest_float('scale_' + col, 1e-2, 1e2, log=True) for col in X.columns]
scale_factores = [trial.suggest_float('scale_' + col, 1e-2, 1e2, log=True) for col in X.columns]
model = KNeighborsClassifier(n_neighbors=k, p=p, weights='distance')
model = KNeighborsClassifier(n_neighbors=k, p=p, weights='distance')
scores_cv = cross_val_score(model, X_train_scaled * scale_factores, y_train, cv=folds, scoring='accuracy')
scores_cv = cross_val_score(model, X_train_scaled * scale_factores, y_train, cv=folds, scoring='accuracy')
return scores_cv.mean()
return scores_cv.mean()
```
```
%% Cell type:markdown id:0036-8f570a8c845c9b7351be9dc2ff5943af11f8ea2daf43c6e6946cae8935d tags:
%% Cell type:markdown id:0036-8f570a8c845c9b7351be9dc2ff5943af11f8ea2daf43c6e6946cae8935d tags:
### Tests zu d)
### Tests zu d)
%% Cell type:code id:0037-
79487c80368ad85001b24281bc990d3a53e0e926e8d11a2d56ee7b43d52
tags:
%% Cell type:code id:0037-
64c45d4d68fec04dc857c908355dc28f6b9a085d1aec4c9ce469da8e09c
tags:
```
```
study = optuna.create_study(direction='maximize'
, sampler=optuna.samplers.GPSampler(deterministic_objective=True)) # less duplicate trials
study = optuna.create_study(direction='maximize'
)
study.optimize(objective, n_trials=100, n_jobs=4)
study.optimize(objective, n_trials=100, n_jobs=4)
```
%% Cell type:code id:0038-d681bc8da4b8bed01a50012745e461c2284df7720f1b11dc2298839da91 tags:
```
fig = optuna.visualization.plot_parallel_coordinate(study)
fig = optuna.visualization.plot_parallel_coordinate(study)
fig.show()
```
```
%% Cell type:markdown id:0039-71ac3459b1f4c926322d9f087ac4b16c2b55bb269c7df97ba19382bf0fa tags:
Aus dem Ergebnis lässt sich ablesen, dass das Leergewicht und der
Verbrauch ungefähr den Faktor 10 bekommen, die Türanzahl 0.01 und der
Rest den Faktor 100. Wenn wir das umsetzen schwankt das Ergebnis mit
einem
`RepeatedStratifiedKFold`
mit Default-Werten (also
`n_splits=5`
und
`n_repeats=10`
) zwischen 66.8% und 69.5% und liegt im Mittel
ungefähr bei 68.1% anstatt 67.5% ohne optimierte Skalierung. Durch die
Optimierung konnte die Genauigkeit also im Mittel um 0.6 Prozentpunkte
verbessert werden.
...
...
This diff is collapsed.
Click to expand it.
05-skalierung-und-optimierung/01-autoklassen-sklearn.ipynb
+
25
−
11
View file @
07077bd8
...
@@ -46,7 +46,7 @@
...
@@ -46,7 +46,7 @@
"import pandas as pd\n",
"import pandas as pd\n",
"import optuna\n",
"import optuna\n",
"from sklearn.metrics import accuracy_score\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.neighbors import KNeighborsClassifier\n",
"from sklearn.preprocessing import RobustScaler\n",
"from sklearn.preprocessing import RobustScaler\n",
"\n",
"\n",
...
@@ -60,7 +60,7 @@
...
@@ -60,7 +60,7 @@
"\n",
"\n",
"# TODO: Genauigkeit ausgeben"
"# TODO: Genauigkeit ausgeben"
],
],
"id": "0005-
682ba86e4b2ef1a270871f098102d4349b3f2b0977c41614e4b442895f7
"
"id": "0005-
10e2d5cbeeffb18b853f569fe4d991bd3fa0deb348f46e7a98dfc05777a
"
},
},
{
{
"cell_type": "markdown",
"cell_type": "markdown",
...
@@ -126,15 +126,17 @@
...
@@ -126,15 +126,17 @@
"\n",
"\n",
"1. Der Startcode implementiert bereits die Optimierung von $k$ und $p$\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",
" 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",
"2. Fügen Sie in die `objective`-Funktion für jedes der sechs Feature\n",
" einen Skalierungsfaktor als Hyperparameter hinzu, der das Feature\n",
" (Grundpreis etc.) jeweils einen Skalierungsfaktor mittels\n",
" nach der Skalierung umskaliert. Vielleicht ist es von Vorteil, wenn\n",
" `trial.suggest_float(name, low, high)` als Hyperparameter hinzu, der\n",
" einige Features den Abstand stärker beeinflussen als andere.\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",
"3. Führen Sie die Optimierung durch.\n",
"4. Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und\n",
"4. Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und\n",
" wählen Sie gute Parameter."
" wählen Sie gute Parameter."
],
],
"id": "0015-
1a2cb5f0269a7d88b4861ef37715bd33303afa2fbaa8fa3b50c9bcc2ab2
"
"id": "0015-
d383366da2c95086a6bb5d2d706285955ac6e8a9c88a34334363d362458
"
},
},
{
{
"cell_type": "code",
"cell_type": "code",
...
@@ -171,11 +173,23 @@
...
@@ -171,11 +173,23 @@
},
},
"outputs": [],
"outputs": [],
"source": [
"source": [
"study = optuna.create_study(direction='maximize', sampler=optuna.samplers.GPSampler(deterministic_objective=True)) # less duplicate trials\n",
"study = optuna.create_study(direction='maximize')\n",
"study.optimize(objective, n_trials=100, n_jobs=4)\n",
"study.optimize(objective, n_trials=100, n_jobs=4)"
"fig = optuna.visualization.plot_parallel_coordinate(study)"
],
],
"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,
"nbformat": 4,
...
...
%% Cell type:markdown id:0004-8aed67bf1a5065a62440343a778365e49e5143ddca600561cbb5ec2e72f tags:
%% Cell type:markdown id:0004-8aed67bf1a5065a62440343a778365e49e5143ddca600561cbb5ec2e72f tags:
# Auto-Klassen mit Scikit-Learn
# Auto-Klassen mit Scikit-Learn
Anbei liegt wieder die Datei
`autos.csv`
mit Merkmalen von Autos und der
Anbei liegt wieder die Datei
`autos.csv`
mit Merkmalen von Autos und der
zugehörigen Klasse (im Sinne von Kleinstwagen etc.). Stellen Sie ihr
zugehörigen Klasse (im Sinne von Kleinstwagen etc.). Stellen Sie ihr
Arbeitsverzeichnis auf das Verzeichnis des Scripts ein. Sie können das
Arbeitsverzeichnis auf das Verzeichnis des Scripts ein. Sie können das
aktuelle Arbeitsverzeichnis in einer IPython-Konsole einfach mit
`pwd`
aktuelle Arbeitsverzeichnis in einer IPython-Konsole einfach mit
`pwd`
(print working directory) ausgeben. Mit
`cd PFAD`
(z. B.
`cd ..`
) können
(print working directory) ausgeben. Mit
`cd PFAD`
(z. B.
`cd ..`
) können
Sie das Verzeichnis wechseln.
Sie das Verzeichnis wechseln.
## a) k Nearest Neighbors mit Scikit-Learn
## a) k Nearest Neighbors mit Scikit-Learn
-
Lesen Sie die Daten mit Pandas ein.
-
Lesen Sie die Daten mit Pandas ein.
-
Teilen Sie den DataFrame in
`X`
und
`y`
auf, wobei
`X`
nur
-
Teilen Sie den DataFrame in
`X`
und
`y`
auf, wobei
`X`
nur
numerische Features enthalten soll und
`y`
die Fahrzeugklasse.
`X`
numerische Features enthalten soll und
`y`
die Fahrzeugklasse.
`X`
und
`y`
werden wir auch im nächsten Aufgabenteil brauchen.
und
`y`
werden wir auch im nächsten Aufgabenteil brauchen.
-
Splitten Sie Ihre Daten in Trainings- und Testmenge auf.
-
Splitten Sie Ihre Daten in Trainings- und Testmenge auf.
-
Erstellen Sie ein
`KNeighborsClassifier`
-Objekt mit den
-
Erstellen Sie ein
`KNeighborsClassifier`
-Objekt mit den
Standardwerten.
Standardwerten.
-
Trainieren Sie das Modell indem Sie die
`fit`
-Methode mit der
-
Trainieren Sie das Modell indem Sie die
`fit`
-Methode mit der
Trainingsmenge aufrufen.
Trainingsmenge aufrufen.
-
Machen Sie eine Vorhersage (auch: Inferenz) für die Testmenge.
-
Machen Sie eine Vorhersage (auch: Inferenz) für die Testmenge.
-
Geben Sie die Genauigkeit aus, indem Sie die Test-Labels und die
-
Geben Sie die Genauigkeit aus, indem Sie die Test-Labels und die
vorhergesagten Labels in die Funktion
`accuracy_score`
übergeben.
vorhergesagten Labels in die Funktion
`accuracy_score`
übergeben.
Alternativ können Sie einfach
`(y_test == y_pred).mean()`
verwenden.
Alternativ können Sie einfach
`(y_test == y_pred).mean()`
verwenden.
-
*
Bonus: Wie hoch ist die Genauigkeit, wenn die vorhergesagte
-
*
Bonus: Wie hoch ist die Genauigkeit, wenn die vorhergesagte
Fahrzeugklasse um eine Klasse daneben liegen darf?
*
Fahrzeugklasse um eine Klasse daneben liegen darf?
*
Hier Ihr Start-Code:
Hier Ihr Start-Code:
%% Cell type:code id:0005-
682ba86e4b2ef1a270871f098102d4349b3f2b0977c41614e4b442895f7
tags:
%% Cell type:code id:0005-
10e2d5cbeeffb18b853f569fe4d991bd3fa0deb348f46e7a98dfc05777a
tags:
```
```
import pandas as pd
import pandas as pd
import optuna
import optuna
from sklearn.metrics import accuracy_score
from sklearn.metrics import accuracy_score
from sklearn.model_selection import cross_val_score, StratifiedKFold, train_test_split
from sklearn.model_selection import cross_val_score, StratifiedKFold,
RepeatedStratifiedKFold,
train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import RobustScaler
from sklearn.preprocessing import RobustScaler
# TODO: Daten laden
# TODO: Daten laden
# TODO: In X, y aufteilen
# TODO: In X, y aufteilen
# TODO: In Training- und Testmengen splitten
# TODO: In Training- und Testmengen splitten
# TODO: k-NN erstellen, trainieren, vorhersagen
# TODO: k-NN erstellen, trainieren, vorhersagen
# TODO: Genauigkeit ausgeben
# TODO: Genauigkeit ausgeben
```
```
%% Cell type:markdown id:0007-d9e25205ef98d910bef301fd97bad7094675f32062447639cceb4728289 tags:
%% Cell type:markdown id:0007-d9e25205ef98d910bef301fd97bad7094675f32062447639cceb4728289 tags:
## b) Skalierung
## b) Skalierung
Skalieren Sie die Daten und ermitteln die Genauigkeit erneut.
Skalieren Sie die Daten und ermitteln die Genauigkeit erneut.
%% Cell type:code id:0008-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
%% Cell type:code id:0008-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
```
```
%% Cell type:markdown id:0011-7e58ce651003652ff193df6731b83f9d835ed244d0ef5387f3325e8cb42 tags:
%% Cell type:markdown id:0011-7e58ce651003652ff193df6731b83f9d835ed244d0ef5387f3325e8cb42 tags:
## c) Kreuzvalidierung
## c) Kreuzvalidierung
Ermitteln Sie die Genauigkeit über eine Kreuzvalidierung (aber mit der
Ermitteln Sie die Genauigkeit über eine Kreuzvalidierung (aber mit der
Testmenge, also quasi eine Kreuzevaluation).
Testmenge, also quasi eine Kreuzevaluation).
1. Dazu verwenden wir zunächst die gesamte Menge *ohne* eine Aufteilung
1. Dazu verwenden wir zunächst die gesamte Menge *ohne* eine Aufteilung
in Trainings- und Testmengen. Skalieren Sie also das gesamte `X`.
in Trainings- und Testmengen. Skalieren Sie also das gesamte `X`.
*Hinweis: Anstatt `fit` und `transform` separat aufzurufen, können
*Hinweis: Anstatt `fit` und `transform` separat aufzurufen, können
Sie auch `fit_transform` aufrufen.*
Sie auch `fit_transform` aufrufen.*
2. Erstellen Sie ein `StratifiedKFold`-Objekt (bereits importiert).
2. Erstellen Sie ein `StratifiedKFold`-Objekt (bereits importiert).
*Bonus: Erstellen Sie stattdessen ein
*Bonus: Erstellen Sie stattdessen ein
`RepeatedStratifiedKFold`-Objekt
`RepeatedStratifiedKFold`-Objekt
([doc](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RepeatedStratifiedKFold.html)).*
([doc](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RepeatedStratifiedKFold.html)).*
3. Verwenden Sie `cross_val_score` wie in den Folien, aber mit
3. Verwenden Sie `cross_val_score` wie in den Folien, aber mit
`X_scaled`.
`X_scaled`.
4. Geben Sie den Mittelwert der Ergebnisse aus.
4. Geben Sie den Mittelwert der Ergebnisse aus.
%% Cell type:code id:0012-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
%% Cell type:code id:0012-44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 tags:
```
```
```
```
%% Cell type:markdown id:0015-
1a2cb5f0269a7d88b4861ef37715bd33303afa2fbaa8fa3b50c9bcc2ab2
tags:
%% Cell type:markdown id:0015-
d383366da2c95086a6bb5d2d706285955ac6e8a9c88a34334363d362458
tags:
## d) Optuna
## d) Optuna
In diesem Teil geht es darum zusätzliche Skalierungsfaktoren zu
In diesem Teil geht es darum zusätzliche Skalierungsfaktoren zu
optimieren.
optimieren.
1. Der Startcode implementiert bereits die Optimierung von $k$ und $p$
1. Der Startcode implementiert bereits die Optimierung von $k$ und $p$
mit Optuna. Schauen Sie sich den Startcode an und probieren ihn aus.
mit Optuna. Schauen Sie sich den Startcode an und probieren ihn aus.
2. Fügen Sie in die `objective`-Funktion für jedes Feature jeweils
2. Fügen Sie in die `objective`-Funktion für jedes der sechs Feature
einen Skalierungsfaktor als Hyperparameter hinzu, der das Feature
(Grundpreis etc.) jeweils einen Skalierungsfaktor mittels
nach der Skalierung umskaliert. Vielleicht ist es von Vorteil, wenn
`trial.suggest_float(name, low, high)` als Hyperparameter hinzu, der
einige Features den Abstand stärker beeinflussen als andere.
das Feature nach der Skalierung umskaliert. *Hinweis: Es gibt noch
einen Booleschen Parameter `log` um den Wert logarithmisch zu
optimieren und später auch zu visualisieren.*
3. Führen Sie die Optimierung durch.
3. Führen Sie die Optimierung durch.
4. Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und
4. Betrachten Sie die Ergebnisse im Parallele-Koordinaten-Plot und
wählen Sie gute Parameter.
wählen Sie gute Parameter.
%% Cell type:code id:0016-91d49960a264a20d3d42fc074dda98db8fa9710f976efc5e31c705f5c9f tags:
%% Cell type:code id:0016-91d49960a264a20d3d42fc074dda98db8fa9710f976efc5e31c705f5c9f tags:
```
```
folds = RepeatedStratifiedKFold()
folds = RepeatedStratifiedKFold()
def objective(trial):
def objective(trial):
k = trial.suggest_int('k', 1, 9)
k = trial.suggest_int('k', 1, 9)
p = trial.suggest_categorical('p', [1, 2, 4, float('inf')])
p = trial.suggest_categorical('p', [1, 2, 4, float('inf')])
model = KNeighborsClassifier(n_neighbors=k, p=p, weights='distance')
model = KNeighborsClassifier(n_neighbors=k, p=p, weights='distance')
scores_cv = cross_val_score(model, X_train_scaled, y_train, cv=folds, scoring='accuracy')
scores_cv = cross_val_score(model, X_train_scaled, y_train, cv=folds, scoring='accuracy')
return scores_cv.mean()
return scores_cv.mean()
```
```
%% Cell type:markdown id:0017-8f570a8c845c9b7351be9dc2ff5943af11f8ea2daf43c6e6946cae8935d tags:
%% Cell type:markdown id:0017-8f570a8c845c9b7351be9dc2ff5943af11f8ea2daf43c6e6946cae8935d tags:
### Tests zu d)
### Tests zu d)
%% Cell type:code id:0018-
79487c80368ad85001b24281bc990d3a53e0e926e8d11a2d56ee7b43d52
tags:
%% Cell type:code id:0018-
64c45d4d68fec04dc857c908355dc28f6b9a085d1aec4c9ce469da8e09c
tags:
```
```
study = optuna.create_study(direction='maximize'
, sampler=optuna.samplers.GPSampler(deterministic_objective=True)) # less duplicate trials
study = optuna.create_study(direction='maximize'
)
study.optimize(objective, n_trials=100, n_jobs=4)
study.optimize(objective, n_trials=100, n_jobs=4)
```
%% Cell type:code id:0019-d681bc8da4b8bed01a50012745e461c2284df7720f1b11dc2298839da91 tags:
```
fig = optuna.visualization.plot_parallel_coordinate(study)
fig = optuna.visualization.plot_parallel_coordinate(study)
fig.show()
```
```
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment