Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -120,49 +120,21 @@ def train_and_embed_solid():
|
|
| 120 |
# TEKSTBLOKKEN — ALLEEN BLAUW, GEEN ZWART/GEEN VET
|
| 121 |
# ======================================================
|
| 122 |
INTRO_MD = """
|
| 123 |
-
|
| 124 |
April 1912.<br>
|
| 125 |
De RMS Titanic vertrekt richting New York: een drijvend paleis, gevuld met verwachtingen.<br>
|
| 126 |
Aan boord: industriëlen in avondkleding, jonge gezinnen met één koffer, bemanningsleden met routine.<br>
|
| 127 |
De zee is kalm; de toekomst lijkt maakbaar. Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met data.<br>
|
| 128 |
Elk record in deze dataset is een menselijk verhaal: iemand met een plek aan tafel, een ticket, een familie, een keuze.<br>
|
| 129 |
-
Door de gegevens te verkennen, begrijpen we beter wie overleefde — en waarom
|
| 130 |
-
|
| 131 |
-
Waar de onderzoekers van toen vooral vertrouwden op statistiek, logboeken en getuigenissen, gebruiken we nu machine learning — een moderne en geavanceerde vorm van datadenken.
|
| 132 |
-
Waar klassieke methoden één verband tegelijk onderzochten, kan machine learning duizenden patronen tegelijk herkennen en verbanden leggen die de menselijke blik vaak ontgaan.
|
| 133 |
-
Het is geen enkelvoudige berekening, maar een zelflerend proces: een algoritme dat zijn eigen fouten evalueert en stap voor stap beter wordt in het onderscheiden van wat betekenisvol is en wat toeval.
|
| 134 |
-
|
| 135 |
-
Met supervised learning laten we de computer leren van voorbeelden uit het verleden — van gegevens waarvan we de uitkomst al kennen.
|
| 136 |
-
Zo leert het systeem wat het verschil is tussen overleven en vergaan, tussen geluk en noodlot.
|
| 137 |
-
Elke passagier wordt dan niet alleen een datapunt, maar een stukje context, een les waarmee het model beter leert begrijpen welke factoren het lot beïnvloedden: leeftijd, klasse, geslacht, familie, ticketprijs, vertrekhaven.
|
| 138 |
-
|
| 139 |
-
Machine learning kan subtiele, vaak onzichtbare relaties blootleggen: combinaties van omstandigheden die voorheen onopgemerkt bleven.
|
| 140 |
-
Het laat zien dat het niet altijd één enkel kenmerk is dat bepalend is, maar juist de samenhang — het web van kleine verschillen dat de geschiedenis mede vormde.
|
| 141 |
-
Soms bevestigt het model wat we al vermoedden, soms verrast het ons met nieuwe inzichten, en soms leert het ons dat toeval zelf ook een rol speelt die we niet volledig kunnen vangen in cijfers.
|
| 142 |
-
|
| 143 |
-
Supervised learning is daarmee meer dan een technische truc: het is een manier van kijken.
|
| 144 |
-
Een venster waardoor we de werkelijkheid niet alleen meten, maar ook beter leren begrijpen.
|
| 145 |
-
Het combineert wiskundige precisie met menselijke nieuwsgierigheid, en geeft ons de mogelijkheid om patronen te zien die het verleden nog altijd fluistert, maar nooit hardop zei.
|
| 146 |
-
|
| 147 |
-
Het is alsof we met een digitale bril naar de geschiedenis kijken — een bril die niet oordeelt, maar leert, vergelijkt en verbanden zichtbaar maakt die het menselijk oog destijds niet kon zien.
|
| 148 |
</span>
|
| 149 |
"""
|
| 150 |
|
| 151 |
EXPLAIN_MD_SIDE = """
|
| 152 |
<span style='color:#1B4B91'>
|
| 153 |
-
Bij het opstarten traint de computer een RandomForest-model dat leert wie op de Titanic overleefde – en waarom
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
Elk van die bomen probeert een voorspelling te doen, alsof het een eigen mening vormt op basis van de gegevens.
|
| 158 |
-
Sommige bomen zullen zeggen: “ik denk dat deze persoon overleefde”, andere: “waarschijnlijk niet.”
|
| 159 |
-
Het bos – de verzameling van al die bomen samen – neemt dan de meerderheid van die meningen, waardoor één krachtige, evenwichtige beslissing ontstaat.
|
| 160 |
-
Zo vermijdt het model dat één toevallig patroon de uitkomst bepaalt: het leert van vele perspectieven tegelijk.
|
| 161 |
-
|
| 162 |
-
Wanneer het model eenmaal getraind is, kan het niet alleen het verleden verklaren, maar ook hypothetische scenario’s inschatten.
|
| 163 |
-
Wat als iemand ouder was geweest? Of in een andere klasse had gereisd?
|
| 164 |
-
Met één druk op de knop laat het model zien hoe zulke kleine verschillen het lot konden beïnvloeden.
|
| 165 |
-
Het leert dus niet alleen *wie* overleefde, maar ook *waarom* – en dat maakt de data levend, betekenisvol en menselijk.
|
| 166 |
</span>
|
| 167 |
"""
|
| 168 |
|
|
@@ -185,36 +157,98 @@ def plot_fare_box(dfx):
|
|
| 185 |
return make_plot(f, "Ticketprijs per klasse (met overleving)")
|
| 186 |
|
| 187 |
# ======================================================
|
| 188 |
-
# INTERACTIEVE VOORSPELLING
|
| 189 |
# ======================================================
|
| 190 |
def predict_and_story(pclass, sex, age, sibsp, parch, fare, embarked):
|
| 191 |
if MODEL is None:
|
| 192 |
return "⏳ Het model initialiseert nog. Probeer het zo nog eens."
|
|
|
|
| 193 |
X_row = pd.DataFrame([{
|
| 194 |
"pclass": int(pclass), "sex": sex, "age": float(age),
|
| 195 |
"sibsp": int(sibsp), "parch": int(parch), "fare": float(fare),
|
| 196 |
"embarked": embarked, "family_size": int(sibsp)+int(parch)+1
|
| 197 |
}])
|
| 198 |
-
|
|
|
|
|
|
|
|
|
|
| 199 |
klasse_txt = {1:"eerste",2:"tweede",3:"derde"}[int(pclass)]
|
| 200 |
haven_txt = {"C":"Cherbourg","Q":"Queenstown","S":"Southampton"}[embarked]
|
| 201 |
rol_txt = "vrouw" if sex.lower().startswith("v") else "man"
|
| 202 |
-
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 211 |
else:
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 218 |
"""
|
| 219 |
|
| 220 |
# ======================================================
|
|
@@ -276,7 +310,6 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
|
|
| 276 |
# Header-intro + foto
|
| 277 |
with gr.Row():
|
| 278 |
with gr.Column(scale=2, min_width=420):
|
| 279 |
-
# Alleen blauwe tekst (HTML inline), geen vet/zwart
|
| 280 |
gr.Markdown(INTRO_MD, elem_classes=["intro-card"])
|
| 281 |
with gr.Column(scale=1, min_width=320):
|
| 282 |
hp = hero_path()
|
|
@@ -307,7 +340,6 @@ with gr.Blocks(css=CUSTOM_CSS, theme=gr.themes.Default(primary_hue="blue")) as d
|
|
| 307 |
with gr.Column(scale=2, min_width=420):
|
| 308 |
train_plot = gr.Plot(label="2D-projectie — elk bolletje is een passagier")
|
| 309 |
with gr.Column(scale=1, min_width=320):
|
| 310 |
-
# Alleen blauwe tekst (HTML inline), geen vet/zwart
|
| 311 |
gr.Markdown(EXPLAIN_MD_SIDE, elem_classes=["explain-card"])
|
| 312 |
|
| 313 |
# KPIs
|
|
|
|
| 120 |
# TEKSTBLOKKEN — ALLEEN BLAUW, GEEN ZWART/GEEN VET
|
| 121 |
# ======================================================
|
| 122 |
INTRO_MD = """
|
| 123 |
+
<span style='color:#1B4B91'>
|
| 124 |
April 1912.<br>
|
| 125 |
De RMS Titanic vertrekt richting New York: een drijvend paleis, gevuld met verwachtingen.<br>
|
| 126 |
Aan boord: industriëlen in avondkleding, jonge gezinnen met één koffer, bemanningsleden met routine.<br>
|
| 127 |
De zee is kalm; de toekomst lijkt maakbaar. Meer dan een eeuw later kijken wij mee — niet met verrekijkers of logboeken, maar met data.<br>
|
| 128 |
Elk record in deze dataset is een menselijk verhaal: iemand met een plek aan tafel, een ticket, een familie, een keuze.<br>
|
| 129 |
+
Door de gegevens te verkennen, begrijpen we beter wie overleefde — en waarom.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 130 |
</span>
|
| 131 |
"""
|
| 132 |
|
| 133 |
EXPLAIN_MD_SIDE = """
|
| 134 |
<span style='color:#1B4B91'>
|
| 135 |
+
Bij het opstarten traint de computer een RandomForest-model dat leert wie op de Titanic overleefde – en waarom.<br>
|
| 136 |
+
Het kijkt naar klasse, geslacht, leeftijd, familieomvang, ticketprijs en haven van vertrek.<br>
|
| 137 |
+
De nauwkeurigheid (bijv. 74%) betekent: in 74 van de 100 gevallen voorspelt het model correct.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 138 |
</span>
|
| 139 |
"""
|
| 140 |
|
|
|
|
| 157 |
return make_plot(f, "Ticketprijs per klasse (met overleving)")
|
| 158 |
|
| 159 |
# ======================================================
|
| 160 |
+
# INTERACTIEVE VOORSPELLING — UITGEBREIDE TEKST & OPMAAK
|
| 161 |
# ======================================================
|
| 162 |
def predict_and_story(pclass, sex, age, sibsp, parch, fare, embarked):
|
| 163 |
if MODEL is None:
|
| 164 |
return "⏳ Het model initialiseert nog. Probeer het zo nog eens."
|
| 165 |
+
|
| 166 |
X_row = pd.DataFrame([{
|
| 167 |
"pclass": int(pclass), "sex": sex, "age": float(age),
|
| 168 |
"sibsp": int(sibsp), "parch": int(parch), "fare": float(fare),
|
| 169 |
"embarked": embarked, "family_size": int(sibsp)+int(parch)+1
|
| 170 |
}])
|
| 171 |
+
|
| 172 |
+
prob = float(MODEL.predict_proba(X_row)[0,1])
|
| 173 |
+
pct = prob * 100
|
| 174 |
+
|
| 175 |
klasse_txt = {1:"eerste",2:"tweede",3:"derde"}[int(pclass)]
|
| 176 |
haven_txt = {"C":"Cherbourg","Q":"Queenstown","S":"Southampton"}[embarked]
|
| 177 |
rol_txt = "vrouw" if sex.lower().startswith("v") else "man"
|
| 178 |
+
familie_totaal = int(sibsp) + int(parch) + 1
|
| 179 |
+
|
| 180 |
+
if pct >= 75:
|
| 181 |
+
analyse = (
|
| 182 |
+
"Je kansen zijn uitzonderlijk goed.<br>"
|
| 183 |
+
"Het model ziet een combinatie van factoren die sterk wijzen op overleving — "
|
| 184 |
+
"je positie aan boord, je profiel, en de omstandigheden rondom jouw reis. "
|
| 185 |
+
"In dit scenario weegt geluk én voorrang zwaar mee: de uitkomst is gunstig."
|
| 186 |
+
)
|
| 187 |
+
avontuur = (
|
| 188 |
+
"De nacht is helder en koud. Het dek glanst van het ijs. "
|
| 189 |
+
"In de verte klinkt geroep; een sloep wordt neergelaten. "
|
| 190 |
+
"Je ademt wolkjes van spanning terwijl je dichterbij sluipt. "
|
| 191 |
+
"Er is nog plek — handen trekken je aan boord. "
|
| 192 |
+
"Het schip helt achter je, maar jij leeft."
|
| 193 |
+
)
|
| 194 |
+
elif pct >= 50:
|
| 195 |
+
analyse = (
|
| 196 |
+
"Je kansen zijn redelijk goed.<br>"
|
| 197 |
+
"Sommige kenmerken spelen in jouw voordeel, andere niet. "
|
| 198 |
+
"Het model schat dat de balans neigt naar overleven — "
|
| 199 |
+
"een situatie waarin oplettendheid, toeval en tijd samen het verschil kunnen maken."
|
| 200 |
+
)
|
| 201 |
+
avontuur = (
|
| 202 |
+
"Het dek is onrustig; stemmen, touwen, water dat tegen de reling slaat. "
|
| 203 |
+
"Je aarzelt even, zoekt naar je familie. "
|
| 204 |
+
"In de chaos vind je een plek in een halfgevulde sloep. "
|
| 205 |
+
"Je hoort geroep achter je, maar de boot drijft al weg. "
|
| 206 |
+
"Je leeft — maar de stilte die volgt is zwaarder dan het lawaai."
|
| 207 |
+
)
|
| 208 |
+
elif pct >= 25:
|
| 209 |
+
analyse = (
|
| 210 |
+
"De kansen zijn fifty-fifty.<br>"
|
| 211 |
+
"Het model weegt veel factoren die elkaar in evenwicht houden — "
|
| 212 |
+
"je klasse, geslacht, leeftijd, familieomvang en vertrekhaven. "
|
| 213 |
+
"Niets is beslissend, alles telt mee. "
|
| 214 |
+
"De uitkomst lijkt even onzeker als die nacht zelf."
|
| 215 |
+
)
|
| 216 |
+
avontuur = (
|
| 217 |
+
"De nacht is stil; fluiten, geroep, voetstappen echoën over het dek. "
|
| 218 |
+
"Je klampt je vast aan je familie terwijl het schip verder helt. "
|
| 219 |
+
"Het water glinstert als glas in het maanlicht. "
|
| 220 |
+
"Op het laatste moment spring je — niet wetend of het water of de lucht je zal dragen. "
|
| 221 |
+
"De nacht is lang, maar aan de horizon gloeit het eerste licht."
|
| 222 |
+
)
|
| 223 |
else:
|
| 224 |
+
analyse = (
|
| 225 |
+
"Het ziet er somber uit.<br>"
|
| 226 |
+
"De omstandigheden zijn tegen je — klasse, positie, drukte bij de sloepen. "
|
| 227 |
+
"Het model herkent een profiel dat destijds zelden overleefde. "
|
| 228 |
+
"Toch blijft elke voorspelling slechts een kans; hoop is geen getal, maar een verhaal."
|
| 229 |
+
)
|
| 230 |
+
avontuur = (
|
| 231 |
+
"Het geluid van brekend staal vult de lucht. "
|
| 232 |
+
"Het dek helt scherp, water stroomt langs je voeten. "
|
| 233 |
+
"Je klampt je vast aan een reling, voelt de kou door je heen snijden. "
|
| 234 |
+
"In de verte hoor je stemmen, dan alleen nog de zee. "
|
| 235 |
+
"De oceaan is meedogenloos — maar even, voor het verdwijnen, is alles stil."
|
| 236 |
+
)
|
| 237 |
+
|
| 238 |
+
return f"""
|
| 239 |
+
### 🔮 Jouw overlevingskans: **{pct:.1f}%**
|
| 240 |
+
|
| 241 |
+
**Situatie:**<br>
|
| 242 |
+
{rol_txt}, {klasse_txt} klasse, inscheping {haven_txt}.<br>
|
| 243 |
+
Leeftijd: {int(age)} jaar.<br>
|
| 244 |
+
Familie aan boord: {int(sibsp)} broers/zussen en {int(parch)} ouders/kinderen (totaal {familie_totaal}).<br>
|
| 245 |
+
Ticketprijs: £{float(fare):.2f}.<br><br>
|
| 246 |
+
|
| 247 |
+
**Analyse:**<br>
|
| 248 |
+
{analyse}<br><br>
|
| 249 |
+
|
| 250 |
+
**Avontuur:**<br>
|
| 251 |
+
{avontuur}
|
| 252 |
"""
|
| 253 |
|
| 254 |
# ======================================================
|
|
|
|
| 310 |
# Header-intro + foto
|
| 311 |
with gr.Row():
|
| 312 |
with gr.Column(scale=2, min_width=420):
|
|
|
|
| 313 |
gr.Markdown(INTRO_MD, elem_classes=["intro-card"])
|
| 314 |
with gr.Column(scale=1, min_width=320):
|
| 315 |
hp = hero_path()
|
|
|
|
| 340 |
with gr.Column(scale=2, min_width=420):
|
| 341 |
train_plot = gr.Plot(label="2D-projectie — elk bolletje is een passagier")
|
| 342 |
with gr.Column(scale=1, min_width=320):
|
|
|
|
| 343 |
gr.Markdown(EXPLAIN_MD_SIDE, elem_classes=["explain-card"])
|
| 344 |
|
| 345 |
# KPIs
|