Spaces:
Sleeping
Sleeping
Upload 2 files
Browse files
app.py
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
import numpy as np
|
| 3 |
import matplotlib.pyplot as plt
|
|
@@ -18,6 +19,30 @@ Dat doen we met *supervised learning*: het model ziet voorbeelden `(BMI → scor
|
|
| 18 |
> Let op: in deze sklearn-dataset is BMI **genormaliseerd** (geschaald). De helling `w` geeft wel de **richting en sterkte** aan (positief = hogere BMI hangt samen met hogere score).
|
| 19 |
"""
|
| 20 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
def load_bmi_diabetes():
|
| 22 |
d = datasets.load_diabetes()
|
| 23 |
X = d.data[:, 2] # BMI feature (genormaliseerd)
|
|
@@ -83,7 +108,7 @@ def sgd_train_generator(lr, epochs, batch_size, seed, split_seed):
|
|
| 83 |
ax1.scatter(x_te, y_te, alpha=0.8, s=22, marker="x", label="test")
|
| 84 |
xs = np.linspace(x_min, x_max, 200)
|
| 85 |
ax1.plot(xs, w * xs + b, linewidth=2, label="model")
|
| 86 |
-
ax1.set_title(f"{label} — Epoch {epoch}/{epochs}")
|
| 87 |
ax1.set_xlabel("BMI (genormaliseerd)")
|
| 88 |
ax1.set_ylabel("Progressiescore")
|
| 89 |
ax1.legend()
|
|
@@ -106,9 +131,9 @@ def sgd_train_generator(lr, epochs, batch_size, seed, split_seed):
|
|
| 106 |
verdict = "positief" if w >= 0 else "negatief"
|
| 107 |
summary = (
|
| 108 |
f"**Wat levert dit op?**\n"
|
| 109 |
-
f"- Huidige regressielijn: `y = {w:.4f} * x + {b:.4f}`\n"
|
| 110 |
-
f"- Train MSE: `{mse_tr:.2f}` — Test MSE: `{mse_te:.2f}` — Test R²: `{r2_te:.3f}`\n"
|
| 111 |
-
f"- Interpretatie: het verband tussen BMI en progressiescore is **{verdict}** in deze dataset "
|
| 112 |
f"(hogere BMI hangt samen met hogere score als `w > 0`)."
|
| 113 |
)
|
| 114 |
|
|
@@ -126,6 +151,7 @@ with gr.Blocks(title="Diabetes: BMI → Progressiescore (Live Regressie)") as de
|
|
| 126 |
seed = gr.Slider(0, 9999, value=42, step=1, label="Training seed")
|
| 127 |
split_seed = gr.Slider(0, 9999, value=7, step=1, label="Train/test split seed")
|
| 128 |
train_btn = gr.Button("Train live")
|
|
|
|
| 129 |
with gr.Column(scale=2):
|
| 130 |
plot_main = gr.Plot(label="Data (train/test) & regressielijn (live)")
|
| 131 |
plot_loss = gr.Plot(label="Loss-curve (MSE per epoch) — train vs test")
|
|
|
|
| 1 |
+
|
| 2 |
import gradio as gr
|
| 3 |
import numpy as np
|
| 4 |
import matplotlib.pyplot as plt
|
|
|
|
| 19 |
> Let op: in deze sklearn-dataset is BMI **genormaliseerd** (geschaald). De helling `w` geeft wel de **richting en sterkte** aan (positief = hogere BMI hangt samen met hogere score).
|
| 20 |
"""
|
| 21 |
|
| 22 |
+
STORY_MD = r"""
|
| 23 |
+
### Waarom kijken we naar BMI en diabetes?
|
| 24 |
+
Stel je voor dat je arts wilt begrijpen of **het gewicht van mensen** (uitgedrukt als *Body Mass Index*, BMI)
|
| 25 |
+
iets zegt over hun **gezondheid**. Een van de dingen die onderzocht wordt is het verband tussen BMI en de
|
| 26 |
+
**ernst van diabetes**.
|
| 27 |
+
|
| 28 |
+
We gebruiken hier **echte gegevens** uit een medische dataset (dus **geen foto’s**, maar gemeten waarden van mensen
|
| 29 |
+
die in een onderzoek hebben meegedaan). Elke deelnemer heeft:
|
| 30 |
+
|
| 31 |
+
- een **BMI-waarde** (hoe zwaar of licht iemand is ten opzichte van zijn lengte),
|
| 32 |
+
- en een **score** die aangeeft hoe ernstig de diabetes bij die persoon verloopt.
|
| 33 |
+
|
| 34 |
+
Met lineaire regressie testen we: *kunnen we een lijn tekenen die laat zien of een hogere BMI vaak samenvalt met een
|
| 35 |
+
hogere (of juist lagere) score?*
|
| 36 |
+
|
| 37 |
+
**Waarom is dat belangrijk?**
|
| 38 |
+
- Als er wél een duidelijk verband is, kan dit helpen om **risico’s eerder te signaleren**.
|
| 39 |
+
- Als er géén verband is, leren we dat BMI misschien niet de juiste voorspeller is en moet er verder gekeken worden
|
| 40 |
+
naar andere factoren.
|
| 41 |
+
|
| 42 |
+
Kortom: dit experiment laat je zien hoe data ons kan helpen om **patronen in gezondheid** te ontdekken — en dat doen
|
| 43 |
+
we hier stap voor stap, live op je scherm.
|
| 44 |
+
"""
|
| 45 |
+
|
| 46 |
def load_bmi_diabetes():
|
| 47 |
d = datasets.load_diabetes()
|
| 48 |
X = d.data[:, 2] # BMI feature (genormaliseerd)
|
|
|
|
| 108 |
ax1.scatter(x_te, y_te, alpha=0.8, s=22, marker="x", label="test")
|
| 109 |
xs = np.linspace(x_min, x_max, 200)
|
| 110 |
ax1.plot(xs, w * xs + b, linewidth=2, label="model")
|
| 111 |
+
ax1.set_title(f"{{label}} — Epoch {{epoch}}/{{epochs}}")
|
| 112 |
ax1.set_xlabel("BMI (genormaliseerd)")
|
| 113 |
ax1.set_ylabel("Progressiescore")
|
| 114 |
ax1.legend()
|
|
|
|
| 131 |
verdict = "positief" if w >= 0 else "negatief"
|
| 132 |
summary = (
|
| 133 |
f"**Wat levert dit op?**\n"
|
| 134 |
+
f"- Huidige regressielijn: `y = {{w:.4f}} * x + {{b:.4f}}`\n"
|
| 135 |
+
f"- Train MSE: `{{mse_tr:.2f}}` — Test MSE: `{{mse_te:.2f}}` — Test R²: `{{r2_te:.3f}}`\n"
|
| 136 |
+
f"- Interpretatie: het verband tussen BMI en progressiescore is **{{verdict}}** in deze dataset "
|
| 137 |
f"(hogere BMI hangt samen met hogere score als `w > 0`)."
|
| 138 |
)
|
| 139 |
|
|
|
|
| 151 |
seed = gr.Slider(0, 9999, value=42, step=1, label="Training seed")
|
| 152 |
split_seed = gr.Slider(0, 9999, value=7, step=1, label="Train/test split seed")
|
| 153 |
train_btn = gr.Button("Train live")
|
| 154 |
+
story = gr.Markdown(STORY_MD) # story directly under the button
|
| 155 |
with gr.Column(scale=2):
|
| 156 |
plot_main = gr.Plot(label="Data (train/test) & regressielijn (live)")
|
| 157 |
plot_loss = gr.Plot(label="Loss-curve (MSE per epoch) — train vs test")
|