Прогнозирование цены с использованием регрессии.

Введение

Можно с уверенностью сказать, что искусственный интеллект (ИИ) меняет каждый аспект современной жизни. От наших смартфонов до здравоохранения, безопасности и любой другой отрасли ИИ медленно, но верно становится обычной частью современной среды, глубоко укорененной во всем, что мы делаем. Розничная торговля не является исключением, вступая в новую эру предиктивной коммерции.

В этом посте мы сосредоточимся на том, как можно использовать методы машинного обучения, чтобы помочь в сложном аспекте розничной торговли — ценообразовании.

Бизнес-проблема

В последние годы рынок электронной коммерции значительно вырос и продолжает расти очень устойчивыми темпами в большинстве стран. Людям становится удобнее сидеть дома и заказывать товары, начиная от электроники и заканчивая продуктами.

Рынок электронной коммерции в Индии также будет расти в среднем на 30%, а валовая стоимость товаров достигнет 200 млрд долларов к 2026 году, а проникновение на рынок составит 12% по сравнению с 2% в настоящее время. Этот рост онлайн-рынков также вызвал интерес к созданию систем машинного обучения, которые помогают прогнозировать цены как на новые, так и на бывшие в употреблении продукты, прогнозировать продажи и т. д. Точный прогноз цен может дать компаниям преимущество над конкурентами с точки зрения продаж и рентабельности инвестиций.

Но может быть трудно понять, сколько что-то действительно стоит. Небольшие детали могут означать большие различия в цене. Например, один из этих свитеров стоил 335 долларов, а другой — 9,99 долларов. Можете ли вы угадать, какой из них?

Ценообразование продуктов становится еще сложнее в масштабе, учитывая, сколько продуктов продается в Интернете. Одежда имеет сильные сезонные ценовые тенденции и сильно зависит от торговых марок, в то время как цены на электронику колеблются в зависимости от характеристик продукта.

Mercari, крупнейшее в Японии приложение для покупок, созданное сообществом, хорошо знает эту проблему. Они хотели бы предложить продавцам предложения по ценам, но это сложно, особенно потому, что их продавцы могут размещать практически все или любой набор вещей на торговой площадке Mercari.

Постановка задачи :

Создайте алгоритм, который автоматически предлагает правильные цены перепродажи товаров.

Источник — https://www.kaggle.com/c/mercari-price-suggestion-challenge/overview

Цели и ограничения реального мира/бизнеса:

  1. Максимально точно прогнозируйте цены на товары.
  2. Неверные ценники могут ухудшить качество обслуживания клиентов и негативно сказаться на продажах продукта. ↓

1. Информация о данных

Источник :

Это проблема Kaggle трехлетней давности.

Ссылка — https://www.kaggle.com/c/mercari-price-suggestion-challenge/overview

Обзор :

  • Train.tsv содержит 8 столбцов: train_id, имя, item_condition_id, категория_name, brand_name, цена, доставка, item_description.
  • Test.tsv содержит все те же столбцы, кроме столбца «цена», который должен быть предсказан.
  • Размер Train.tsv : 1482 Кб
  • Размер Test.tsv: 34607 Кб

Поля данных:

Независимые переменные:-

  1. train_id или test_id — идентификатор листинга
  2. name — название листинга. Данные были очищены, чтобы удалить текст, похожий на цены (например, 20 долларов США), чтобы избежать утечки. Эти удаленные цены представлены как [rm]
  3. item_condition_id — состояние товара, предоставленного продавцом
  4. category_name — категория листинга
  5. доставка — 1, если стоимость доставки оплачивается продавцом и 0 покупателем
  6. item_description — полное описание предмета. Данные были очищены, чтобы удалить текст, похожий на цены, чтобы избежать утечки. Эти удаленные цены представлены как [rm]

Зависимая переменная:-

  1. цена — цена, по которой товар был продан. Это целевая переменная, которая должна быть предсказана. Единицей является доллар США. Этого столбца нет в test.tsv

2. Постановка задачи машинного обучения

Данные имеют 6 независимых переменных с сочетанием текстовых, категориальных и числовых переменных и одной непрерывной зависимой переменной. Это похоже на стандартную проблему регрессии.

Метрика производительности/оценки:

Метрикой оценки для этой задачи является Среднеквадратичная логарифмическая ошибка (RMLSE).

RMSLE рассчитывается как:

Где:

  • ϵ — значение RMSLE (оценка)
  • n — общее количество наблюдений в наборе данных (общедоступном/частном),
  • пи — это ваш прогноз цены, и
  • ai — фактическая цена продажи i.
  • log(x) – натуральный логарифм x.

RMLSE является предпочтительным показателем оценки, поскольку:

  • Это более надежное измерение ошибки по сравнению с другими показателями, такими как RMSE и R-квадрат. В случае RMSE или R-квадрата наличие выбросов приведет к резкому увеличению значения ошибки. Но RMLSE значительно уменьшает количество ошибок.
  • RMLSE внутренне фиксирует относительную ошибку между прогнозируемыми и фактическими значениями. Поскольку из-за свойства log мы можем вывести это: (log(pi + 1) — log(ai + 1)) = log(log(pi + 1)/log(ai + 1)) .
  • Таким образом, имеет значение только относительная ошибка, а не ее масштаб.
  • RMLSE влечет за собой больший штраф за недооценку фактической переменной, чем за переоценку. Возможно, это полезно здесь, поскольку продавцы понесут убытки, если предполагаемая / прогнозируемая цена продажи ниже фактической цены продажи продукта.

3. Существующие подходы и мои подходы

Существующие подходы:

  1. Стратегическое ценообразование бывших в употреблении продуктов для сайтов электронной коммерции: метод BOW используется для векторизации названия продукта, поскольку это небольшой текстовый элемент, а TFIDF используется для векторизации «описания продукта и категориальные признаки векторизируются с помощью LabelBinarizer. Методы машинного обучения, такие как Ridge Regression и LightGBM, в окончательном наборе данных.
  2. Mercari Golf: ансамбль из 4 моделей MLP, каждая модель имеет одинаковую архитектуру, но обучается на 2 разных наборах данных.

Мои подходы:

Методы машинного обучения:

Линейная регрессия, регрессия хребта, регрессия SVR и регрессия Light GBM.

Методы глубокого обучения:

Существующие подходы DL создали сложные ансамбли для снижения ошибки. Я попытался построить единую модель, которая также точно предсказывала бы цены и уменьшала ошибку (RMLSE). Я пробовал три архитектуры моделей:

  • 1DConv+LSTM для текстовых функций и плотная сеть для других функций.
  • Плотная сеть на векторизованных объектах BOW.
  • Плотная сеть на векторизованных объектах TFIDF.

4. ЭДА

Исследовательский анализ данных относится к критическому процессу выполнения первоначальных исследований данных с целью выявления закономерностей, выявления аномалий, проверки гипотез и проверки предположений с помощью сводной статистики и графических представлений.

На первый взгляд данные выглядят так:

Наблюдения:

  • Нам не требуется столбец «train_id» для нашей задачи. Итак, мы удалим его.
  • В столбце «brand_name» отсутствуют некоторые значения (NaN). Мы рассмотрим пропущенные значения через некоторое время.
  • Есть некоторые точки данных, где «item_description» не было предоставлено, обозначенное как — «Еще нет описания».
  • Столбец «имя_категории» имеет подразделы, поэтому мы разделили его на основную категорию и подкатегории.

4.1 Проверка пропущенных значений:

Давайте построим статистику пропущенных значений, используя библиотеку «missingno»:

  • Функция «brand_name» имеет много пропущенных значений. Итак, мы постараемся вписать их через некоторое время.
  • «category_name» и «item_description» также имеют пропущенные значения, но их количество очень меньше. Итак, мы просто заменим отсутствующие значения на «отсутствующие».

4.2 Разделение «имя_категории»:

4.3 Одномерный анализ:

Цена:

  • Средняя цена составляет 17 долларов, тогда как самая высокая цена - 2009 долларов. Из процентилей мы видим, что существует большой разрыв между ценой 90-го и 100-го процентилей.
  • Некоторые товары также имеют цену = 0$. Итак, нам придется удалить эти точки данных.

  • При дальнейшем исследовании мы обнаруживаем, что 99-й процентиль все еще далек от самой высокой цены, поэтому мы можем ожидать, что очень небольшое количество продуктов будет иметь аномально высокие цены.

Состояние товара:

  • Максимальное количество товаров относится к категории 1, а наименьшее количество товаров относится к категории 5. Мы можем предположить, что пункт-состояние1 относится к товарам, которые находятся в лучшем состоянии, поскольку товары в лучшем состоянии должны быть более продаваемыми.

  • Средняя цена, по-видимому, немного снижается по сравнению с условиями пункта 1–4.
  • Средняя цена товара в состоянии 5 немного выше, но количество баллов в этой категории очень меньше, поэтому мы можем сказать, что существует тенденция к снижению цен по мере перехода от состояния товара 1 к 4.

Доставка:

  • Товаров, доставку которых оплачивает покупатель, больше, чем товаров, доставку которых оплачивает продавец.

  • Товары, стоимость доставки которых оплачивается покупателями, имеют более высокую медианную цену. Таким образом, «доставка» может быть полезной функцией для нашей модели.
  • Это может быть связано с тем, что точки данных, в которых стоимость доставки оплачивается клиентами/покупателями, более продаваемы по какой-либо причине, так что клиенты готовы платить больше, даже после того, как сами понесли расходы по доставке.

Основная категория:

  • Большинство продаваемых товаров относятся к категории «Женщины и красота», возможно, потому, что женщины больше ходят по магазинам и, возможно, покупают больше товаров для красоты.

  • Средние цены на товары категории «Мужчины и женщины» выше, чем в других категориях.
  • Средние цены других категорий немного ниже, но находятся в близком диапазоне.
  • Таким образом, main_cat может быть полезной категорией для прогнозирования между ценой.

Подкатегория-1:

  • Спортивная одежда, косметика, топы и блузки и обувь входят в четверку самых популярных подкатегорий товаров, за которыми следуют украшения, игрушки, сотовые телефоны и аксессуары и т. д.

  • Существует огромная разница в медианных ценах в разных группах подкатегории 1. Товары некоторых категорий имеют гораздо более высокие медианные цены, чем некоторые другие.
  • Таким образом, эта функция, безусловно, будет полезна для прогнозирования цены продукта.

Подкатегория-2:

  • Брюки, колготки, леггинсы — самая популярная подкатегория (2), за которой следуют лица, футболки и т. д.
  • Мы можем предположить, что брюки, колготки или леггинсы попадут в подкатегорию «Спорт» (1), а «Лицо» — в подкатегорию «Макияж» (1), таким образом, получив более высокие значения.

  • Также существует значительный разброс средних цен в разных группах подкатегории 2.
  • Таким образом, эта функция также будет полезна при прогнозировании цены продукта.

Название бренда:

Как мы видели ранее, названия брендов отсутствуют в некоторых точках данных, мы попытаемся вычислить значения через некоторое время.

А пока давайте проанализируем предоставленные данные, за исключением точек данных, в которых отсутствует «brand_name»:

  • Наиболее популярными торговыми марками являются:

1. РОЗОВЫЙ(Женская одежда)

2. NIKE (Спорт)

3. Victoria’s Secret (женский)

4. ЛулаРой (Мода)

Проверка медианных цен по брендам:

  • Цены на большинство брендов ниже 200 долларов. Однако есть несколько исключений.

Давайте исследуем эти бренды:

  • Некоторые бренды, такие как David Yurman, Vitamix, Blendtec, имеют очень высокие медианные цены, но их частота очень мала по сравнению с размером набора данных. Так что их значение может быть не столь значительным.

4.4 Вменение значений «brand_name»:

Названия брендов отсутствуют в 42% точек данных.

  • В ходе нашего анализа мы обнаружили, что значения «brand_name» также можно найти в столбцах «item_description» и «name». Таким образом, мы попытаемся вписать недостающие названия брендов из этих двух столбцов.
  • Здесь объем данных огромен, поэтому мы должны использовать многопроцессорную обработку для нашей задачи поиска и условного обозначения торговых марок:

Проверим результаты вменения:

  • Мы могли бы успешно вменить около половины пропущенных значений. Итак, мы заменим все оставшиеся значения «NaN» в наборе данных на «отсутствующие» и удалим исходный столбец «brand_name».

4.5 Многомерный анализ:

Давайте разделим наши данные на 3 группы, чтобы они помогли нам в анализе:

  • цена ‹ 14$ : Дешево
  • 14$ ≤ цена ≤ 26$ : Доступно
  • цена › 26$ : Дорого

  • Большинство продуктов являются дешевыми, за ними следуют доступные и дорогие продукты.

Давайте проверим топ-10 самых продаваемых брендов и цены на их продукцию:

  • У большинства брендов есть продукты разных ценовых категорий, за исключением таких брендов, как «Michael Kors» и «Lululemon», где большинство продуктов являются дорогими.

Теперь давайте проверим, как цены на эти бренды зависят от состояния продаваемых товаров:

  • Комбинация атрибутов «item_condition_id» и «brand_name» 10 ведущих брендов может в значительной степени дифференцировать цены на товары.

4.6 Резюме наблюдений:

item_condition_id’ — цены немного снижаются по мере ухудшения состояния товара. Но этот атрибут в сочетании с «main_cat» (то есть основной категорией продуктов) приводит к изменению цен на продукты.

«доставка» — почти для всех брендов и категорий товары, стоимость доставки которых оплачивается покупателем, имеют более высокую цену, чем товары, стоимость доставки которых оплачивает продавец.

brand_name’ – средние цены на товары разных брендов различаются. Название бренда в сочетании с другими атрибутами, такими как item_condition_id и main_cat, дает интересный разброс цен на товары.

«main_cat» — медианные цены продукта различаются в зависимости от типа основной категории. main_cat наряду с другими функциями приводит к изменению цены продукта. Итак, важная характеристика.

«sub_cat1» — медианные цены на товары различаются для разных типов подкатегорий 1.

«sub_cat2» — медианные цены на товары различаются для разных типов подкатегорий 2.

5. Очистка данных и предварительная обработка:

5.1 Категориальные признаки:

Как мы видим, во всех трех категориях — main_cat, sub_Cat1 и sub_cat2 — есть некоторые небуквенно-цифровые символы.

Таким образом очищаем 3 столбца категорий:

5.2 Особенности текста:

«item_description» —

Предварительная обработка текстовых функций — рутинная задача. Мы очищаем и предварительно обрабатываем значения «item_description».

"имя" —

6. Попытки разработки функций:

Пытался разработать некоторые новые функции, но не нашел их достаточно полезными:

  • Ни одна из характеристик не имеет достаточно сильной корреляции с целевой переменной. Итак, мы отбрасываем их.

7. Подготовка данных поезда и теста:

Первоначальный сплит-тест:

Удалены ненужные столбцы и разделены обучающие данные, предоставленные Kaggle, на наборы данных для обучения и тестирования.

Данные выглядят следующим образом:

Мы подготовим три набора данных для эксперимента —

  • Bag Of Words (BOW) — тематические данные
  • Характерные данные TF-IDF
  • Токенизированный текст и разреженные данные

7.1 Bag Of Words (BOW) с признаками данных:

Мы будем использовать CountVectorizer для BOW векторизации наших текстовых и категориальных функций. Давайте сначала разберемся, как работает CountVectorizer :

Scikit-learn CountVectorizer используется для преобразования набора текстовых документов в вектор количества терминов/токенов. Это также позволяет выполнять предварительную обработку текстовых данных перед созданием векторного представления. Эта функциональность делает его очень гибким модулем представления функций для текста.

Особенности текста:

Текстовые функции BOW с использованием CountVectorizer от sklearn.

Категорические признаки:

BOW представил категориальные функции с использованием CountVectorizer от sklearn.

Числовые характеристики:

Мы используем MinMaxScaler от sklearn для масштабирования наших числовых функций.

MinMaxScaler масштабирует все объекты данных в диапазоне [0, 1] (по умолчанию) или в диапазоне [-1, 1], если в наборе данных есть отрицательные значения.

Мы используем MinMaxScaler для масштабирования «item_condition_id»:

Целевая переменная:

Мы также должны преобразовать целевую переменную в логарифмическую шкалу, чтобы мы могли использовать среднеквадратичную ошибку в качестве метрики вместо явного определения RMLSE.

Для этого мы будем использовать функцию Numpy log1p():

Подготовка окончательного набора данных:

Мы используем функцию hstack() Scipy, чтобы сложить наши векторизованные функции и создать окончательный набор данных, который будет использоваться для обучения:

7.2 Характеристики данных TF-IDF:

TF-IDF расшифровывается как Частота термина — обратная частота документа.

TF-IDF – это оценка, которая применяется к каждому слову в каждом документе в нашем наборе данных. И для каждого слова значение TF-IDF увеличивается с каждым появлением слова в документе, но постепенно уменьшается с каждым появлением в других документах.

  • Проще говоря, мы можем сказать, что значение TF-IDF будет высоким для тех редких слов, которые встречаются несколько раз только в очень немногих документах, но редко присутствуют в других документах.
  • Точно так же значение TF-IDF будет ниже, если конкретное слово встречается во многих документах и ​​не является редкостью.

Эту концепцию сложно объяснить в нескольких строчках. Если вы хотите узнать больше, вы можете перейти по этой ссылке.

Особенности текста:

Мы векторизируем функцию item_description с помощью TfidfVectorizer от Sklearn:

Подготовка окончательного набора данных:

Мы используем векторизованные Tf-idf данные «item_description», а остальные — из функций BOW:

7.3 Токенизированный текст и разреженные данные:

Мы будем векторизовать текстовый объект item_description с помощью Tokenizer и pad_sequences() :

tf.keras.preprocessing.text.Tokenizer : этот класс позволяет векторизовать текстовый корпус, превращая каждый текст в последовательность целых чисел (каждое целое число является индексом токена в словаре)

tf.keras.preprocessing.sequence.pad_sequences: дополняет последовательности до одинаковой длины.

Поскольку в каждом документе может быть разное общее количество слов, их токенизированные последовательности также будут разной длины. Таким образом, нам нужно дополнить токенизированные последовательности, чтобы они были одинаковой длины.

Векторизация item_description и name:

Нетекстовые функции:

Подготовка окончательного набора данных:

Мы получим окончательный набор данных для обучения, объединив закодированные текстовые функции и нетекстовые функции:

Поезд = [padded_description_train, padded_name_train, X_tr_nontxt]

Тест = [padded_description_test, padded_name_test, X_te_nontxt]

8. Обучение и тестирование моделей ML/DL:

8,1 мл модели:

Давайте обучим следующие регрессионные модели и оценим их производительность на тестовых данных:

  • Линейная регрессия (базовый уровень) — Линейный метод наименьших квадратов
  • Гребневая регрессия — линейный метод наименьших квадратов с регуляризацией L2
  • Регрессия SVR — нечувствительные к эпсилону потери (SVM с мягкой маржой)
  • Light-GBM Regression — машина повышения градиента света

Линейная регрессия:

Линейная регрессия пытается смоделировать взаимосвязь между двумя переменными путем подгонки линейного уравнения к наблюдаемым данным. Одна переменная считается объясняющей переменной, а другая считается зависимой переменной.

Мы сохраним эту модель в качестве основной. Давайте подгоним данные и протестируем модель:

RMLSE в данных TRAIN = 0,44788603982109476

RMLSE на тестовых данных = 0,46807207137757767

Kaggle RMLSE = 0,47660

Регрессия хребта:

Эта модель решает модель регрессии, в которой функция потерь является линейной функцией наименьших квадратов, а регуляризация задается нормой l2. Мы можем изменить значение «альфа», то есть силу регуляризации, и выбрать лучшее значение для наших данных.

Мы проведем настройку гиперпараметров, а затем обучим окончательную модель с лучшими параметрами.

RMLSE в данных TRAIN = 0,44196214665140854

RMLSE на тестовых данных = 0,4609332745825652

Kaggle RMLSE = 0,46853

Регрессия СВР:

В простой регрессии мы пытаемся минимизировать частоту ошибок. В то время как в SVR мы стараемся удерживать ошибку в пределах определенного порога.

Мы проведем настройку гиперпараметров, а затем обучим окончательную модель с лучшими параметрами:

RMLSE в данных TRAIN = 0,47556175648468174

RMLSE на тестовых данных = 0,4809737240617147

Kaggle RMLSE = 0,48818

Легкая регрессия GBM:

Light GBM — это быстрая, распределенная, высокопроизводительная платформа повышения градиента, основанная на алгоритме дерева решений, используемом для ранжирования, классификации и многих других задач машинного обучения.

Поскольку он основан на алгоритмах дерева решений, он разбивает дерево по листу с наилучшей подгонкой, тогда как другие алгоритмы повышения разбивают дерево по глубине или по уровню, а не по листу. Таким образом, при выращивании на одном и том же листе в Light GBM листовой алгоритм может уменьшить больше потерь, чем поуровневый алгоритм, и, следовательно, приводит к гораздо большей точности, которая редко может быть достигнута любым из существующих алгоритмов повышения. Кроме того, он очень быстрый, отсюда и слово «легкий».

RMLSE в данных TRAIN = 0,4164715508973795

RMLSE на тестовых данных = 0,45097900374349953

Kaggle RMLSE = 0,45830

8.2 Модели DL:

С моделями ML покончено. Теперь давайте проверим, как методы глубокого обучения работают с данными.

1DConv+LSTM для текстовых функций и плотная сеть для других функций:

Conv+LSTM могут быть полезны для текстовых функций. Рекуррентные нейронные сети могут получать контекстную информацию из текста, а сверточная нейронная сеть (CNN) может получать важные характеристики текста посредством объединения. Давайте попробуем эту модельную структуру и посмотрим, как она работает.

Архитектура модели —

Давайте подгоним модель к данным и проверим ее производительность:

RMLSE в данных TRAIN = 0,40325830205299756

RMLSE на тестовых данных = 0,4522887404428894

Kaggle RMLSE = 0,46145

Плотная сеть на векторизованных объектах BOW:

Архитектура модели:

Давайте подгоним модель к данным и проверим ее производительность:

RMLSE в данных TRAIN = 0,37576717294003453

RMLSE на тестовых данных = 0,43891317200216107

Kaggle RMLSE = 0,44675

Плотная сеть на векторизованных функциях TFIDF:

Архитектура модели:

Давайте подгоним модель к данным и проверим ее производительность:

RMLSE в данных TRAIN = 0,4124439548671445

RMLSE на тестовых данных = 0,4440186551467468

Kaggle RMLSE = 0,45247

Сравнение моделей:

Давайте проанализируем, как все модели работали по сравнению друг с другом:

Плотная сеть с функциями BOW работает лучше всего. Мы выберем эту модель в качестве нашей окончательной модели.

Будущая работа :

  • Всегда можно попробовать сложные ансамбли. Они дадут лучшие результаты, но повлияют на задержку модели.
  • Мы можем опробовать более сложные архитектуры глубокого обучения, но будьте осторожны с моделями, которые переобучают данные для обучения.
  • Мы можем попробовать разные параметры векторизации.
  • Мы можем попробовать различные типы модулей DL, такие как GRU, двунаправленные LSTM и т. д.

Вывод :

Это была увлекательная задача. Здесь смешались всевозможные функции, и требовалось много предварительной обработки данных. Я попытался поэкспериментировать с несколькими методами, которые раньше не применялись к этим данным.

Для полного кода вы можете проверить ссылку на github.

По любым предложениям/вопросам вы можете связаться со мной на linkedin.

Использованная литература :

  1. Стратегическое ценообразование бывших в употреблении продуктов для сайтов электронной коммерции (iastate.edu)
  2. Машинное обучение для рекомендации розничных цен с помощью Python | Сьюзен Ли | На пути к науке о данных
  3. https://medium.com/@mrunal68/text-sentiments-classification-with-cnn-and-lstm-f92652bc29fd
  4. https://machinelearningmastery.com/prepare-text-data-deep-learning-keras/
  5. https://www.appliedaicourse.com/course/11/Applied-Machine-learning-course