Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -13,7 +13,7 @@ import os
|
|
| 13 |
# =======================
|
| 14 |
# DATA LADEN
|
| 15 |
# =======================
|
| 16 |
-
REQUIRED_COLS = {"survived","pclass","sex","age","sibsp","parch","fare","embarked"}
|
| 17 |
|
| 18 |
def load_data(csv_path="Titanic-Dataset.csv"):
|
| 19 |
if not os.path.exists(csv_path):
|
|
@@ -44,7 +44,9 @@ def train_model(modeltype="Random Forest"):
|
|
| 44 |
for c in X.select_dtypes("object").columns:
|
| 45 |
le = LabelEncoder()
|
| 46 |
X[c] = le.fit_transform(X[c])
|
| 47 |
-
X_train, X_test, y_train, y_test = train_test_split(
|
|
|
|
|
|
|
| 48 |
if modeltype == "Random Forest":
|
| 49 |
model = RandomForestClassifier(n_estimators=300, random_state=42)
|
| 50 |
else:
|
|
@@ -74,15 +76,20 @@ def tab_intro():
|
|
| 74 |
|
| 75 |
# Tab 2 – Verkenning
|
| 76 |
def tab_verkenning():
|
| 77 |
-
# Interactieve Plotly-grafieken
|
| 78 |
fig1 = px.histogram(
|
| 79 |
-
df,
|
| 80 |
-
|
|
|
|
|
|
|
|
|
|
| 81 |
)
|
| 82 |
fig1.update_layout(legend_title_text="Status", bargap=0.05)
|
| 83 |
fig2 = px.box(
|
| 84 |
-
df,
|
| 85 |
-
|
|
|
|
|
|
|
|
|
|
| 86 |
)
|
| 87 |
fig2.update_layout(legend_title_text="Status")
|
| 88 |
return fig1, fig2
|
|
@@ -93,11 +100,10 @@ def tab_model(model_type):
|
|
| 93 |
_, acc = train_model(model_type)
|
| 94 |
return f"Het {model_type}-model behaalt een nauwkeurigheid van **{acc:.2%}**."
|
| 95 |
except Exception as e:
|
| 96 |
-
return f"Fout bij trainen: {e}"
|
| 97 |
|
| 98 |
# Tab 4 – Voorspelling
|
| 99 |
def predict_overleven(pclass, sex, age, sibsp, parch, fare, embarked):
|
| 100 |
-
# Train snel RF op de volledige dataset (demo-doeleinden)
|
| 101 |
X = df.drop("survived", axis=1).copy()
|
| 102 |
y = df["survived"].astype(int).copy()
|
| 103 |
for c in X.select_dtypes("object").columns:
|
|
@@ -105,19 +111,17 @@ def predict_overleven(pclass, sex, age, sibsp, parch, fare, embarked):
|
|
| 105 |
X[c] = le.fit_transform(X[c])
|
| 106 |
rf = RandomForestClassifier(n_estimators=300, random_state=42)
|
| 107 |
rf.fit(X, y)
|
| 108 |
-
#
|
| 109 |
sex_enc = 1 if str(sex).lower().startswith("v") else 0 # Vrouw=1, Man=0
|
| 110 |
embarked_enc = {"C": 0, "Q": 1, "S": 2}.get(str(embarked).strip()[0].upper(), 2)
|
| 111 |
-
row = [[int(pclass),
|
| 112 |
p = rf.predict_proba(row)[0, 1]
|
| 113 |
return f"🎯 Je geschatte overlevingskans is **{p:.1%}**."
|
| 114 |
|
| 115 |
# =======================
|
| 116 |
# UI – Gradio
|
| 117 |
# =======================
|
| 118 |
-
|
| 119 |
custom_css = """
|
| 120 |
-
/* Achtergrond + leesbaarheid */
|
| 121 |
body {
|
| 122 |
background: url('titanic_bg.png') no-repeat center center fixed;
|
| 123 |
background-size: cover;
|
|
@@ -126,8 +130,6 @@ body {
|
|
| 126 |
.gradio-container {
|
| 127 |
background: rgba(10, 16, 26, 0.70);
|
| 128 |
}
|
| 129 |
-
|
| 130 |
-
/* Glossy zonsondergang rechtsboven */
|
| 131 |
.gradio-container::before {
|
| 132 |
content: '';
|
| 133 |
position: fixed;
|
|
@@ -137,19 +139,13 @@ body {
|
|
| 137 |
pointer-events: none;
|
| 138 |
z-index: 0;
|
| 139 |
}
|
| 140 |
-
|
| 141 |
-
/* Tekstcontrasten */
|
| 142 |
h1, h2, h3, p, label, .gr-markdown { color: #eef5ff !important; }
|
| 143 |
label { font-weight: 600; }
|
| 144 |
-
|
| 145 |
-
/* Kaarten / secties */
|
| 146 |
div.svelte-1ipelgc, .block.padded {
|
| 147 |
background: rgba(20, 28, 42, 0.70) !important;
|
| 148 |
border-radius: 16px;
|
| 149 |
border: 1px solid rgba(60, 80, 110, 0.5);
|
| 150 |
}
|
| 151 |
-
|
| 152 |
-
/* Tabs */
|
| 153 |
button.svelte-1ipelgc, .tabitem {
|
| 154 |
backdrop-filter: blur(2px);
|
| 155 |
}
|
|
@@ -163,13 +159,17 @@ with gr.Blocks(css=custom_css, theme=gr.themes.Soft(primary_hue="blue", secondar
|
|
| 163 |
|
| 164 |
with gr.Tab("Verkenning"):
|
| 165 |
btn1 = gr.Button("Toon grafieken")
|
| 166 |
-
out1 = gr.
|
| 167 |
-
out2 = gr.
|
| 168 |
btn1.click(fn=tab_verkenning, outputs=[out1, out2])
|
| 169 |
|
| 170 |
with gr.Tab("Machine Learning"):
|
| 171 |
with gr.Row():
|
| 172 |
-
model_dropdown = gr.Dropdown(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 173 |
btn2 = gr.Button("Train model")
|
| 174 |
out3 = gr.Markdown()
|
| 175 |
btn2.click(fn=tab_model, inputs=model_dropdown, outputs=out3)
|
|
@@ -186,8 +186,10 @@ with gr.Blocks(css=custom_css, theme=gr.themes.Soft(primary_hue="blue", secondar
|
|
| 186 |
embarked = gr.Radio(["C", "Q", "S"], label="Vertrekhaven", value="S")
|
| 187 |
btn3 = gr.Button("Voorspel")
|
| 188 |
out4 = gr.Markdown()
|
| 189 |
-
btn3.click(
|
| 190 |
-
|
| 191 |
-
|
|
|
|
|
|
|
| 192 |
|
| 193 |
-
demo.launch()
|
|
|
|
| 13 |
# =======================
|
| 14 |
# DATA LADEN
|
| 15 |
# =======================
|
| 16 |
+
REQUIRED_COLS = {"survived", "pclass", "sex", "age", "sibsp", "parch", "fare", "embarked"}
|
| 17 |
|
| 18 |
def load_data(csv_path="Titanic-Dataset.csv"):
|
| 19 |
if not os.path.exists(csv_path):
|
|
|
|
| 44 |
for c in X.select_dtypes("object").columns:
|
| 45 |
le = LabelEncoder()
|
| 46 |
X[c] = le.fit_transform(X[c])
|
| 47 |
+
X_train, X_test, y_train, y_test = train_test_split(
|
| 48 |
+
X, y, test_size=0.2, random_state=42, stratify=y
|
| 49 |
+
)
|
| 50 |
if modeltype == "Random Forest":
|
| 51 |
model = RandomForestClassifier(n_estimators=300, random_state=42)
|
| 52 |
else:
|
|
|
|
| 76 |
|
| 77 |
# Tab 2 – Verkenning
|
| 78 |
def tab_verkenning():
|
|
|
|
| 79 |
fig1 = px.histogram(
|
| 80 |
+
df,
|
| 81 |
+
x="age",
|
| 82 |
+
color=df["survived"].map({0: "Niet overleefd", 1: "Overleefd"}),
|
| 83 |
+
nbins=30,
|
| 84 |
+
title="Leeftijdsverdeling per overlevingsstatus",
|
| 85 |
)
|
| 86 |
fig1.update_layout(legend_title_text="Status", bargap=0.05)
|
| 87 |
fig2 = px.box(
|
| 88 |
+
df,
|
| 89 |
+
x="pclass",
|
| 90 |
+
y="fare",
|
| 91 |
+
color=df["survived"].map({0: "Niet overleefd", 1: "Overleefd"}),
|
| 92 |
+
title="Ticketprijs per klasse",
|
| 93 |
)
|
| 94 |
fig2.update_layout(legend_title_text="Status")
|
| 95 |
return fig1, fig2
|
|
|
|
| 100 |
_, acc = train_model(model_type)
|
| 101 |
return f"Het {model_type}-model behaalt een nauwkeurigheid van **{acc:.2%}**."
|
| 102 |
except Exception as e:
|
| 103 |
+
return f"⚠️ Fout bij trainen: {e}"
|
| 104 |
|
| 105 |
# Tab 4 – Voorspelling
|
| 106 |
def predict_overleven(pclass, sex, age, sibsp, parch, fare, embarked):
|
|
|
|
| 107 |
X = df.drop("survived", axis=1).copy()
|
| 108 |
y = df["survived"].astype(int).copy()
|
| 109 |
for c in X.select_dtypes("object").columns:
|
|
|
|
| 111 |
X[c] = le.fit_transform(X[c])
|
| 112 |
rf = RandomForestClassifier(n_estimators=300, random_state=42)
|
| 113 |
rf.fit(X, y)
|
| 114 |
+
# Encode invoer
|
| 115 |
sex_enc = 1 if str(sex).lower().startswith("v") else 0 # Vrouw=1, Man=0
|
| 116 |
embarked_enc = {"C": 0, "Q": 1, "S": 2}.get(str(embarked).strip()[0].upper(), 2)
|
| 117 |
+
row = [[int(pclass), sex_enc, float(age), int(sibsp), int(parch), float(fare), embarked_enc]]
|
| 118 |
p = rf.predict_proba(row)[0, 1]
|
| 119 |
return f"🎯 Je geschatte overlevingskans is **{p:.1%}**."
|
| 120 |
|
| 121 |
# =======================
|
| 122 |
# UI – Gradio
|
| 123 |
# =======================
|
|
|
|
| 124 |
custom_css = """
|
|
|
|
| 125 |
body {
|
| 126 |
background: url('titanic_bg.png') no-repeat center center fixed;
|
| 127 |
background-size: cover;
|
|
|
|
| 130 |
.gradio-container {
|
| 131 |
background: rgba(10, 16, 26, 0.70);
|
| 132 |
}
|
|
|
|
|
|
|
| 133 |
.gradio-container::before {
|
| 134 |
content: '';
|
| 135 |
position: fixed;
|
|
|
|
| 139 |
pointer-events: none;
|
| 140 |
z-index: 0;
|
| 141 |
}
|
|
|
|
|
|
|
| 142 |
h1, h2, h3, p, label, .gr-markdown { color: #eef5ff !important; }
|
| 143 |
label { font-weight: 600; }
|
|
|
|
|
|
|
| 144 |
div.svelte-1ipelgc, .block.padded {
|
| 145 |
background: rgba(20, 28, 42, 0.70) !important;
|
| 146 |
border-radius: 16px;
|
| 147 |
border: 1px solid rgba(60, 80, 110, 0.5);
|
| 148 |
}
|
|
|
|
|
|
|
| 149 |
button.svelte-1ipelgc, .tabitem {
|
| 150 |
backdrop-filter: blur(2px);
|
| 151 |
}
|
|
|
|
| 159 |
|
| 160 |
with gr.Tab("Verkenning"):
|
| 161 |
btn1 = gr.Button("Toon grafieken")
|
| 162 |
+
out1 = gr.Plot(label="Leeftijdsverdeling")
|
| 163 |
+
out2 = gr.Plot(label="Ticketprijs per klasse")
|
| 164 |
btn1.click(fn=tab_verkenning, outputs=[out1, out2])
|
| 165 |
|
| 166 |
with gr.Tab("Machine Learning"):
|
| 167 |
with gr.Row():
|
| 168 |
+
model_dropdown = gr.Dropdown(
|
| 169 |
+
["Random Forest", "Logistic Regression"],
|
| 170 |
+
label="Kies modeltype",
|
| 171 |
+
value="Random Forest",
|
| 172 |
+
)
|
| 173 |
btn2 = gr.Button("Train model")
|
| 174 |
out3 = gr.Markdown()
|
| 175 |
btn2.click(fn=tab_model, inputs=model_dropdown, outputs=out3)
|
|
|
|
| 186 |
embarked = gr.Radio(["C", "Q", "S"], label="Vertrekhaven", value="S")
|
| 187 |
btn3 = gr.Button("Voorspel")
|
| 188 |
out4 = gr.Markdown()
|
| 189 |
+
btn3.click(
|
| 190 |
+
fn=predict_overleven,
|
| 191 |
+
inputs=[pclass, sex, age, sibsp, parch, fare, embarked],
|
| 192 |
+
outputs=out4,
|
| 193 |
+
)
|
| 194 |
|
| 195 |
+
demo.launch()
|