Как реализовать пользовательскую предиктивную модель
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.