Комплексный проект по прогнозированию энергопотребления и оптимизации работы умной электросети с использованием мультиагентной симуляции и ансамбля ML/DL-моделей.
Проект моделирует умную электросеть (Smart Grid), в которой:
- Агентная модель генерирует реалистичные данные энергопотребления для 141 потребителя (60 жилых, 80 коммерческих, 1 промышленный) и парка электромобилей (EV) за 365 дней (8760 часов).
- ML-пайплайн обучает 9 моделей прогнозирования потребления на 24 часа вперёд.
- Экономическая симуляция сравнивает модели в турнире: агенты используют прогнозы для оптимизации нагрузки (Load Shifting, Battery Arbitrage, V2G) и экономии на динамических тарифах.
| Компонент | Технологии |
|---|---|
| Классические ML-модели | XGBoost, CatBoost (MultiRMSE), Random Forest |
| Гиперпараметрическая оптимизация | Optuna (30 trials per model) |
| Нейросетевые модели | GRU, LSTM, Hybrid (CNN + LSTM + Multi-Head Attention) |
| Custom Loss | Асимметричная функция потерь (штраф 3:1 за недопрогноз) |
| Симуляция | Мультиагентная система с динамическим тарифообразованием (ToU + congestion pricing) и V2G |
smart_grid/
├── agents.py # Классы агентов, электромобилей и приборов (OOP)
├── utils.py # Общие утилиты: loss, метрики, архитектура сетей
├── read_data.py # Проверка статистик и распределений данных
├── apply_fixes.py # Скрипт форматирования и правок LaTeX-отчетов
├── fix.py # Вспомогательный скрипт автозамены
│
├── 01_data_generation.ipynb # Генерация данных агентной моделью + EDA
├── 02_feature_engineering.ipynb # Feature engineering (лаги, sin/cos, EMA, TE)
├── 03_classic_ml.ipynb # Базовые модели: XGBoost, CatBoost, RF
├── 04_classic_ml_optuna.ipynb # Optuna HPO для классических моделей
├── 05_gru.ipynb # Модель GRU с кастомным loss
├── 06_lstm.ipynb # Модель LSTM с кастомным loss
├── 07_hybrid.ipynb # Гибрид Advanced V2: CNN + LSTM + Attention
├── 08_simulation.ipynb # Финальный турнир всех 9 моделей
├── 09_all_metrics.ipynb # Сводный расчет классических и DL-метрик
├── src/
│ ├── 07-hybrid.ipynb # Гибридная модель (базовая kaggle-версия)
├── data/
│ ├── raw_data.csv # Сырые данные (8760 часов)
│ ├── features.csv # Датасет с 60+ признаками
│ ├── uml_classes.png/svg # UML-диаграмма классов
│ ├── uml_dataflow.png/svg # UML-диаграмма потока данных
│ └── *.png # 16 графиков (EDA, обучение, симуляция)
│
└── model_weights/
├── xgb_base.joblib # XGBoost (базовый)
├── catboost_base.joblib # CatBoost (базовый)
├── rf_base.joblib # Random Forest (базовый)
├── xgb_optuna.joblib # XGBoost (Optuna)
├── catboost_optuna.joblib # CatBoost (Optuna)
├── rf_optuna.joblib # Random Forest (Optuna)
├── gru_model.keras # GRU
├── lstm_model.keras # LSTM
├── hybrid_model.keras # Hybrid CNN+LSTM+Attention (Legacy/Advanced)
├── y_scaler_hybrid.joblib # Скейлер таргета
└── scaler_*.joblib # StandardScaler для каждой DL-модели
Для нейросетевых моделей используется подход Sequence-to-Vector: входное окно из 168 часов истории (одна неделя) → прогноз на следующие 24 часа. Данные разделены хронологически (80/20), лаги рассчитаны строго с shift(1), что исключает data leakage.
В ноутбуке 07_hybrid.ipynb обучается усовершенствованная архитектура нейросети на базе функции активации Swish, включающая мощную CNN с остаточными связями (residual blocks), глубокую RNN и двухуровневое внимание:
Input(168, N_features)
├── 1. Блок CNN с остаточными связями (L2 regularizer 5e-5, Dropout 0.3):
│ ├── Conv1D(64, k=7, padding='same', swish) → BatchNorm → Dropout(0.3)
│ ├── Conv1D(128, k=5, padding='same', swish) → BatchNorm ─┐ (residual: Conv1D(128, k=1) + Add + Swish) → Dropout(0.3)
│ ├── Conv1D(256, k=3, padding='same', swish) → BatchNorm ─┐ (residual: Conv1D(256, k=1) + Add + Swish) → Dropout(0.3)
│ └── MaxPooling1D(pool_size=2)
│
├── 2. Глубокий RNN блок (Stacked LSTM):
│ ├── LSTM(256, return_sequences=True) → LayerNorm → Dropout(0.3)
│ ├── LSTM(128, return_sequences=True) → LayerNorm → Dropout(0.3)
│ └── LSTM(64, return_sequences=True) → LayerNorm
│
├── 3. Двухуровневое внимание:
│ ├── Кросс-внимание (Cross-Attention) между RNN и CNN: MultiHeadAttention (8 голов, key_dim=64) + Residual + LayerNorm
│ └── Самовнимание (Self-Attention) внутри RNN: MultiHeadAttention (8 голов, key_dim=64) + Residual + LayerNorm
│
├── 4. Агрегация:
│ └── GlobalAveragePooling1D & GlobalMaxPooling1D → Concatenate
│
└── 5. Полносвязная голова:
├── Dense(256, swish) → BatchNorm → Dropout(0.3)
├── Dense(128, swish) → BatchNorm → Dropout(0.3)
├── Dense(64, swish)
└── Dense(24, linear) — Output: прогноз на 24 часа
Примечание: Базовая/legacy архитектура build_legacy_hybrid_model (на Mish, c Conv1D(64, k=3) → Conv1D(128, k=3) → LSTM(128) → MultiHeadAttention(32 dim)) сохранена в utils.py для обратной совместимости с весами Kaggle.
# Асимметричный loss: недопрогноз штрафуется в 3 раза сильнее
def asymmetric_profit_loss(y_true, y_pred):
error = y_true - y_pred
loss = tf.where(error > 0,
tf.square(error) * 3.0, # Недопрогноз (опасно)
tf.square(error) * 1.0) # Перепрогноз (менее критично)
return tf.reduce_mean(loss)- Циклические:
sin/cosдля часа, дня недели, дня года - Лаги: 1, 2, 4, 12, 24, 48, 168 часов
- Скользящие окна: mean, std, min, max, quantiles (3h–168h)
- EMA: экспоненциальные средние (12, 24, 168)
- Target Encoding:
day_type,season(fit только на train)
Агенты (SmartHouseholdAgent) используют прогнозы моделей для комплексной оптимизации потребления:
- Load Shifting — сдвиг гибких нагрузок (стиральная машина, посудомоечная и т.д.) на дешёвые часы.
- Battery Arbitrage — зарядка домашних аккумуляторов в ночной тариф, разрядка в пиковый.
- Smart EV Charging & V2G (Vehicle-to-Grid) — Умная зарядка парка электромобилей (поддерживается 12 реальных моделей: Tesla, VW, NIO, BYD, XPeng и др.). Автомобили агрессивно заряжаются при низких ценах и отдают энергию обратно в сеть (разряжаются) во время пиковых нагрузок для стабилизации сети.
Тарифообразование — динамическое: base rate × time-of-use (день/ночь) × load factor.
Проект решает две ключевые задачи: точное прогнозирование энергопотребления (ML/DL-регрессия) и минимизация затрат на энергоснабжение (экономическая мультиагентная симуляция).
Полный расчет метрик прогнозирования на тестовой выборке (выполняется в ноутбуке 09_all_metrics.ipynb) показывает следующие результаты (модели отсортированы по коэффициенту детерминации
| Модель | MAE | RMSE | MAPE, % | |
|---|---|---|---|---|
| CatBoost (Optuna) | 115 860.77 | 153 912.43 | 3.30% | 0.9754 |
| XGBoost (Optuna) | 111 816.89 | 157 490.70 | 3.16% | 0.9742 |
| Random Forest (Optuna) | 120 680.66 | 162 411.20 | 3.38% | 0.9726 |
| GRU (Custom Loss) | 119 488.48 | 167 063.73 | 3.49% | 0.9712 |
| XGBoost (Base) | 120 473.09 | 166 709.95 | 3.44% | 0.9711 |
| Random Forest (Base) | 134 436.90 | 176 996.81 | 3.78% | 0.9675 |
| Hybrid (CNN+LSTM+Attention) | 134 597,16 | 176 389,16 | 2.16% | 0.9639 |
| CatBoost (Base) | 139 597.68 | 189 388.39 | 3.97% | 0.9628 |
| LSTM (Custom Loss) | 129 264.49 | 203 418.00 | 3.68% | 0.9573 |
Примечание: Гибридная модель демонстрирует наилучшую относительную погрешность прогнозирования (MAPE = 2.16%).
В рамках 30-дневного симуляционного турнира (ноутбук 08_simulation.ipynb) агенты использовали прогнозы каждой модели для оптимизации нагрузок (Load Shifting, Battery Arbitrage, V2G) при динамических тарифах. Результаты по финансовой эффективности и проценту экономии:
| Модель | Базовая стоимость (Base price) | Оптимизированная стоимость (Smart price) | Экономия (Savings) | Экономия (%) |
|---|---|---|---|---|
| XGBoost (Base) | 19 556 211 ₽ | 14 660 805 ₽ | 4 895 406 ₽ | 25.03% |
| XGBoost (Optuna) | 19 559 893 ₽ | 15 187 200 ₽ | 4 372 693 ₽ | 22.36% |
| Hybrid | 19 598 584 ₽ | 15 217 158 ₽ | 4 381 426 ₽ | 22.36% |
| Random Forest (Optuna) | 19 594 028 ₽ | 15 250 594 ₽ | 4 343 434 ₽ | 22.17% |
| CatBoost (Optuna) | 19 566 768 ₽ | 15 258 565 ₽ | 4 308 203 ₽ | 22.02% |
| Random Forest (Base) | 19 581 376 ₽ | 15 256 935 ₽ | 4 324 441 ₽ | 22.08% |
| LSTM (Custom Loss) | 19 597 143 ₽ | 15 337 904 ₽ | 4 259 239 ₽ | 21.73% |
| CatBoost (Base) | 19 571 785 ₽ | 15 810 487 ₽ | 3 761 297 ₽ | 19.22% |
| GRU (Custom Loss) | 19 616 750 ₽ | 15 985 281 ₽ | 3 631 469 ₽ | 18.51% |
- Python 3.10+
- TensorFlow 2.x
- scikit-learn, XGBoost, CatBoost, Optuna
- pandas, numpy, matplotlib, seaborn, joblib
# 1. Генерация данных
jupyter notebook 01_data_generation.ipynb
# 2. Feature Engineering
jupyter notebook 02_feature_engineering.ipynb
# 3. Обучение моделей (можно параллельно)
jupyter notebook 03_classic_ml.ipynb
jupyter notebook 04_classic_ml_optuna.ipynb
jupyter notebook 05_gru.ipynb
jupyter notebook 06_lstm.ipynb
jupyter notebook 07_hybrid.ipynb
# 4. Сводная оценка точности
jupyter notebook 09_all_metrics.ipynb
# 5. Финальная симуляция умной сети
jupyter notebook 08_simulation.ipynb

