Пророк в 1С
прогнозирование экстраполяция предсказание временной ряд тренд Пророк Prophet Фейсбук Facebook Питон Python Докер Docker
Библиотека
Согласно статье Facebook Prophet, был разработан для прогнозирования большого числа различных бизнес-показателей и строит достаточно хорошие default'ные прогнозы. Кроме того, библиотека дает возможность, изменяя человеко-понятные параметры, улучшать прогноз и не требует от аналитиков глубоких знаний устройства предсказательных моделей.
Обновления
- Благодаря здравым наводкам stepa86, который тоже сейчас активно занимается прогнозированием. Решено было выложить исходники cf файла в свободный доступ. cf-файл уже получил дополнительную функциональность и готовится стать более дружелюбным для проведения тестов. Так что, если кому не безразлична эта тема, то репозиторий https://github.com/HardAndHeavy/eye-prophet-cf ждёт ваших пул реквестов.
Использование
- Загружаем последнюю версию собранного cf из репозитория. Файл cf сформировал на платформе 8.3.12.1469. А исходники выгруженные через EDT 1.8.4.9.
- Устанавливаем Docker. Если используется Windows 10 Pro сборки 14393 и выше, то Docker CE. Иначе — Docker Toolbox. [Замечание 1]
- Запускаем контейнер:
$ docker run -p 4000:80 hardandheavy/eye-prophet
$ docker pull hardandheavy/eye-prophet
Таким образом мы получаем веб-сервер с уже установленным всем необходимым окружением и самой библиотекой от Facebook. Из рисунка выше видно, что сервер располагается по адресу 192.168.99.100 на 4000 порту. [Замечание 2] -
Нюанс в методе ИмяСервера общего модуля _Пророк:
Функция ИмяСервера() Возврат "192.168.99.100:4000"; КонецФункции
Если контейнер будет запущен на другом IP или порту, то возвращаемое значение надо будет исправить на правильное.
- Прогнозирование заключается в передаче таблицы истории с колонками Дата и Факт в метод _Пророк.ПолучитьПрогноз. Который возвращает таблицу прогноза с колонками: Дата, Тренд и Прогноз. В предоставленной конфигурации запускаем обработку "Демо прогноз просмотра страницы wiki" и наслаждаемся прогнозом:
Все данные взяты из обучающего материала Facebook и полностью его повторяют.
Замечание
- Для тех, кто хочет узнать больше о Docker: Полное практическое руководство по Docker и конечно же Get Started.
- Об этой библиотеке я узнал из статьи на Хабре Предсказываем будущее с помощью библиотеки Facebook Prophet. Прочитал Quick Start. И реализовал веб-сервер, предварительно упаковав его в контейнер, чтобы можно было легко воспользоваться Пророком в 1С. Исходники можно найти здесь https://github.com/HardAndHeavy/eye-prophet
Скачать файлы
Наименование | Файл | Версия | Размер | |||
---|---|---|---|---|---|---|
Пророк в 1С:
.cf 50,21Kb
17.08.18
1
|
.cf | 50,21Kb | 1 | Скачать |
См. также
Специальные предложения
Предсказание рейтинга/загрузок это задача регрессии, а не прогнозирования временного ряда. Прогнозирование временного ряда это когда из всех данных есть только дата и число, когда как задача регрессии - по набору признаков получить некоторую цифру. Прогнозирование временного ряда можно свести к задаче регрессии ( когда дата распадается на признаки НомерГода, НомерМесяца, НомерНедели, НомерКватала, НомерСезона, НомерДня, ДеньНедели, ЭтоРабочийДень итп ). Когда кроме даты есть еще какие-либо заранее известные признаки - то регрессия даст более хороший вариант. Хотя в Пророке есть "Добавление регрессора" и механизм "Праздников".
Когда нужно спрогнозировать числа на период (продажи на несколько месяцев вперед или количество статей на инфостарте), то обычно с дополнительными признаками проблема - продажи может и будут зависеть от остатков на складах (или от новостей в индустрии, например, выход едт), но для этого их нужно знать в будущем, что так же сводится к задаче прогнозирования. Таким образом у нас остается только история.
Для предсказания популярности статьи лучше всего использовать подход "мешка слов" и линейную регрессию или Vowpal Wabbit.
[ЗанудаМод=выкл]
В основе лежит разделение на тренд, сезонности и вариации. Чтоб сезонность учитывалась корректно - нужно хотя бы 2 полных цикла. То есть, если есть недельная сезонность - нужно подать истории на 2 недели минимум. Если есть годовая сезонность - за 2 года минимум.
Для просто взять либо и построить прогноз - результаты очень хорошие у этого пророка.
Для промышленного использования могут быть ограничения- 1000 номенклатурных позиций будет обсчитываться минимум 5000 секунд, точность может быть по некоторым позициям хуже, чем другие подходы, типа простенькой регрессии, данные нужно предобрабатывать - чистить от выбросов, учитывать акции (Пророк это умеет, но текущая реализация еще нет), как нить изменить входные данные (Бокс-Кокс иногда очень хорошо улучшает точность, он в статье на хабре описан), ну и в конце нужно будет еще решить, а что же делать на основе этих данных.
Если сравнивать с самым "крутым алгоритмом по предсказанию временного ряда" SARIMA - этот намного проще и намного быстрее и требует меньше настроек гиперпараметров
Думаю можно всё распараллелить, но пока до этого руки не дошли. Т.е. веб-сервер должен держать... вот код 1С под это надо будет менять.
Предсказание рейтинга/загрузок это задача регрессии, а не прогнозирования временного ряда. Прогнозирование временного ряда это когда из всех данных есть только дата и число, когда как задача регрессии - по набору признаков получить некоторую цифру. Прогнозирование временного ряда можно свести к задаче регрессии ( когда дата распадается на признаки НомерГода, НомерМесяца, НомерНедели, НомерКватала, НомерСезона, НомерДня, ДеньНедели, ЭтоРабочийДень итп ). Когда кроме даты есть еще какие-либо заранее известные признаки - то регрессия даст более хороший вариант. Хотя в Пророке есть "Добавление регрессора" и механизм "Праздников".
Когда нужно спрогнозировать числа на период (продажи на несколько месяцев вперед или количество статей на инфостарте), то обычно с дополнительными признаками проблема - продажи может и будут зависеть от остатков на складах (или от новостей в индустрии, например, выход едт), но для этого их нужно знать в будущем, что так же сводится к задаче прогнозирования. Таким образом у нас остается только история.
Для предсказания популярности статьи лучше всего использовать подход "мешка слов" и линейную регрессию или Vowpal Wabbit.
[ЗанудаМод=выкл]
[2018-08-02 18:35:33 +0000] [6] [INFO] Starting gunicorn 19.9.0
[2018-08-02 18:35:34 +0000] [6] [INFO] Listening at:
[2018-08-02 18:35:34 +0000] [6] [INFO] Using worker: sync
[2018-08-02 18:35:34 +0000] [9] [INFO] Booting worker with pid: 9
INFO:matplotlib.font_manager:font search path ['/usr/local/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf', '/usr/local/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/afm', '/usr/local/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/pdfcorefonts']
INFO:matplotlib.font_manager:generated new fontManager
Это последняя строка в консоли Ubuntu server
Судя по предыдущим постам не хватает вывода:
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
INFO:werkzeug: * Running on
И подскажите как настроить докер что бы он был виден в локальной сети а не толькао на локальном хосте?
В общем, я воспринимаю его как чёрный ящик, который для меня даёт пока неплохие результаты, и я доволен.
Но без гиперпараметров, без добавления признаков (регрессия или нет, алгоритм позволяет, странно не воспользоваться). Следить за временным рядом без возможности внести корректировки в алгоритм расчёта прогноза особого смысла нет. Интересно-то как раз, что повлияло и насколько дополнительный признак добавляет точности в предсказание. А с подобной точностью и товаровед предскажет. :)
Можно хотя бы одну оценку точности прогноза вывести. Сразу будет видно, насколько полезен результат.
Не смотрел фейсбуковскую библиотеку, но наверняка там есть возможность.
Init signature: Prophet(growth='linear', changepoints=None, n_changepoints=25, changepoint_range=0.8, yearly_seasonality='auto', weekly_seasonality='auto', daily_seasonality='auto', holidays=None, seasonality_mode='additive', seasonality_prior_scale=10.0, holidays_prior_scale=10.0, changepoint_prior_scale=0.05, mcmc_samples=0, interval_width=0.8, uncertainty_samples=1000)
Docstring:
Prophet forecaster.
Parameters
----------
growth: String 'linear' or 'logistic' to specify a linear or logistic
trend.
changepoints: List of dates at which to include potential changepoints. If
not specified, potential changepoints are selected automatically.
n_changepoints: Number of potential changepoints to include. Not used
if input `changepoints` is supplied. If `changepoints` is not supplied,
then n_changepoints potential changepoints are selected uniformly from
the first `changepoint_range` proportion of the history.
changepoint_range: Proportion of history in which trend changepoints will
be estimated. Defaults to 0.8 for the first 80%. Not used if
`changepoints` is specified.
Not used if input `changepoints` is supplied.
yearly_seasonality: Fit yearly seasonality.
Can be 'auto', True, False, or a number of Fourier terms to generate.
weekly_seasonality: Fit weekly seasonality.
Can be 'auto', True, False, or a number of Fourier terms to generate.
daily_seasonality: Fit daily seasonality.
Can be 'auto', True, False, or a number of Fourier terms to generate.
holidays: pd.DataFrame with columns holiday (string) and ds (date type)
and optionally columns lower_window and upper_window which specify a
range of days around the date to be included as holidays.
lower_window=-2 will include 2 days prior to the date as holidays. Also
optionally can have a column prior_scale specifying the prior scale for
that holiday.
seasonality_mode: 'additive' (default) or 'multiplicative'.
seasonality_prior_scale: Parameter modulating the strength of the
seasonality model. Larger values allow the model to fit larger seasonal
fluctuations, smaller values dampen the seasonality. Can be specified
for individual seasonalities using add_seasonality.
holidays_prior_scale: Parameter modulating the strength of the holiday
components model, unless overridden in the holidays input.
changepoint_prior_scale: Parameter modulating the flexibility of the
automatic changepoint selection. Large values will allow many
changepoints, small values will allow few changepoints.
mcmc_samples: Integer, if greater than 0, will do full Bayesian inference
with the specified number of MCMC samples. If 0, will do MAP
estimation.
interval_width: Float, width of the uncertainty intervals provided
for the forecast. If mcmc_samples=0, this will be only the uncertainty
in the trend using the MAP estimate of the extrapolated generative
model. If mcmc.samples>0, this will be integrated over all model
parameters, which will include uncertainty in seasonality.
uncertainty_samples: Number of simulated draws used to estimate
uncertainty intervals.
ПоказатьИз тех, что у меня хоть как то повлияли на результат - принудительная установка сезонностей. Праздники я подсовывал, но чот они никак не повлияли на результат, а что добавить в качестве регрессоров я не смог придумать, поэтому не пробовал. Всех больше профита давала предобработка входных данных - чистка от выбросов, Бокс-Кокс и удаление интервалов, где случилась явная херня
Если есть знания/опыт в машинном обучении, есть нужный набор признаков и достаточная глубина истории - лучше использовать что-нибудь более мощное и быстрое. Вот пример предсказания аренды великов в зависимости от даты и погоды
тетрадка Юпитера:
видео:
В статье на хабре Пророк без настроек прогнозировал количество статей на хабре с MAPE 37.35% . Если же подтюнить вход преобразование Бокса-Кокаса, то MAPE 17%
У меня получались такие результаты MAPE на разных данных при планировании на месяцы вперед %: 3,4, 6, 6, 8, 9, 16, 18, 31, 34, 37, 38, 48, 50, 58
При прогнозировании по дням медиана MAPE была в лучшем случае 12%, а в среднем 20-50%. То есть результаты колебаются от "охренеть как точно" до "сойдет".
docker version
Client:
Version: 18.03.1-ce
API version: 1.37
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:12:48 2018
OS/Arch: windows/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.24)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:21:42 2018
OS/Arch: windows/amd64
Experimental: false
Дальше делаю и получаю
docker run -p 4000:80 hardandheavy/eye-prophet
Unable to find image 'hardandheavy/eye-prophet:latest' locally
latest: Pulling from hardandheavy/eye-prophet
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: image operating system "linux" cannot be used on this platform.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
что-то пошло не так...
Но это всегда можно переключить обратно нажав на правую кнопку мыши по значку и запустив Linux машину.
Для примера можно набрать
docker run hello-world
Эта команда должна всегда работать
docker run -p 4000:80 hardandheavy/eye-prophet
Unable to find image 'hardandheavy/eye-prophet:latest' locally
latest: Pulling from hardandheavy/eye-prophet
C:\Program Files\Docker\Docker\Resources\bin\docker.exe: image operating system "linux" cannot be used on this platform.
See 'C:\Program Files\Docker\Docker\Resources\bin\docker.exe run --help'.
PS C:\Users\domiu> docker run -p 4000:80 hardandheavy/eye-prophet
Unable to find image 'hardandheavy/eye-prophet:latest' locally
latest: Pulling from hardandheavy/eye-prophet
911c6d0c7995: Pull complete
01a7b783f4b1: Pull complete
fd42853239cf: Pull complete
9a8472db1c97: Pull complete
dc0e7e688ba4: Pull complete
c21395580328: Pull complete
38a300e1f9f7: Pull complete
43bd7163e513: Pull complete
7a30d9838573: Pull complete
d50a5d67d0c0: Pull complete
18c3d6fd8daa: Pull complete
03efc69dec8c: Pull complete
83d81bcc8bba: Pull complete
44f1896e92fc: Pull complete
Digest: sha256:1832652258fb0df6514835a22d4f092c1226efdbe0857a5435a1eae63cb4
Status: Downloaded newer image for hardandheavy/eye-prophet:latest
INFO:matplotlib.font_manager:font search path ['/usr/local/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf', '/usr/local/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/afm', '/usr/local/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/pdfcorefonts']
INFO:matplotlib.font_manager:generated new fontManager
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: Do not use the development server in a production environment.
Use a production WSGI server instead.
* Debug mode: off
INFO:werkzeug: * Running on
я так понимаю, что
типа все ок с docker
изменил
Функция ИмяСервера()
Возврат "localhost:4000";
КонецФункции
запускаю конфу
{ОбщийМодуль._Пророк.Модуль(150)}: Ошибка получения прогноза <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>
ВызватьИсключение(СообщениеПриОшибке + " " + Ответ.ПолучитьТелоКакСтроку());
После того, как понял, что для исследований некоторым будет сложен докер я решил опубликовать сервер на heroku
Несколько таких статей и видимо уже все поймут что пресловутое "машинное обучение" это что-то из разряда фантастики про "искусственный интеллект", а вполне конкретные библиотеки с удобным интерфейсом, которые вообще без проблем можно использовать в 1С.
Прогноз продаж на вторую половину 2018 года по данным 2017 и половины 2018
Не очень оно сходится... по прогнозу продажи к концу полугодия должны были приблизится к 20, а по факту не переползли за 15
Ради интереса попробую найти данные за последние 5 лет... Но интересно...
Так-то крутилок много, надо внедрять и крутить)
Если кто-либо сможет быстрее разобраться, и поделится, то я с удовольствием добавлю с вой проект.
Я в прогнозирование дилетант, так что не обессудьте. Добавить что не попробовал не могу.
Спасибо за замечание, думаю теперь не будет вопросов у Доржи. Никак не хотел на этом заработать, и всё старался сделать максимально публично.

Просмотры 13570
Загрузки 5
Комментарии 41
Создание 09.07.18 14:01
Обновление 16.07.18 15:49
№ Публикации 862671
Рубрики Статистические
Кому
Программист ,
Бизнес-аналитик
Тип файла Конфигурация (md, cf)
Платформа Платформа 1С v8.x (все механизмы)
Конфигурация Не имеет значения
Операционная система Не имеет значения
Страна Не имеет значения
Отрасль Не имеет значения
Налоги Не имеет значения
Вид учета Не имеет значения
Раздел учета Не имеет значения
Доступ к файлу Абонемент ($m)
Код открыт Да

