genai-capstone / README.md
nakedved's picture
Add model card
8b59b50 verified
|
Raw
History Blame Contribute Delete
4.79 kB
---
license: mit
language:
- en
tags:
- sklearn
- solar-energy
- time-series
- regression
- random-forest
- energy-forecasting
- photovoltaic
library_name: sklearn
pipeline_tag: tabular-regression
metrics:
- r2
- mae
- rmse
---
# Solar Power Generation Forecast Model
A `RandomForestRegressor` (scikit-learn) trained on real solar plant operational data
to predict **plant-level DC power output 15 minutes into the future**. Part of a
GenAI capstone project that extends this forecasting model with an agentic grid
optimisation assistant built on LangGraph, FAISS RAG, and Llama 3.1 via Groq.
---
## Model Details
| Property | Value |
|---|---|
| **Model type** | RandomForestRegressor (scikit-learn 1.8.0) |
| **Task** | Tabular regression — 15-minute ahead solar power forecasting |
| **n_estimators** | 200 |
| **max_depth** | 12 |
| **random_state** | 42 |
| **n_jobs** | -1 (parallelised) |
| **Input features** | 9 |
| **Target** | DC_POWER at t+1 (Watts, plant-level aggregate) |
---
## Dataset
- **Source**: [Kaggle Solar Power Generation Data](https://www.kaggle.com/datasets/anikannal/solar-power-generation-data)
- **Plant**: Plant 1 — two 15-minute aligned CSV files (generation + weather sensor)
- **Period**: 34 days (May–June 2020), 15-minute intervals
- **Raw records**: 68,778 inverter-level rows → 3,157 plant-level timestamps after aggregation
- **Train/test split**: 80/20 chronological (2,521 train / 631 test) — no shuffling to prevent leakage
### Data Preprocessing
1. Inverter-level `DC_POWER` summed per timestamp to plant-level aggregate
2. Merged with weather sensor table on `DATE_TIME`
3. Chronological sort, null rows dropped after feature construction
---
## Features
| Feature | Type | Construction |
|---|---|---|
| `AMBIENT_TEMPERATURE` | Weather | Raw sensor reading (°C) |
| `MODULE_TEMPERATURE` | Weather | Raw sensor reading (°C) |
| `IRRADIATION` | Weather | Raw sensor reading (kW/m²) |
| `hour` | Time | `DATE_TIME.dt.hour` |
| `day_of_year` | Time | `DATE_TIME.dt.dayofyear` |
| `month` | Time | `DATE_TIME.dt.month` |
| `lag_1` | Autoregressive | `DC_POWER` at t−1 (15 min prior) |
| `lag_4` | Autoregressive | `DC_POWER` at t−4 (1 hour prior) |
| `rolling_mean_4` | Autoregressive | Rolling mean of `DC_POWER` over 4 intervals |
**Feature importances** (mean decrease in impurity, approximate):
| Feature | Importance |
|---|---|
| `IRRADIATION` | ~0.88 |
| `hour` | ~0.04 |
| `rolling_mean_4` | ~0.03 |
| `lag_4` | ~0.02 |
| `lag_1` | ~0.01 |
| Others | < 0.01 each |
Irradiation dominates by a wide margin. Temporal lag features carry independent predictive
signal for transition periods where irradiance changes rapidly.
---
## Performance
| Evaluation Split | MAE (W) | RMSE (W) | R² |
|---|---|---|---|
| **Daytime only** (irradiation > 0) | 4,646.83 | 7,397.92 | **0.9905** |
| **Full dataset** (24-hour) | 10,573.81 | 21,207.71 | **0.9323** |
The gap between splits reflects sunrise/sunset transition periods where steep power ramps
are structurally harder to predict with autoregressive lag features calibrated on
steady-state production.
---
## Usage
```python
import joblib
import numpy as np
import pandas as pd
from huggingface_hub import hf_hub_download
# Load model
path = hf_hub_download(repo_id="nakedved/genai-capstone", filename="solar_forecast_model.pkl")
model = joblib.load(path)
# Input must have exactly these 9 columns in this order:
# AMBIENT_TEMPERATURE, MODULE_TEMPERATURE, IRRADIATION,
# hour, dayofyear, month, lag_1, lag_4, rolling_mean_4
sample = pd.DataFrame([{
"AMBIENT_TEMPERATURE": 28.5,
"MODULE_TEMPERATURE": 42.1,
"IRRADIATION": 0.65,
"hour": 12,
"dayofyear": 155,
"month": 6,
"lag_1": 85000.0,
"lag_4": 78000.0,
"rolling_mean_4": 81500.0,
}])
prediction = model.predict(sample)
print(f"Predicted DC Power (next 15 min): {prediction[0]:,.0f} W")
```
---
## Limitations
- Trained on a single plant (Plant 1) over 34 days. Performance on other plants or
seasonal conditions outside May–June may degrade.
- Batch inference only — not designed for streaming real-time input.
- RandomForest has no explicit temporal memory; long-range dependencies (multi-hour
trends, weather fronts) are not captured.
- Sunrise/sunset RMSE is significantly higher than daytime-only RMSE due to steep
power ramps that lag features partially miss.
---
## Citation
If you use this model, please reference the source dataset:
```
Anikannal (2020). Solar Power Generation Data.
Kaggle. https://www.kaggle.com/datasets/anikannal/solar-power-generation-data
```
---
## Related
- **Deployed app**: https://solar-power-prediction-81xp.onrender.com
- **GitHub**: https://github.com/vedpawar2254/Solar-power-prediction