--- language: - en license: mit tags: - xgboost - tabular-regression - flash-flood - weather - environmental - malaysia metrics: - rmse - mae - r2 pipeline_tag: tabular-regression --- # Flash Flood Probability Predictor (XGBoost) ## Model Description This repository contains a lightweight **XGBoost Regressor** trained to predict the probability of flash floods (from `0` to `100`%) based on simulated Malaysian hydrological data. The model analyzes historical and current hourly rainfall (mm) and river water levels (m) to calculate short-term flooding risks, capturing the delayed response of river runoff to heavy monsoonal storms. This model (`flash_flood_predictor.joblib`) was trained on a 10-year simulated dataset (2015-2025) which provides the best balance of variance and generalization. ## Intended Use - **Flash Flood Early Warning**: Calculating real-time risk scores using sensor streams of river levels and rainfall. - **Hydrological Simulations**: Estimating the impact of varying rainfall intensities on flood probabilities. ## Model Performance The model's performance metrics on the test dataset are: - **Test RMSE:** 2.7202 - **Test MAE:** 2.1971 - **Test R²:** 0.9927 ## Feature Engineering The model requires raw rainfall and river level data to be pre-processed into temporal features, including: 1. **Lags**: `river_level_lag_1h`, `river_level_lag_2h`, `rainfall_1h_lag_1h` 2. **Rolling Rates**: `river_change_1h`, `river_change_3h`, `river_change_6h` 3. **Interactions**: Compounding risk features like `rain_river_interaction_24h` (Rainfall 24h × River Level) 4. **Seasonal**: `hour`, `month` The most critical features driving the model's predictions are the **Current River Water Level** (45% importance) and the **River Water Level 1 Hour Ago** (40% importance). ## How to Use You can load and use the model in Python via `joblib`: ```python import joblib import pandas as pd import numpy as np # 1. Load the model artifact model_data = joblib.load("flash_flood_predictor.joblib") model = model_data['model'] expected_features = model_data['features'] # 2. Prepare your feature dictionary (must be pre-engineered) sample_features = { 'rainfall_1h_mm': 15.0, 'rainfall_3h_mm': 45.0, 'rainfall_6h_mm': 60.0, 'rainfall_24h_mm': 90.0, 'cumulative_rainfall_3day_mm': 120.0, 'river_water_level_m': 4.2, 'river_change_1h': 0.3, 'river_change_3h': 0.8, 'river_change_6h': 1.2, 'river_level_lag_1h': 3.9, 'river_level_lag_2h': 3.6, 'rainfall_1h_lag_1h': 20.0, 'rainfall_1h_lag_2h': 10.0, 'rain_river_interaction_3h': 45.0 * 4.2, 'rain_river_interaction_24h': 90.0 * 4.2, 'hour': 21, 'month': 5 } # 3. Convert to DataFrame and Predict X_single = pd.DataFrame([sample_features])[expected_features] prediction = model.predict(X_single)[0] # Clamp to 0-100% probability flood_probability = np.clip(prediction, 0.0, 100.0) print(f"Predicted Flash Flood Probability: {flood_probability:.1f}%") ``` ## Limitations - **Synthetic Data**: This model was trained on *synthetic* data meant to closely mimic Malaysian hydrology. For production deployment, it must be retrained on real local telemetry. - **Geographic Specificity**: The generated weather patterns assume tropical monsoonal climates.