gridguard-ai / README.md
Samdutse's picture
Upload folder using huggingface_hub
f73bfe6 verified
|
Raw
History Blame Contribute Delete
4.92 kB
---
title: GridGuard AI
emoji:
colorFrom: yellow
colorTo: red
sdk: gradio
sdk_version: "5.9.1"
app_file: app.py
pinned: false
---
# GridGuard AI
**AI-powered revenue assurance & energy-theft detection for distribution utilities**
A proof-of-concept built on fully synthetic data, demonstrating hierarchical
non-technical-loss (NTL) detection: transformer-level energy balance →
neighbourhood peer comparison → household behavioural anomaly detection →
combined Fraud Risk Score for field-agent triage.
Built for: Session 2, "Circuit Breaker: From Student to Builder" —
NIEEES Sensitization Seminar, University of Jos.
---
## How it works (3-minute pitch)
1. **Level 1 — Transformer energy balance.** Compare energy injected into
each transformer vs. the sum of metered readings from its households.
A gap above the normal technical-loss range (~6-8%) signals theft
somewhere on that feeder.
2. **Level 2 — Neighbourhood peer comparison.** Within a transformer,
compare each household against peers of similar income class / house
size in the same neighbourhood. Consumption far below peers is
suspicious — but only in context.
3. **Level 3 — Household behavioural anomaly.** An Isolation Forest learns
what "normal" consumption *change* looks like (drop ratio, trend slope,
peer deviation) and scores every household for anomalousness, without
needing fraud labels.
4. These three signals combine into a single **Fraud Risk Score (0-100)**
and tier (Low/Medium/High) used to prioritise field inspections.
**Why this isn't "just flag low consumption":** the synthetic data
deliberately includes genuinely low-consumption households (small, efficient
families) and households with a real lifestyle change (fewer occupants) that
look like a consumption drop but involve no theft. The model has to use
peer and transformer context — not just an individual reading — to tell
these apart. On held-out data: **~79% precision, ~94% recall** for the
supervised benchmark (trained on the synthetic ground-truth labels, for
evaluation only) and **100% of true fraud cases land in Medium/High risk
tier** under the unsupervised approach (which is what you'd actually
deploy, since real fraud labels are scarce).
## Files
```
gridguard/
├── 01_data_generation.py # synthetic households/readings/transformers
├── 02_train_model.py # feature engineering + IsolationForest + XGBoost eval
├── app.py # Gradio demo (4 tabs)
├── requirements.txt
├── data/ # generated CSVs (run script 1 then 2)
└── models/ # saved model artifacts (run script 2)
```
## Run in Colab
```python
# Cell 1
!pip install -q xgboost gradio plotly
# Cell 2 — paste contents of 01_data_generation.py, run
# Cell 3 — paste contents of 02_train_model.py, run
# Cell 4 — paste contents of app.py, run
# demo.launch(share=True) <- use share=True in Colab for a public demo link
```
Colab note: replace `os.path.dirname(__file__)` in each script with a fixed
path (e.g. `"/content/gridguard"`) if you paste cells individually rather
than running the .py files directly, since `__file__` isn't defined in a
notebook cell. Easiest fix: at the top of the notebook run
`!mkdir -p /content/gridguard/data /content/gridguard/models` and set
`BASE = "/content/gridguard"` in each cell instead of using `__file__`.
## Deploy to Hugging Face Spaces
1. Create a new Space → SDK: **Gradio**.
2. Upload `app.py`, `requirements.txt`, and the generated `data/` and
`models/` folders (run the two scripts locally/Colab first, then upload
the outputs — Spaces won't regenerate them automatically unless you also
upload and run the generation scripts as part of a build step).
3. Space auto-builds and launches — same URL pattern as your other projects
(`huggingface.co/spaces/Samdutse/gridguard-ai`).
## Limitations to state up front in the talk (good for Q&A / academic credibility)
- All data is synthetic — real deployment needs real AMI/meter data, and
the technical-loss baseline assumption (6-8%) should be calibrated per
feeder, not assumed.
- The supervised XGBoost numbers use injected ground-truth labels that
won't exist in production; the unsupervised + rules layers are the
realistic deployment path, and their precision will be lower in practice.
- Flagging a household is the start of an inspection process, not proof of
theft — false positives (genuine low consumers, lifestyle changes) are
expected and the workflow should always end in human field verification
before any legal action, exactly as in your original write-up.
- Real-world graph-based methods (treating the feeder as a graph, GNN
anomaly detection) are a natural next step beyond this POC, and a good
"future work" slide if asked about extending this for a thesis/PhD angle.