Update app/streamlit_app.py
Browse files- app/streamlit_app.py +18 -12
app/streamlit_app.py
CHANGED
|
@@ -109,7 +109,7 @@ if page == "Prediction":
|
|
| 109 |
if submit_btn:
|
| 110 |
payload = {"Time": st.session_state.t_time, "Amount": st.session_state.t_amount, **v_data}
|
| 111 |
|
| 112 |
-
#
|
| 113 |
st.session_state["last_payload"] = payload
|
| 114 |
|
| 115 |
try:
|
|
@@ -136,8 +136,7 @@ if page == "Prediction":
|
|
| 136 |
except Exception as e:
|
| 137 |
st.error(f"β³ Error connecting to API: {e}")
|
| 138 |
|
| 139 |
-
|
| 140 |
-
# π₯ NEW SHAP PAGE
|
| 141 |
elif page == "Explainability (SHAP)":
|
| 142 |
st.title("π§ Explainable AI (SHAP)")
|
| 143 |
|
|
@@ -164,7 +163,7 @@ elif page == "Explainability (SHAP)":
|
|
| 164 |
except Exception as e:
|
| 165 |
st.error(f"β Error: {e}")
|
| 166 |
|
| 167 |
-
|
| 168 |
elif page == "Drift Monitoring":
|
| 169 |
st.title("π Data Drift Monitoring")
|
| 170 |
st.markdown("### Monitor model health & trigger verified retraining")
|
|
@@ -178,7 +177,7 @@ elif page == "Drift Monitoring":
|
|
| 178 |
for i in range(1, 29):
|
| 179 |
skewed_data[f"V{i}"] = random.uniform(-15.0, 15.0)
|
| 180 |
save_to_db(skewed_data, pred=1, prob=0.99)
|
| 181 |
-
st.success("β
50 Skewed rows injected!")
|
| 182 |
|
| 183 |
st.markdown("---")
|
| 184 |
|
|
@@ -197,7 +196,7 @@ elif page == "Drift Monitoring":
|
|
| 197 |
st.success("β
Drift report generated!")
|
| 198 |
st.session_state["drift_done"] = True
|
| 199 |
else:
|
| 200 |
-
st.warning("β οΈ Not enough data in live DB")
|
| 201 |
except Exception as e:
|
| 202 |
st.error(f"β οΈ Error running drift: {e}")
|
| 203 |
|
|
@@ -207,10 +206,17 @@ elif page == "Drift Monitoring":
|
|
| 207 |
html = f.read()
|
| 208 |
components.html(html, height=800, scrolling=True)
|
| 209 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 210 |
if st.session_state.get("drift_done", False):
|
| 211 |
-
if st.button("β‘ Retrain Model"):
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
if submit_btn:
|
| 110 |
payload = {"Time": st.session_state.t_time, "Amount": st.session_state.t_amount, **v_data}
|
| 111 |
|
| 112 |
+
# store for SHAP page
|
| 113 |
st.session_state["last_payload"] = payload
|
| 114 |
|
| 115 |
try:
|
|
|
|
| 136 |
except Exception as e:
|
| 137 |
st.error(f"β³ Error connecting to API: {e}")
|
| 138 |
|
| 139 |
+
# --- NEW SHAP PAGE ---
|
|
|
|
| 140 |
elif page == "Explainability (SHAP)":
|
| 141 |
st.title("π§ Explainable AI (SHAP)")
|
| 142 |
|
|
|
|
| 163 |
except Exception as e:
|
| 164 |
st.error(f"β Error: {e}")
|
| 165 |
|
| 166 |
+
# --- DRIFT MONITORING (UNCHANGED EXACTLY) ---
|
| 167 |
elif page == "Drift Monitoring":
|
| 168 |
st.title("π Data Drift Monitoring")
|
| 169 |
st.markdown("### Monitor model health & trigger verified retraining")
|
|
|
|
| 177 |
for i in range(1, 29):
|
| 178 |
skewed_data[f"V{i}"] = random.uniform(-15.0, 15.0)
|
| 179 |
save_to_db(skewed_data, pred=1, prob=0.99)
|
| 180 |
+
st.success("β
50 Skewed rows injected! Now click 'Run Drift Detection' below.")
|
| 181 |
|
| 182 |
st.markdown("---")
|
| 183 |
|
|
|
|
| 196 |
st.success("β
Drift report generated!")
|
| 197 |
st.session_state["drift_done"] = True
|
| 198 |
else:
|
| 199 |
+
st.warning("β οΈ Not enough data in live DB (Needs 50 rows). Use the Demo Injector above!")
|
| 200 |
except Exception as e:
|
| 201 |
st.error(f"β οΈ Error running drift: {e}")
|
| 202 |
|
|
|
|
| 206 |
html = f.read()
|
| 207 |
components.html(html, height=800, scrolling=True)
|
| 208 |
|
| 209 |
+
st.markdown("---")
|
| 210 |
+
st.subheader("π Human-in-the-Loop Retraining")
|
| 211 |
+
st.write("Ensure database contains human-verified `Actual_Class` labels before retraining.")
|
| 212 |
+
|
| 213 |
if st.session_state.get("drift_done", False):
|
| 214 |
+
if st.button("β‘ Retrain Model (Requires Verified Data)"):
|
| 215 |
+
with st.spinner("Retraining model..."):
|
| 216 |
+
try:
|
| 217 |
+
retrain()
|
| 218 |
+
st.success("β
Model retrained successfully with verified data!")
|
| 219 |
+
except ValueError as ve:
|
| 220 |
+
st.error(f"β {ve}")
|
| 221 |
+
except Exception as e:
|
| 222 |
+
st.error(f"β Error: {e}")
|