Spaces:
Sleeping
Sleeping
Upload 2 files
Browse files
app.py
CHANGED
|
@@ -28,14 +28,14 @@ iets zegt over hun **gezondheid**. Een van de dingen die onderzocht wordt is het
|
|
| 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 |
|
|
@@ -43,6 +43,13 @@ Kortom: dit experiment laat je zien hoe data ons kan helpen om **patronen in gez
|
|
| 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)
|
|
@@ -67,8 +74,7 @@ def sgd_train_generator(lr, epochs, batch_size, seed, split_seed):
|
|
| 67 |
w, b = 0.0, 0.0
|
| 68 |
|
| 69 |
x_min, x_max = float(np.min(x)), float(np.max(x))
|
| 70 |
-
train_losses = []
|
| 71 |
-
test_losses = []
|
| 72 |
|
| 73 |
rng = np.random.RandomState(int(seed))
|
| 74 |
|
|
@@ -108,7 +114,7 @@ def sgd_train_generator(lr, epochs, batch_size, seed, split_seed):
|
|
| 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"{
|
| 112 |
ax1.set_xlabel("BMI (genormaliseerd)")
|
| 113 |
ax1.set_ylabel("Progressiescore")
|
| 114 |
ax1.legend()
|
|
@@ -127,14 +133,15 @@ def sgd_train_generator(lr, epochs, batch_size, seed, split_seed):
|
|
| 127 |
ax2.grid(True, linestyle=":", linewidth=0.6)
|
| 128 |
plt.tight_layout()
|
| 129 |
|
| 130 |
-
#
|
| 131 |
verdict = "positief" if w >= 0 else "negatief"
|
| 132 |
summary = (
|
| 133 |
f"**Wat levert dit op?**\n"
|
| 134 |
-
f"- Huidige regressielijn: `y = {
|
| 135 |
-
f"- Train MSE: `{
|
| 136 |
-
f"- Interpretatie: het verband tussen BMI en progressiescore is **{
|
| 137 |
-
f"(hogere BMI hangt samen met hogere score als `w > 0`)
|
|
|
|
| 138 |
)
|
| 139 |
|
| 140 |
yield fig_main, fig_loss, summary
|
|
@@ -151,20 +158,21 @@ with gr.Blocks(title="Diabetes: BMI → Progressiescore (Live Regressie)") as de
|
|
| 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 |
-
|
|
|
|
| 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")
|
| 158 |
results = gr.Markdown()
|
| 159 |
|
| 160 |
-
#
|
| 161 |
train_btn.click(
|
| 162 |
fn=sgd_train_generator,
|
| 163 |
inputs=[lr, epochs, batch, seed, split_seed],
|
| 164 |
outputs=[plot_main, plot_loss, results]
|
| 165 |
)
|
| 166 |
|
| 167 |
-
# Auto-train
|
| 168 |
demo.load(
|
| 169 |
fn=sgd_train_generator,
|
| 170 |
inputs=[lr, epochs, batch, seed, split_seed],
|
|
|
|
| 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 |
|
|
|
|
| 43 |
we hier stap voor stap, live op je scherm.
|
| 44 |
"""
|
| 45 |
|
| 46 |
+
CONCLUSION_MD = r"""
|
| 47 |
+
# **Conclusie**
|
| 48 |
+
|
| 49 |
+
Mensen met een hogere **BMI** hebben in dit onderzoek gemiddeld vaker een ernstiger verloop van **diabetes**.
|
| 50 |
+
Maar **BMI is niet de enige factor** — leeftijd, erfelijkheid, leefstijl en andere medische waarden spelen ook mee.
|
| 51 |
+
"""
|
| 52 |
+
|
| 53 |
def load_bmi_diabetes():
|
| 54 |
d = datasets.load_diabetes()
|
| 55 |
X = d.data[:, 2] # BMI feature (genormaliseerd)
|
|
|
|
| 74 |
w, b = 0.0, 0.0
|
| 75 |
|
| 76 |
x_min, x_max = float(np.min(x)), float(np.max(x))
|
| 77 |
+
train_losses, test_losses = [], []
|
|
|
|
| 78 |
|
| 79 |
rng = np.random.RandomState(int(seed))
|
| 80 |
|
|
|
|
| 114 |
ax1.scatter(x_te, y_te, alpha=0.8, s=22, marker="x", label="test")
|
| 115 |
xs = np.linspace(x_min, x_max, 200)
|
| 116 |
ax1.plot(xs, w * xs + b, linewidth=2, label="model")
|
| 117 |
+
ax1.set_title(f"{label} — Epoch {epoch}/{epochs}")
|
| 118 |
ax1.set_xlabel("BMI (genormaliseerd)")
|
| 119 |
ax1.set_ylabel("Progressiescore")
|
| 120 |
ax1.legend()
|
|
|
|
| 133 |
ax2.grid(True, linestyle=":", linewidth=0.6)
|
| 134 |
plt.tight_layout()
|
| 135 |
|
| 136 |
+
# Resultaten + opvallende conclusie
|
| 137 |
verdict = "positief" if w >= 0 else "negatief"
|
| 138 |
summary = (
|
| 139 |
f"**Wat levert dit op?**\n"
|
| 140 |
+
f"- Huidige regressielijn: `y = {w:.4f} * x + {b:.4f}`\n"
|
| 141 |
+
f"- Train MSE: `{mse_tr:.2f}` — Test MSE: `{mse_te:.2f}` — Test R²: `{r2_te:.3f}`\n"
|
| 142 |
+
f"- Interpretatie: het verband tussen BMI en progressiescore is **{verdict}** in deze dataset "
|
| 143 |
+
f"(hogere BMI hangt samen met hogere score als `w > 0`).\n\n"
|
| 144 |
+
f"{CONCLUSION_MD}"
|
| 145 |
)
|
| 146 |
|
| 147 |
yield fig_main, fig_loss, summary
|
|
|
|
| 158 |
seed = gr.Slider(0, 9999, value=42, step=1, label="Training seed")
|
| 159 |
split_seed = gr.Slider(0, 9999, value=7, step=1, label="Train/test split seed")
|
| 160 |
train_btn = gr.Button("Train live")
|
| 161 |
+
# Story direct onder de knop
|
| 162 |
+
gr.Markdown(STORY_MD)
|
| 163 |
with gr.Column(scale=2):
|
| 164 |
plot_main = gr.Plot(label="Data (train/test) & regressielijn (live)")
|
| 165 |
plot_loss = gr.Plot(label="Loss-curve (MSE per epoch) — train vs test")
|
| 166 |
results = gr.Markdown()
|
| 167 |
|
| 168 |
+
# Training starten via knop
|
| 169 |
train_btn.click(
|
| 170 |
fn=sgd_train_generator,
|
| 171 |
inputs=[lr, epochs, batch, seed, split_seed],
|
| 172 |
outputs=[plot_main, plot_loss, results]
|
| 173 |
)
|
| 174 |
|
| 175 |
+
# Auto-train bij laden met default-waarden
|
| 176 |
demo.load(
|
| 177 |
fn=sgd_train_generator,
|
| 178 |
inputs=[lr, epochs, batch, seed, split_seed],
|