Marcel0123 commited on
Commit
1ae8e1f
·
verified ·
1 Parent(s): b5b790b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +84 -52
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.<br><br>
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
- Een RandomForest is een verzameling van honderden kleine beslisbomen.
155
- Elke boom stelt als het ware vragen over de passagiers: Was deze persoon man of vrouw? Hoe oud was hij of zij? In welke klasse reisde men? Hoeveel familieleden waren er mee aan boord? Wat kostte het ticket? Waar stapte men op?
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
- prob = float(MODEL.predict_proba(X_row)[0,1]); pct = prob*100
 
 
 
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
- if pct>=75:
203
- tone, ending = ("Je kansen zijn uitzonderlijk goed.",
204
- "Je bereikt de sloep; het schip helt achter je, maar je leeft.")
205
- elif pct>=50:
206
- tone, ending = ("Je kansen zijn behoorlijk goed.",
207
- "In de chaos vind je een plek in een halfgevulde sloep.")
208
- elif pct>=25:
209
- tone, ending = ("De kansen zijn fifty-fifty.",
210
- "Op het laatste moment spring je; de nacht is lang, maar de horizon gloeit.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
211
  else:
212
- tone, ending = ("Het ziet er somber uit.",
213
- "Je klampt je vast terwijl de oceaan meedogenloos wordt.")
214
- return f"""### 🔮 Jouw overlevingskans: **{pct:.1f}%**
215
- **Situatie:** {rol_txt}, **{klasse_txt} klasse**, inscheping **{haven_txt}** leeftijd **{int(age)}**, familie **{int(sibsp)}+{int(parch)}** (totaal {int(sibsp)+int(parch)+1}), ticket **£{float(fare):.2f}**.
216
- **Analyse:** {tone} Het model weegt o.a. klasse, geslacht, leeftijd en familieomvang mee.
217
- **Avontuur:** De nacht is stil; fluiten, geroep, voetstappen. {ending}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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