В предыдущих публикациях мы уже много говорили об искусственном интеллекте в целом, таком его разделе, как машинное обучение, и о его применении в различных задачах email-маркетинга. Были рассмотрены такие вопросы о фильтрации массовых email-рассылок:
- что такое машинное обучение и как его применять;
- какие существуют риски при таком подходе;
- как разработать алгоритм фильтрования пользователей на основе истории их предыдущей активности по рассылке;
- на основе разработанных алгоритмов описали систему ранжирования пользователей по прогнозируемой активности, и ряд других вопросов.
Пришло время поговорить подробно об алгоритмах фильтрации, которые мы разработали для ряда наших клиентов, показать, каких успехов мы достигли в этом направлении, какие реальные проблемы и трудности нам пришлось преодолевать.
Предварительные замечания
Следует отметить, что мы параллельно разрабатывали алгоритмы фильтрации пользователей для нескольких клиентов eSputnik. У каждого из них своя клиентская база, со своими особенностями. Поэтому нельзя единожды разработать алгоритм фильтрации на базе какой-то компании и потом просто перенести его на другие компании. Аналогичная ситуация наблюдается и для большинства других применений искусственного интеллекта в разных сферах человеческой деятельности.
В дальнейшем мы сосредоточимся на опыте разработки системы фильтрации для одного из наших клиентов - крупного украинского интернет-магазина. Компания ежедневно производит через систему eSputnik сразу несколько проморассылок на несколько категорий пользователей. Кроме того, есть дополнительные нерегулярные проморассылки и триггерные сообщения. Все регулярные рассылки можно разделить на несколько типов по времени отправки, для каждого типа установлено четкое время действия промоакции.
Для разделения подписчиков на активных и неактивных компания использует классическое правило: пользователь проявлял какую-либо активность по рассылкам компании за последние N дней. В данном случае N = 90 дней.
Первые шаги
Мы начали разработку алгоритмов фильтрации пользователей с простой тестовой модели. Мы выбрали одну из регулярных рассылок компании и ограничились историей поведения пользователей только в рамках этой рассылки. Нашей первой задачей было попробовать предсказать, откроет ли пользователь следующее письмо по выбранной рассылке компании, базируясь только на шести показателях, которые могут быть легко построены из сформированной истории активности пользователей:
- время жизни пользователя в рамках исследуемой рассылки;
- общее количество полученных писем по рассылке;
- частота открытия писем по последним 10 и 30 полученным письмам, а также за все время их получения;
- время до последнего прочтения какого-либо email-письма в рамках рассматриваемой рассылки.
Основной идеей в выборе именно таких метрик было перенести методики хорошо известного в аналитике RFM анализа на базу искусственного интеллекта.
Выше мы упоминали, что для каждой из рассылок компании существует четко регламентированное время действия промоакции. Исходя из этого, мы разделили все открытия на "релевантные" и "нерелевантные":
- Релевантные - это те, которые открыты до конца действия промоакции.
- Если пользователь прочел письмо после завершения акции - мы приравниваем письмо к неоткрытым.
Предварительный анализ показал, что в каждой конкретной рассылке пользователи, которые "открыли" / "не открыли" email-письмо хорошо разделяются по сформулированным выше показателям. Для примера мы приводим здесь два графика плотностей распределений таких показателей как частота открытия email-писем и время до последнего релевантного прочтения email-письма. Мы выбрали одну конкретную рассылку и посчитали эти показатели для каждого пользователя на момент рассылки с учетом последующего действия (было релевантное прочтение или нет).
Из первого графика четко видно, что плотность распределения частоты открытия писем для тех пользователей, которые не прочли письмо по данной конкретной рассылке имеет выделенный максимум в районе начала координат, тогда как для пользователей, которые прочли email, этот показатель размыт вдоль оси абсцисс.
Обратная картина наблюдается для плотности распределения времени до последнего релевантного прочтения. Здесь по шкале времени мы ограничились первыми 30 днями для лучшей визуализации существующей зависимости.
Мы надеялись, что именно искусственный интеллект разберется во всем этом и сможет выработать устойчивую предиктивную модель.
Нашей задачей было разработать алгоритм, который будет рассчитывать вероятность релевантного прочтения пользователем следующего письма по рассылке. Для разработки алгоритма классификации мы выбрали один из наиболее простых и базовых методов машинного обучения - логистическую регрессию.
Несмотря на простоту построенной модели, мы получили довольно приемлемые результаты, которые были взяты за основу для дальнейшего развития модели. Некоторые аспекты этого этапа работы были освещены в публикации "Data science на службе у email-маркетолога". Почти сразу же стало ясно, что выбранных шести метрик недостаточно для разработки действительно мощного алгоритма фильтрации, который будет учитывать основные паттерны поведения клиентской базы. Мы сосредоточились на таких направлениях:
- Разработка и внедрение в модель новых показателей, которые дополнительно описывают характер поведения пользователей по рассылке (переход по ссылкам, привлекательность email-писем для клиентов, зависимость от дня недели и домена, на который юзер получает письмо, и т.п.).
- Разработка и внедрение в модель показателей, которые оценивают активность пользователей данной компании по рассылкам других компаний, на которые они тоже подписаны и которые проводятся через систему eSputnik.
- Замена логистической регрессии на более мощные и современные алгоритмы машинного обучения.
Переменные, на которых работают наши алгоритмы
Не буду описывать все этапы разработки фильтра, остановимся только на финальном варианте, к которому мы пришли. Весь комплекс переменных, по которым алгоритм просчитывает вероятность потенциальной активности пользователей по рассылке, можно разбить на три большие группы.
1. Переменные общего содержания
- Домен пользователя. Для учета возможной зависимости показателя прочтения писем от домена электронной почты пользователей мы выделили 16 наиболее используемых доменов (gmail.com, ukr.net, mail.ru и т.д.), а все остальные объединили в одно значение "other". Таким образом, зависимость активности пользователей от домена в наших алгоритмах определяется одной номинативной переменной, которая принимает 17 возможных значений.
- День недели. Здесь все просто. Так как компания проводит свои рассылки регулярно (каждый день), то возможная зависимость от дня недели описывается одной номинативной переменной с семью значениями.
2. Переменные активности пользователей по рассылке
Это основная и самая обширная группа переменных. Так как компания проводит ежедневные рассылки, то для расчета всех показателей по этой группе мы ограничились историей активности пользователей за последние 4 месяца до дня использования алгоритма (точнее, за последние 120 дней).
К этой группе относятся:
- Показатели прочтения (open rate), перехода по ссылке (click rate) и переходов по отношению к открытиям (click to open rate). Для учета как последней активности пользователей по рассылке, так и активности за более длительные промежутки времени, мы рассчитываем все эти показатели за последние 3 дня, 7 дней, 30 дней, и 90 дней. Показатели прочтения и переходов по ссылке за последние 3 дня - это бинарные номинативные переменные, т.е. они принимают два возможных значения: "да", если было такое действие, и "нет" в противном случае. Соответственно, для этих случаев показатели переходов по отношению к прочтениям не рассматриваются. Все остальные переменные - количественные и находятся по стандартным формулам.
Выше было сказано, что все прочтения и переходы по ссылкам мы разделили на релевантные и нерелевантные. Исходя из этого, мы также рассчитываем все метрики из этой подгруппы отдельно по релевантным и нерелевантным действиям. Идея такого разделения состоит в том, что даже если какой-то пользователь совершил активное действие уже после окончания действия промоакции, все равно он был заинтересован в полученном письме. Следовательно, отбрасывание таких нерелевантных активных действий может привести к потере полезной информации о предыдущей активности пользователя.
Таким образом, подгруппа показателей прочтения, переходов по ссылкам и переходов по отношению к прочтениям по каждой рассылке включает 20 переменных.
- Время до последнего релевантного открытия (перехода по ссылке). Если пользователь не совершил ни одного активного действия по данной рассылке за последние 120 дней - этим показателям присваивается значение 120.
- Общее количество полученных писем по рассылке за последние 120 дней.
- Время с момента получения первого письма по рассылке за последние 120 дней.
Если компания осуществляет параллельно несколько разных рассылок (как в нашем случае), весь набор метрик рассчитывается для каждой из рассылок отдельно.
3. Переменные активности пользователей по рассылкам других компаний
Для учета возможного влияния активности пользователей компании по рассылкам других компаний, на которые они также подписаны, мы ввели в алгоритм несколько дополнительных переменных из этой группы.
- Получает ли пользователь рассылки от других компаний, которые проводятся через систему eSputnik. Это бинарная номинативная переменная ("да" или "нет").
- Время до последнего открытия (перехода по ссылке) по рассылкам других компаний. Если пользователь подписан на рассылки других компаний, то эти метрики рассчитываются аналогично соответствующим метрикам из предыдущей группы. В противном случае показатели принимают значение 120.
Из данного описания этих групп метрик непосредственно следует, что среди количественных переменных второй и третьей групп часть из них принимают возможные значения от 0 до 1, и вторая часть - от 0 до 120. Для того, чтобы привести количественные переменные к одной шкале, они все нормируются к диапазону [0; 1].
Несколько слов о выборе оптимального алгоритма машинного обучения
Наша первая модель базировалась на одном из простейших алгоритмов машинного обучения, которые применяются для задач классификации - логистической регрессии. Мы пробовали использовать также ряд других алгоритмов: регрессию Пуассона, "свободный лес", градиентный бустинг и др. В результате мы остановились на алгоритме экстремального градиентного бустинга над решающими деревьями. Этот алгоритм дал превосходство над остальными алгоритмами по точности классификации, а также ряду других преимуществ чисто технологического характера.
Здесь следует также отметить еще один нюанс. Данные, с которыми мы работаем в email-маркетинге, существенно несбалансированны. Это возникает вследствие незначительного процента прочтения (и, тем более, переходов по ссылке) по сравнению с количеством доставленных писем. Стандартные показатели прочтения email-писем по рассылкам не превышают 10%, а показатели перехода по ссылке обычно существенно ниже (несколько процентов).
Разработка алгоритмов машинного обучения на таких несбалансированных данных имеет ряд особенностей. Зачастую разработчики пытаются сбалансировать данные тем или иным методом, но в этом случае полученные вероятности возможных исходов будут существенно отличаться от реальных оценок. Мы в процессе разработки пытались получить максимально эффективный алгоритм, который будет оценивать реальные вероятности прочтения (переходов по ссылке) пользователем того или иного email-письма. Поэтому не проводили балансировок данных, а использовали внутренние возможности алгоритмов для улучшения его сходимости и т.п.
Разработанные алгоритмы: описание, эффективность, точность классификации и т.п.
На данный момент мы разработали три основных алгоритма классификации потенциальной активности пользователей по прочтениям email-писем (переходам по ссылке). Также для каждого из типов рассылок компании был разработан и оптимизирован свой алгоритм. Здесь у нас нет возможности описать весь этот комплекс, поэтому сосредоточим внимание только на одном из типов. По остальным мы получили примерно схожие результаты.
Алгоритм № 1. Прогнозируем потенциальные прочтения email-писем
Этот алгоритм является доработанной и существенно улучшенной версией нашей первой модели. Здесь мы пытаемся предсказать, прочтет ли пользователь следующее письмо по рассылке или нет и с какой вероятностью. В зависимости от выбора порогового значения этой вероятности, разное количество пользователей будет исключаться из рассылки.
Когда пользователь исключается из рассылки, имеется в виду, что на данный момент вероятность прочтения следующего email'а для данного пользователя ниже порогового значения. В группе исключенных пользователей также всегда будут те, кто прочли бы письмо (и, тем более, перешли по ссылке), если бы они его получили. Оценка количества таких пользователей - это важная задача, которая определяет эффективность алгоритма классификации, а также его точность.
Для нашего первого алгоритма мы получили такие данные.
На диаграмме показана зависимость потенциальных потерь по прочтениям и переходам по ссылке от объема пользователей, исключаемых из рассылки (от 10% до 40% всех активных пользователей, подписанных на рассылку).
Мы видим, что потенциальные потери по открытиям письма находятся в пределах от 0,4% до 3,2% всех потенциальных прочтений; тогда как для переходов по ссылке этот диапазон составляет от 0,3% до 2,9%.
Для сравнения здесь уместно привести аналогичные данные для нашей стартовой, базовой модели.
Мы видим, что за счет существенного расширения количества переменных, на которых работает наша модель, а также изменения самого алгоритма машинного обучения с логистической регрессии на более мощный алгоритм экстремального градиентного бустинга удалось весьма существенно снизить потенциальные потери по прочтениям и переходам по ссылке.
Полученный финальный результат не так уж и плох. Отбрасывая, например, 40% всех пользователей, и потряв по прочтениям и переходам по ссылке около 3%, получаем прирост по таким показателям как open rate и click rate более чем на 60%. Но все же мы попробовали улучшить полученный результат, перейдя от прогнозирования открытий к прогнозированию переходов по ссылкам.
Алгоритм № 2. Прогнозируем потенциальные клики
Отличие этой модели от предыдущей - только в другой переменной отклика ("перешел / не перешел" вместо "открыл / не открыл"). Весь остальной комплекс переменных, описанный ранее, остается тем же. Казалось бы, что может измениться в результате? Тем не менее, полученный результат был иным.
Как видно из диаграммы, потенциальные потери по кликам сократились в два раза по сравнению с предыдущей моделью, но при этом потери по открытиям также резко выросли (в 2-3 раза).
Этот результат можно объяснить так. Среди всех пользователей, подписанных на рассылку, есть часть людей, которые относительно часто читают полученные письма по рассылке, но, при этом очень редко кликают по ссылкам. Очевидно, что для таких пользователей первый алгоритм выдает высокую вероятность прочтения следующего письма и, следовательно, они не попадают в группу, которая рекомендуется к исключению из рассылки. Второй же алгоритм таких пользователей пропускает.
Несмотря на очень высокую точность в классификации кликов, мы все же не можем использовать этот алгоритм из-за высоких прогнозируемых потерь по прочтениям. Да, в предыдущей истории активности пользователей подписчики из выделенной группы не проявляли особой активности по переходам по ссылкам, но нет никакой гарантии, что этот паттерн поведения резко не изменится в будущем, что может привести к дополнительным, неучтенным потерям по кликам.
В любом случае, на этом этапе разработки стало ясно, что точность классификации кликов может быть существенно улучшена по сравнению с моделью № 1, но при этом не теряя существенно в точности по прочтениям. Решением задачи стал алгоритм, который объединил в себе первые два.
Алгоритм № 3. Прогнозируем потенциальную активность пользователей
Отличие этой модели от первых двух в другой переменной отклика. Теперь вместо двух возможных исходов мы будем прогнозировать три:
- пользователь не открыл полученный email;
- пользователь открыл email, но не совершил перехода по ссылке;
- пользователь перешел по ссылке.
Таким образом, мы перешли от бинарной классификационной задачи к трехклассовой. На выходе такой алгоритм будет выдавать три значения прогнозируемых вероятностей возможных исходов. Эти вероятности связаны одним дополнительным условием: их сумма должна быть обязательно равна 1. Это означает, что одно из полученных значений вероятностей полностью определяется двумя другими (для N-классовой классификационной задачи любые N-1 полученных значений вероятностей будут независимыми, оставшееся N-е значение находится из сформулированного выше условия).
В случае бинарной классификации мы отталкивались от вероятности того, что пользователь не прочтет очередное письмо по рассылке (алгоритм № 1), или не перейдет по ссылке (алгоритм № 2). Выбором порогового значения этой вероятности мы регулировали количество пользователей, рекомендуемых к исключению из рассылки, потенциальные потери по открытиям и переходам и т.п.
Теперь же у нас есть возможность выбрать два разных значения вероятностей, и, соответственно, определить два разных пороговых значения. Комбинируя различные их значения, мы получаем дополнительную гибкость в регулировке всех описанных выше показателей.
Проверка показала, что наиболее оптимально выбрать в качестве базовых вероятности первого (пользователь не совершил активных действий по письму) и третьего (пользователь перешел по ссылке) исходов. По отдельности каждая из этих вероятностей дает примерно те же результаты, которые были описаны в разделах "Алгоритм № 1 ..." и "Алгоритм № 2 ...". Комбинируя, мы можем добиться различных промежуточных результатов.
Напомним, что нашей целью было снизить потенциальные потери по кликам по сравнению с первой моделью, но не теряя при этом значительно в открытиях. Мы остановились на таком варианте.
Как видим, реально удалось снизить потери по кликам, потери по открытиям при этом выросли не так уж и значительно (по сравнению с моделью № 1). В целом наблюдается согласованный рост этих двух показателей.
Для общности полученной картины мы также приводим данные о росте показателей прочтения и переходов по ссылке в случае использования нашей последней модели в качестве фильтра.
Последние две диаграммы дают комплексную картину возможных выиграшей и потерь при применении алгоритмов машинного обучения в качестве фильтров массовых email-рассылок.
Выводы
Целью этой статьи было описать накопленный опыт в разработке систем фильтрации пользователей по потенциальной активности в прочтениях email-писем (переходам по ссылкам). Начинали мы с очень простых моделей бинарной классификации, которые работали всего на нескольких показателях. Последние наши модели включают до сотни различных метрик, прогнозируют сразу несколько возможных исходов, гибки в настройке и т.д.
Несмотря на все это, мы планируем и в дальнейшем развивать и улучшать разработанные алгоритмы. Ведь еще так много можно сделать в этом направлении: ввести в модель ряд новых групп переменных, которые будут характеризовать покупательскую активность пользователей (как в классическом RFM анализе) и контент полученных писем, добавить новые значения в переменную отклика, попробовать применить нейросетевые технологии. По мере продвижения в этом направлении мы будем информировать заинтересованных читателей о достигнутых результатах в наших последующих публикациях.