Spaces:
Paused
Paused
| import streamlit as st | |
| import pandas as pd | |
| import joblib | |
| import numpy as np | |
| # 1. Page Configuration | |
| st.set_page_config(page_title="Water Quality AI Predictor", page_icon="💧", layout="centered") | |
| # 2. Load Model and Scaler | |
| def load_assets(): | |
| # Ensure these files are uploaded to your Hugging Face Space | |
| model = joblib.load('su_kalite_modeli.pkl') | |
| scaler = joblib.load('su_scaler.pkl') | |
| return model, scaler | |
| try: | |
| model, scaler = load_assets() | |
| except Exception as e: | |
| st.error("Error: Model or Scaler files not found. Please upload .pkl files to the repository.") | |
| # 3. Header & Introduction | |
| st.title("🌊 Water Quality AI Classification") | |
| st.markdown(""" | |
| This AI-powered tool classifies water samples as **Healthy** or **Risky** using real-time sensor data. | |
| Adjust the parameters on the left to see the prediction. | |
| """) | |
| # 4. Sidebar for User Input | |
| st.sidebar.header("Manual Input Parameters") | |
| def user_input_features(): | |
| salinity = st.sidebar.slider("Salinity (ppt)", 0.0, 40.0, 30.0) | |
| oxygen = st.sidebar.slider("Dissolved Oxygen (mg/L)", 0.0, 15.0, 7.0) | |
| ph = st.sidebar.slider("pH Level", 0.0, 14.0, 7.5) | |
| secchi = st.sidebar.slider("Secchi Depth (m)", 0.0, 5.0, 1.0) | |
| depth = st.sidebar.slider("Water Depth (m)", 0.0, 20.0, 5.0) | |
| temp = st.sidebar.slider("Water Temp (°C)", 0.0, 40.0, 22.0) | |
| air_temp = st.sidebar.slider("Air Temp (°C)", -10.0, 50.0, 25.0) | |
| # Constant features based on your model's 15-feature requirement | |
| year = 2024 | |
| site_b, site_bay, site_c, site_d, site_small_d = 0, 1, 0, 0, 0 | |
| year_feat = 2024 | |
| month_feat = 6 | |
| data = [[salinity, oxygen, ph, secchi, depth, temp, air_temp, year, | |
| site_b, site_bay, site_c, site_d, site_small_d, year_feat, month_feat]] | |
| return data | |
| input_data = user_input_features() | |
| # 5. Prediction Logic | |
| if st.button("Run AI Analysis"): | |
| # Scaling | |
| input_scaled = scaler.transform(input_data) | |
| # Prediction | |
| prediction = model.predict(input_scaled) | |
| prediction_proba = model.predict_proba(input_scaled) | |
| confidence = np.max(prediction_proba) * 100 | |
| st.divider() | |
| st.subheader("Analysis Result") | |
| if prediction[0] == 1: | |
| st.success(f"✅ **STATUS: HEALTHY**") | |
| st.metric(label="Confidence Level", value=f"{confidence:.2f}%") | |
| st.write("The water parameters are within the safe range for aquatic life.") | |
| st.snow() # Water-drop-like effect instead of balloons | |
| else: | |
| st.error(f"🚨 **STATUS: RISKY**") | |
| st.metric(label="Confidence Level", value=f"{confidence:.2f}%") | |
| st.write("Warning: Oxygen or pH levels indicate a potential risk to the ecosystem.") | |
| # 6. Model Info Footer | |
| st.divider() | |
| st.info(f""" | |
| **Technical Specs:** | |
| - **Model:** Gradient Boosting Classifier | |
| - **Accuracy:** 84% | |
| - **Top Feature:** Dissolved Oxygen | |
| """) | |