Часть 1 Автозаполнение
Автор Элизафина Сисванто, специалист по обработке и анализу данных @ Tiket.com
Всякий раз, когда мы хотим путешествовать, первое, что нам нужно, это пункт назначения, куда мы хотим отправиться.
Как OTA, «Destination» также является первой дверью для каждого туристического продукта на Tiket.com. Так, например, чтобы забронировать отель, сначала пользователю нужно будет указать пункт назначения, дату заезда и выезда, а также количество номеров и гостей.
Поскольку место назначения имеет важное значение, мы хотим убедиться, что предоставляем пользователю наилучшие возможности при вводе пункта назначения, в том числе:
- Как создать наиболее релевантный элемент в автозаполнении пункта назначения?
- И как мы можем также уменьшить количество набора текста?
Ответ, конечно же, с использованием машинного обучения, особенно с использованием техники обучения ранжированию (LTR). Мы объясним, как мы можем создать модель машинного обучения, которая может повысить качество результатов ранжирования автозаполнения на +-4% до 7,5%, в зависимости от длины запроса, по сравнению с моделью машинного обучения без использования. Мы разделим процесс на две фазы, а именно фазу эксперимента и фазу реализации.
Этап эксперимента
Фаза эксперимента больше сосредоточена на том, как мы строим нашу модель LTR.
Нашим источником данных является историческая информация о событии автозаполнения пользователя, которая включает в себя: учетную запись пользователя, дату и время события, тип пользователя, список элементов, которые пользователь видит в окне предложения автозаполнения, и, наконец, какой элемент выбрал пользователь.
Следующий шаг, из нашего источника данных, нам нужно определить, как мы будем группировать наши выходные данные и ранжировать; в нашем случае мы устанавливаем группу как тип пользователя (запрос). Затем мы создадим нашу оценку релевантности, которая рассчитывается на основе того, как часто элемент выбирается среди других элементов в одном запросе. Вот некоторые из примеров:
Функции, которые мы использовали в этом эксперименте, можно разделить на три типа функций:
- Характеристики запроса: извлекаются из текста запроса, например, длина запроса и количество слов запроса.
- Характеристики предмета: извлекаются из сведений об элементе, в основном связанных с тем, насколько популярен предмет в течение определенного периода времени, типом предмета, будь то отель, местоположение или достопримечательность (POI).
- Функции подобия: чтобы зафиксировать сходство между запросом и элементом. Для этих функций мы в основном используем функции ElasticSearch, такие как «match».
Следующие шаги представляют собой обычный эксперимент по моделированию, разделение данных, выбор признаков и настройку гиперпараметров. Мы используем XGBoostRanker в качестве алгоритма машинного обучения и NDCG в качестве основного показателя оценки. Нашей лучшей модели удалось получить 94 % по NDCG@3.
Фаза реализации
Наша система автозаполнения для отелей построена на ElasticSearch. Наш документ ElasticSearch содержит информацию о миллионах элементов, включая все отели, местоположения и POI. Мы ежедневно обновляем нашу документацию по товарам, чтобы убедиться, что у нас есть последние обновления популярных функций предметов.
Для реализации модели мы запускаем нашу модель XGBoostRanker с помощью подключаемого модуля LTR, доступного в ElasticSearch. Невозможно использовать и прогнозировать миллионы элементов с помощью модели XGBoostRanker, поскольку это приводит к значительному времени отклика, которое мы не можем себе позволить.
Как видно на приведенной выше блок-схеме, чтобы убедиться, что наше время отклика все еще находится в пределах SLA, мы разделили процесс на две части:
- Фильтрация базы правил
В этой части мы используем несколько правил, чтобы значительно сократить количество элементов, релевантных пользовательскому входному запросу. Например, если пользователь ищет «ba», мы получим только 50 самых популярных элементов, которые больше всего похожи на «ba», используя правила соответствия сходства.
2. Предсказание модели
Затем мы переоцениваем 50 лучших результатов первого шага, используя предсказание модели плагина LTR, и получаем окончательные 10 лучших результатов, которые будут показаны пользователям.
С помощью этой реализации ранжировщика XGBoost мы можем улучшить наш результат ранжирования по сравнению с использованием только фильтров на основе правил. Количество нажатий перед тем, как пользователь, наконец, выберет элемент, также уменьшилось с трех до двух раз.
Что дальше?
Конечно, мы все еще работаем над улучшением нашей модели автозаполнения, добавляя более сложные функции, а также делая модель более персонализированной для каждого пользователя.
ССЫЛКИ:
[1] https://en.wikipedia.org/wiki/Learning_to_rank
[2] https://elasticsearch-learning-to-rank.readthedocs.io/en/latest/
[3] https://en.wikipedia.org/wiki/Discounted_cumulative_gain