Как реализовать пользовательскую предиктивную модель
Glossary Item Box
Общие сведения
Сервис прогнозирования значений справочного поля использует методы статистического анализа для обучения на основании набора исторических данных и прогнозирования значений для новых записей.
Подробно эта функциональность описана в статье "Сервис машинного обучения".
Описание кейса
Реализовать автоматическое прогнозирование колонки [Категория] ([AccountCategory]) по значениям полей [Страна] ([Country]), [Количество сотрудников] ([EmployeesNumber]), [Отрасль] ([Industry]) во время сохранения записи контрагента. При этом должны выполняться следующие условия:
- Обучение модели необходимо формировать на основании записей о контрагентах за последние 90 дней.
- Переобучение производить каждые 30 дней.
- Допустимое значение точности прогнозирования для модели в целом — 0.6.
Для выполнения этого кейса необходимо удостовериться, что установлено корректное значение для системной настройки [API ключ облачных сервисов Creatio] ([Creatio cloud services API key], код CloudServicesAPIKey) и установлен адрес предиктивного сервиса в поле [Url сервиса] ([Service endpoint Url]) записи справочника [Задачи машинного обучения] ([ML problem types]).
Описанный кейс можно выполнить, используя UI-инструменты карточки (поля и фильтры), а также элемент бизнес-процесса «Прогнозирование данных». Примеры реализации прогнозирвоания с помощью встроенных возможностей системы описаны в разделе "Предиктивный анализ данных".
Алгоритм выполнения кейса
1. Обучение модели
Для обучения модели необходимо:
1. Добавить запись в справочник [Модели машинного обучения] (MLModel). Значения полей записи приведены в таблице 1.
Табл. 1. — Значения полей записи справочника MLModel
Поле | Значение |
---|---|
Название | Прогнозирование категории контрагента |
Задача машинного обучения | Прогнозирование справочного поля |
Идентификатор корневого объекта | Контрагент |
Нижний порог допустимого качества | 0.6 |
Частота переобучения | 30 |
Метаданные выборки для обучения |
{ "inputs": [ { "name": "CountryId", "type": "Lookup", "isRequired": true }, { "name": "EmployeesNumberId", "type": "Lookup", "isRequired": true }, { "name": "IndustryId", "type": "Lookup", "isRequired": true } ], "output": { "name": "AccountCategoryId", "type": "Lookup", "displayName": "AccountCategory" } } |
Выражение для выборки данных обучения |
new Select(userConnection) .Column("a", "Id").As("Id") .Column("a", "CountryId") .Column("a", "EmployeesNumberId") .Column("a", "IndustryId") .Column("a", "AccountCategoryId") .Column("c", "Name").As("AccountCategory") .From("Account").As("a") .InnerJoin("AccountCategory").As("c").On("c", "Id").IsEqual("a", "AccountCategoryId") .Where("a", "CreatedOn").IsGreater(Column.Parameter(DateTime.Now.AddDays(-90))) Примеры составления запросов можно посмотреть в статье "Составление запросов на выборку данных для модели машинного обучения". |
Флаг, включающий прогнозирование по модели | Отметить |
2. Выполнить действие [Запланировать задание обучения моделей] на странице справочника [Модели машинного обучения] (MLModel).
Далее необходимо подождать пока поле [Статус обработки моделей] пройдет цепочку значений DataTransfer, QueuedToTrain, Training, Done. Процесс ожидания может занять несколько часов (зависит от объема передаваемых данных и общей нагрузки на сервис предиктивных моделей).
2. Выполнение прогнозов
Для выполнения прогнозов необходимо:
1. В пользовательском пакете создать бизнес-процесс, для которого стартовым сигналом будет событие сохранения объекта [Контакт]. При этом нужно проверить заполненность значениями необходимых полей (рис. 1).
Рис. 1. — Свойства стартового сигнала
2. В бизнес-процесс добавить параметр-справочник MLModelId, ссылающийся на сущность [Модель машинного обучения]. В качестве значения нужно выбрать запись с созданной моделью [Прогнозирование категории Контрагента].
3. В бизнес-процесс добавить параметр-справочник RecordId, ссылающийся на сущность [Контрагент]. В качестве значения нужно выбрать ссылку на параметр RecordId элемента [Сигнал].
4. На диаграмму бизнес-процесса добавить элемент [Задание-сценарий] и добавить в него следующий исходный код:
var userConnection = Get<UserConnection>("UserConnection"); // Получение Id записи контрагента Guid entityId = Get<Guid>("RecordId"); // Получение id модели. var modelId = Get<Guid>("MLModelId"); var connectionArg = new ConstructorArgument("userConnection", userConnection); // Объект для вызова прогнозирования var predictor = ClassFactory.Get<MLEntityPredictor>(connectionArg); // Загрузка модели. // Вызов сервиса прогнозирования. Данные сохраняются в MLPrediction и в случае высокой вероятности прогноза в нужное поле контрагента. predictor.PredictEntityValueAndSaveResult(modelId, entityId); return true;
После сохранения и компиляции процесса для новых контрагентов будет выполнятся прогнозирование. Полученный прогноз будет отображаться на странице редактирования контрагента.
При такой реализации замедляется сохранение отдельной записи контрагента, поскольку вызов сервиса прогнозирования происходит около 2 с. Это может уменьшить производительность массовых операций с сохранением, например при импорте значений из Excel.