1 of 34

Прогнозирование мощности ветряных мельниц

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 Прогнозирование мощности ветряных электростанций

2 of 34

Бизнес контекст

*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 of 34

Встречайте еще одного участника!

“Коллеги, приветствую!

Меня зовут Карл, ведущий инженер Энергетической компании.

Одна из моих ответственностей - предоставление оперативных данных по мощностям ветряных установок

3

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

4 of 34

И видится что у Карла появилась новая задача!

“Была поставлена задача предсказывать мощность станций на 48 часов вперед для составления контрактов на поставу электроэнергии с клиентами. Давайте посмотрим, что у нас есть для решения задачи”

4

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

5 of 34

Формулировка задачи

?

?

?

!

!

=

?

Поставка энергии

Когда

?

!

Скорость ветра

Направление ветра

=

Исторические данные

!

=

SLA

48 часов

!

!

Вводные

?

Вопросы

Карл :-)

5

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

6 of 34

Возможный инженерный подход

Параметры ветра

Параметры станций

Входные данные

Внешние эффекты

Потери из-за местности

Влияние спутной струи

Формулы ветряных мельниц

Коэффициент мощности

(~КПД)

Мощность станции

Моделирование

@”.@#!

1. Нет учета особенностей каждой станции выявленных при эксплуатации

2. Не учитывается влияние “неизвестных эффектов”

6

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

7 of 34

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 Прогнозирование мощности ветряных электростанций

8 of 34

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 Прогнозирование мощности ветряных электростанций

9 of 34

Используемые решения

Линтеры

Форматер

Автоматизация исследований

Шаблонизация

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 Прогнозирование мощности ветряных электростанций

10 of 34

Используемые решения | конфигурация

Remote host

/invocations

/test

/docs

Remote host

pgAdmin

10

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

11 of 34

Менеджер виртуальных сред

Поэтому в качестве менеджера была выбрана 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 Прогнозирование мощности ветряных электростанций

12 of 34

Шаблонизация (.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 Прогнозирование мощности ветряных электростанций

13 of 34

Линтеры и форматеры

Локальная настройка линтеров,

использование TODO меток

Глобальная настройка линтеров и форматеров в VS Code

+Перенос параметров в pyproject.toml и tox.ini

13

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

14 of 34

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 Прогнозирование мощности ветряных электростанций

15 of 34

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 Прогнозирование мощности ветряных электростанций

16 of 34

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 Прогнозирование мощности ветряных электростанций

17 of 34

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 Прогнозирование мощности ветряных электростанций

18 of 34

Хранение

Первоначально использовал 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 Прогнозирование мощности ветряных электростанций

19 of 34

Автоматизация исследований

Использование sklearn.pipeline значительно упрощает создание модели и ее переиспользование

19

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

20 of 34

Автоматизация исследований

Использование sklearn.model_selection и вложенная кросс-валидация позволяет выбрать лучшие модели и точнее оценить их

Параметры

GridSearchCV

Лучшие параметры

Обучающий набор данных

Данные

Набор данных для тестирования

Обученная модель

Оценка модели

Лучшая модель

Обобщённая оценка модели

cross_validate

20

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

21 of 34

Автоматизация исследований (.gif)

Вместе с сохраненными артефактами можно поднять всю информацию о модели используя один сервис

21

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

22 of 34

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 Прогнозирование мощности ветряных электростанций

23 of 34

GitHib + CICD

Развертка GitHub Runner в Docker позволяет изолировать GitHub Runner и провести тесты независимо от ОС и ее настроек

23

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

24 of 34

GitHib + CICD

Pull Request + GitHub Actions позволяют удобно добавлять изменения в проект без загромождения веток и с автоматическим выполнением CI

24

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

25 of 34

Результаты

После обучения проверим результаты

*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 Прогнозирование мощности ветряных электростанций

26 of 34

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 Прогнозирование мощности ветряных электростанций

27 of 34

Возможности модели

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 Прогнозирование мощности ветряных электростанций

28 of 34

Используя данный результат мы можем…� … предоставить информацию для SLA

=

Поставка энергии

Когда

?

!

Скорость ветра

Направление ветра

=

Исторические данные

!

=

SLA

48 часов

!

!

Вводные

?

Вопросы

Карл :-)

!

?

+Оценка ошибки

!

Рез-ат

28

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

29 of 34

Планы

  • Запись предсказаний в базу данных

  • Доделать GitHub CI/CD

  • Развертка сервиса в облаке

  • Интегрирование CatBoost в scklearn.pipeline

  • При возможности создание front-end (Grafana/Dash/streamlit)

29

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

30 of 34

Все эти ребята ждут Ваших вопросов!

*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 Прогнозирование мощности ветряных электростанций

31 of 34

Кейс

Спасибо Вам за участие!

Emai: Sergei.A.P@yandex.com

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 Прогнозирование мощности ветряных электростанций

32 of 34

Пример реального решения задачи

Входные данные

Внешние эффекты

Потери из-за местности

Влияние спутной струи

Формулы ветряных мельниц

Коэффициент мощности

(~КПД)

Мощность станции

+Оптимизация производства

Coded

Machine Learning

32

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

33 of 34

Автоматизация исследований

Вместе с сохраненными артефактами можно поднять всю информацию о модели используя один сервис

33

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций

34 of 34

Используемые решения | конфигурация

Remote host

/invocations

/test

/docs

Remote host

pgAdmin

34

Parshin Sergei (@ParshinSA/SergeiAP@yandex.com) github.com/SergeiAP/windmill_power_prediction�

14.06.22 Прогнозирование мощности ветряных электростанций