Прогнозирование и анализ ликвидности рекламы в объявлениях
Платформа, подобная OLX, которая объединяет покупателей и продавцов в более чем 40 странах, сталкивается с множеством проблем, которые в некоторой степени похожи, но также несколько отличаются от онлайн-торговли. Одна из этих проблем связана с пользовательским интерфейсом при навигации по платформе и показываемыми им рекомендациями, результатами поиска и т. Д. В типичных розничных условиях запасы относительно стабильны, тогда как в нашем случае каждый товар, предлагаемый для продажи потенциально новый, и у нас их много миллионов в любое время, что усугубляет проблемы холодного старта и длинного хвоста, с которыми сталкивается любая система рекомендаций.
В рамках решения, обеспечивающего удобную навигацию и просмотр пользователей, полезно иметь точную оценку того, было ли уже продано конкретное объявление, чтобы мы не отображали его снова в рекомендациях или результатах поиска. Это проблема вероятностного прогнозирования временных рядов. Еще один важный аспект, связанный с предыдущим случаем, - это определение того, что делает одни рекламные объявления более ликвидными (легко продаваемыми), чем другие. В этом конкретном случае понимание того, как модель принимает решения, действительно важно, поскольку результат может быть предоставлен продавцам для повышения ликвидности их рекламы. Напоминаем, что мы сосредоточимся на этой конкретной задаче прогнозирования ликвидности, прогнозируя, будет ли предмет продан через 15 дней после его входа в систему, и мы будем использовать XGboost и eli5 для моделирования и объяснения прогнозов соответственно.
XGboost - хорошо известная библиотека для «повышения», процесса итеративного добавления моделей в ансамбль моделей, нацеленных на оставшуюся ошибку (псевдо-остатки). Эти «недельные ученики» являются простыми моделями и способны самостоятельно справляться только с определенными частями проблемного пространства, но могут значительно снизить систематическую ошибку при одновременном контроле дисперсии (давая хорошую модель в процессе) благодаря итеративному подходу подгонки, применяемому в построение ансамбля такого типа. Данные, которые у нас есть для решения этой проблемы, включают текстовые данные (заголовок и текстовое описание исходной рекламы, а также любые взаимодействия в чате продавца и потенциальных покупателей), а также категориальные и числовые данные (категория рекламы, бренд модель товара, цена, количество взаимодействий между покупателями и продавцами на каждый день после входа и т. д.). Выборка данных, которую мы здесь используем, представляет собой относительно небольшую часть данных только по некоторым странам и категориям, поэтому во многих ее свойствах она не репрезентативна для всей коллекции элементов. Тем не менее, давайте начнем с некоторой простой обработки данных.
Гистограмма дня продажи товара показана выше. Мы легко можем видеть, что большинство товаров продается в первые дни после размещения соответствующей рекламы, но значительные продажи все еще происходят и через месяц.
Что касается дня добавления рекламы на платформу, мы видим, что пик приходится на выходные, но в другие дни примерно на том же уровне. Наконец, что касается часа, в который реклама добавляется на платформу, на рисунке ниже мы можем видеть, что пик приходится на обеденное время, а второй пик - после рабочего времени.
Один из способов зафиксировать более сложные отношения - использовать функцию парного графика библиотеки seaborn. В этом случае мы получим комбинации диаграмм рассеяния для выбранных столбцов, в то время как на первичной диагонали мы можем построить что-то другое, например соответствующие одномерные распределения. Мы видим, что количество взаимодействий покупателей в первый день является надежным предиктором того, будет ли товар продан рано или поздно. Мы также можем видеть, что идентификатор категории также является очень важным предиктором, поскольку некоторые категории в целом имеют тенденцию быть гораздо более ликвидными, чем другие.
Теперь, когда мы закончили с основным изменением данных, мы можем приступить к созданию модели, используя библиотеку XGboost. Используя структуру оптимизации гиперпараметров, мы можем найти гиперпараметры, которые лучше всего подходят для этих данных. Поскольку нас также интересует выходная уверенность самого прогноза, обычно рекомендуется использовать значение min_child_weight, равное или большее 10 (при условии, что мы не теряем в прогнозируемой производительности), поскольку вероятности будут иметь тенденцию быть более откалиброванным.
Ранжирование характеристик модели XGboost - это первый шаг к пониманию того, какую информацию модель использует для принятия решений. Хотя ранжирование функций из древовидных ансамблей может быть смещенным (отдавая предпочтение, например, непрерывным или категориальным функциям со многими уровнями по сравнению с двоичными или категориальными функциями с несколькими уровнями), и, кроме того, если функции сильно коррелированы, эффект может быть разделен между ними неоднородным образом, это уже хороший показатель для многих целей. Однако ранжирование функций - это свойство модели и набора данных, а мы хотим понять, как принимаются решения на уровне каждой отдельной выборки.
Для многих типов моделей (включая ансамбли деревьев, подобные той, которую мы использовали здесь), это возможно с помощью специальных библиотек, которые объясняют, что модель делает во время прогнозирования. Используя eli5, мы получаем объяснение того, как этот экземпляр обрабатывался внутри модели, вместе с большинством функций, которые оказали наиболее важное положительное и отрицательное влияние на этот конкретный образец. Для лучшего понимания, L1 - это категория продукта верхнего уровня (используется для группировки похожих продуктов), num_seller_message_day - это количество сообщений продавца, отправленных до данного дня, а number_buyers_day - это общее количество покупателей, проявивших интерес до данного дня.
Мы интерпретируем вывод так, что для этого конкретного случая (ad) функции, которые сыграли важную роль в принятии решения о том, является ли он ликвидным или нет, перечислены здесь в порядке убывания вклада.
Как мы видим, образец был классифицирован как неликвидный, и были некоторые отклонения от свойств текста (длина описания и т. Д.), Активности продавца (возможно, он не ответил покупателям?), А также цены товара, который мы можем использовать, чтобы дать продавцу рекомендации по улучшению рекламы. Особая благодарность Кристиану Мартинесу, Акашу Гупте и Кармине Паолино за разработку и улучшение различных версий модели прогнозирования базовой ликвидности.