Прогнозирование мощности ветряных мельниц
Sergei PARSHIN
Data Scientist | 📍 Moscow, Russia�GitHub: github.com/SergeiAP/windmill_power_prediction�Telegram: @ParshinSA�Case: https://datascience.total.com/en/challenge/18/details�
Кейс
1
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Бизнес контекст
*Pics resource: https://towardsdatascience.com/from-business-question-to-data-science-task-55a49f471a0c
В первую очередь, давайте поймем задачу и применимость DS
2
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Встречайте еще одного участника!
“Коллеги, приветствую!
Меня зовут Карл, ведущий инженер Энергетической компании.
Одна из моих ответственностей - предоставление оперативных данных по мощностям ветряных установок”
3
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
И видится что у Карла появилась новая задача!
“Была поставлена задача предсказывать мощность станций на 48 часов вперед для составления контрактов на поставу электроэнергии с клиентами. Давайте посмотрим, что у нас есть для решения задачи”
4
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Формулировка задачи
?
?
?
!
!
=
?
Поставка энергии
Когда
?
!
Скорость ветра
Направление ветра
=
Исторические данные
!
=
SLA
48 часов
!
!
Вводные
?
Вопросы
Карл :-)
5
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Возможный инженерный подход
Параметры ветра
Параметры станций
Входные данные
Внешние эффекты
Потери из-за местности
Влияние спутной струи
Формулы ветряных мельниц
Коэффициент мощности
(~КПД)
Мощность станции
Моделирование
@”.@#!
1. Нет учета особенностей каждой станции выявленных при эксплуатации
2. Не учитывается влияние “неизвестных эффектов”
6
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Data Science контекст
Теперь создадим стек для обучения модели
*Pics resource: https://towardsdatascience.com/from-business-question-to-data-science-task-55a49f471a0c
7
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Data Science задача
Цель: предсказать выходную мощность ветряных электростанций на 48 часов вперед имея 4 источника прогноза ветра
Данные: скорость ветра, направление ветра каждый час, id электростанции и выходная мощность за последнее время
KPI: минимизирование Mean Absolute Error
???
8
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Используемые решения
Линтеры
Форматер
Автоматизация исследований
Шаблонизация
ABC
Abstract Base Classes*
Code-style
config.yml
Менеджер виртуальных сред
Виртуализация
Хранение
API
DAG
Git + CICD
9
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Используемые решения | конфигурация
4-ый конфигурационный сценарий MLFlow c API для cервиса
Remote host
/invocations
/test
/docs
Remote host
pgAdmin
10
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Менеджер виртуальных сред
Поэтому в качестве менеджера была выбрана conda, conda env файл для API был создан на основе генерируемых MLFlow файлов
$conda config --set ssl_verify no
$pip config set global.trusted-host "pypi.org files.pythonhosted.org pypi.python.orп \
raw.githubusercontent.com github.com"
Предполагалось использование Poetry, но была сменена рабочая станция и…
На основной рабочей станции решить проблему не удалось для Poetry (без радикальных мер), но удалось для conda и pip используя следующие команды:
Впоследствии SSLCertVerificationError давала о себе знать в других сервисах, поэтому вы увидите ряд “дополнительных переменных” в коде
11
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Шаблонизация (.gif)*
Отредактированный под задачу Cookiecutter Data Science шаблон
Добавленные элементы:
1. API в /src/app
2. Артефакты модели в /models
3. Примеры запросов в /sample_request
4. Предварительный анализ модели (corr matrix, boxplots, feature importances) в /reports/figure/
*Ряд слайдов содержат воспроизводимую .gif
12
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Линтеры и форматеры
Локальная настройка линтеров,
использование TODO меток
Глобальная настройка линтеров и форматеров в VS Code
+Перенос параметров в pyproject.toml и tox.ini
13
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Code-style (ABC на примере /src/features, .gif)
ABC
Abstract Base Classes*
Создана мини-лаборатория по генерации признаков и простому добавлению новых способов их обработки сохраняя общий workflow
В config выбираются необходимые признаки и их комбинации из “детей” Feature and MathOperation, затем FeatureCreator на основе данных создает их
14
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Code-style (config.yml)
config.yml
Большинство шагов в dvc.yml имеют регулируемые параметры указанные в config.yml для максимального упрощения воспроизводимости экспериментов
Указаны конфигурируемые параметры шага предварительного анализа и исследование “ценности” признаков
15
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
DAG
merge_data
aggregate_weather
clip_data
create_features
split_train_predict
plot_exploratory
plot_feature_importances
explore_train_model
predict_model
Данный workflow позволяет от и до воспроизводить этапы DS с сохранением исследовательской части и отслеживанием параметров в config.yml
В проекте много датасетов требующих объединения
Для одной сущности существует 4 предсказания ветра, поэтому были интегрированы различные способы их обработки
Воспроизводят артефакты
16
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
DAG step (на примере шага explore_train_model)
<- Использование и отслеживание
параметров из config.yml
<- Метрики для отслеживания DVC
<- Графики для отслеживания DVC
Удобно оперативно сравнивать метрики в командной строке. Графики не так удобны в применении из-за ограниченного функционала DVC.
17
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Хранение
Первоначально использовал Yandex Cloud S3
Далее перешел на MINIO (хотел протестировать + многократные загрузки/выгрузки)
<-MLFlow папка
<-DVC папка
Решение на Postgre* как СУБД и minio как S3
*Также есть проект по созданию и развертыванию БД (автоматизированный через команды в Makefile)
18
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Автоматизация исследований
Использование sklearn.pipeline значительно упрощает создание модели и ее переиспользование
19
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Автоматизация исследований
Использование sklearn.model_selection и вложенная кросс-валидация позволяет выбрать лучшие модели и точнее оценить их
Параметры
GridSearchCV
Лучшие параметры
Обучающий набор данных
Данные
Набор данных для тестирования
Обученная модель
Оценка модели
Лучшая модель
Обобщённая оценка модели
cross_validate
20
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Автоматизация исследований (.gif)
Вместе с сохраненными артефактами можно поднять всю информацию о модели используя один сервис
21
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
GitHib + CICD (.gif)
В рамках теста попробовал функционал GitHub (ранее пользовался GtiLab CI CD)
Для хранения параметров подключения к MLFlow/S3 использовался GitHub Secrets
В дальнейшем переход на GitHub Runner в Docker
22
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
GitHib + CICD
Развертка GitHub Runner в Docker позволяет изолировать GitHub Runner и провести тесты независимо от ОС и ее настроек
23
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
GitHib + CICD
Pull Request + GitHub Actions позволяют удобно добавлять изменения в проект без загромождения веток и с автоматическим выполнением CI
24
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Результаты
После обучения проверим результаты
*Pics resource: https://towardsdatascience.com/from-business-question-to-data-science-task-55a49f471a0c
25
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
API (.gif)
Тестирование может быть осуществлено как в Postman, так и по {your_uri}/docs пути. Команды и данные в проекте в ./sample_request.
Основные методы:
{your_uri}/invocations
{your_uri}/test
{your_uri}/docs
{your_uri}/redoc
26
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Возможности модели
Dec 26, 2010
Dec 27
Dec 28
Dec 29
Dec 30
0
0.8
0.6
0.4
0.2
Мощность
Лин. модель
Случайный лес
Факт
95% confidence
Anomalies
0
5
10
15
20
25
30
Частота [%]
0
0.1
0.2
0.3
0.4
0.5
В 32% случаев ошибка = 0.05
В 3.5% случаев ошибка = 0.25
Ошибка
0.5
0.48 ±0.11
0.43
48h
Текущий
день
Мощность ветряных мельниц может быть спрогнозирована на 48 часов наперед с точностью ±0.11 в 95% случаев
27
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Используя данный результат мы можем…� … предоставить информацию для SLA
=
Поставка энергии
Когда
?
!
Скорость ветра
Направление ветра
=
Исторические данные
!
=
SLA
48 часов
!
!
Вводные
?
Вопросы
Карл :-)
!
?
+Оценка ошибки
!
Рез-ат
28
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Планы
29
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Все эти ребята ждут Ваших вопросов!
*Pics resource: https://towardsdatascience.com/from-business-question-to-data-science-task-55a49f471a0c
Можете давать комментарии прямо в google презентации
30
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Кейс
Спасибо Вам за участие!
Telegram: @ParshinSA
Repo: https:\\github.com/SergeiAP/windmill_power_prediction
31
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Пример реального решения задачи
Входные данные
Внешние эффекты
Потери из-за местности
Влияние спутной струи
Формулы ветряных мельниц
Коэффициент мощности
(~КПД)
Мощность станции
+Оптимизация производства
Coded
Machine Learning
32
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Автоматизация исследований
Вместе с сохраненными артефактами можно поднять всю информацию о модели используя один сервис
33
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций
Используемые решения | конфигурация
4-ый конфигурационный сценарий MLFlow c API для cервиса
Remote host
/invocations
/test
/docs
Remote host
pgAdmin
34
Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�
14.06.22 Прогнозирование мощности ветряных электростанций