Оглавление
- Бизнес-проблема
- Использование ОД/DL
- Источник данных
- Существующие подходы
- Улучшения
- Исследовательский анализ данных
- Решение для первого разреза
- Окончательный подход
- Описание модели
- Фрагменты кода
- Окончательное сравнение моделей
- Будущая работа
- использованная литература
- Вывод
Бизнес-проблема
Описание
Ценообразование продуктов становится еще сложнее в масштабах, учитывая, сколько продуктов продается в Интернете. Одежда имеет сильные сезонные ценовые тенденции и сильно зависит от торговых марок, в то время как цены на электронику колеблются в зависимости от характеристик продукта.
Mercari, крупнейшее в Японии приложение для покупок, созданное сообществом, хорошо знает эту проблему. Они хотели бы предложить продавцам предложения по ценам, но это сложно, потому что их продавцы могут размещать практически все или любой набор вещей на торговой площадке Mercari.
В этом конкурсе Mercari предлагает нам создать алгоритм, который автоматически предлагает правильные цены на продукты. Нам предоставляются введенные пользователем текстовые описания их продуктов, включая такие сведения, как название категории продукта, название бренда и состояние товара.
Резюме
Основная цель кейса — спрогнозировать цену товара с помощью заданных характеристик. Для этого мы будем использовать набор данных, предоставленный в конкурсе ценовых предложений Mercari. Это задача машинного обучения, основанная на регрессии, которая ожидает вывод непрерывного типа (а не категориального типа, как это видно в задачах, основанных на классификации). Поскольку метрикой ошибки, которую нам нужно оценить, является RMSLE, нам нужно преобразовать выходную цель (цену) в соответствующую логарифмическую версию, а затем оценить RMSE.
Это тематическое исследование поможет нам понять оптимальную цену, которую продавец может ожидать за свой продукт на основе различных описаний товара, предоставленных продавцом.
Цели
- Это проблема машинного обучения, основанная на регрессии, где нам нужно предсказать цену, используя заданные входные функции.
- Оцениваемой метрикой ошибки является RMSLE (среднеквадратичная логарифмическая ошибка).
Метрика оценки
Показателем оценки для этого соревнования является RMSLE (среднеквадратичная логарифмическая ошибка).
где:
- ϵ — значение RMSLE (балл).
- n — общее количество наблюдений в (общедоступном/частном) наборе данных.
- pi — ваш прогноз цены
- ai – фактическая цена продажи i.
- log(x) — натуральный логарифм x.
Использование ОД/DL
В рамках этого тематического исследования мы экспериментировали с рядом моделей машинного обучения на основе регрессии, а также с моделями глубокого обучения. Хотя некоторые из них смогли получить очень хороший балл RMSLE, в то время как остальные были неудовлетворительными. Ниже приведен список моделей, которые мы использовали:
Модели машинного обучения
- Линейная регрессия: мы использовали линейную регрессию в качестве модели первого подхода, чтобы получить общее представление о генерируемой оценке RMSLE.
- Грибная регрессия: поскольку гребенчатая регрессия добавляет штрафной член, тем самым уменьшая переобучение, которое линейная регрессия не может сделать, поэтому мы также экспериментировали с этой моделью, чтобы улучшить оценку.
- Машина опорных векторов (SVM): мы смогли заметить, что наш обучающий набор данных имеет большую размерность, и поэтому SVM использовалась, чтобы избежать трудностей, с которыми сталкивались линейные функции в многомерное функциональное пространство
- Дерево решений. Поскольку наш обучающий набор данных состоит из более чем миллиона точек данных, а деревья решений имеют низкую сложность времени обучения, мы решили использовать и эту модель.
- Случайный лес. Случайный лес основан на алгоритме бэггинга и использует метод ансамблевого обучения. Он создает как можно больше деревьев на подмножестве данных и объединяет выходные данные всех деревьев. Таким образом, он уменьшаетпроблему переобучения в деревьях решений, а такжеуменьшает дисперсиюи, следовательно, повышает точность. Вот и решили поэкспериментировать
- XGBoost: XGBoost легко параллелизуется, быстро выполняется и обычно превосходит другие алгоритмы. Итак, мы использовали его и в нашем кейсе.
- Light GBM: поскольку сам LGBM использует XGBoost в качестве базовой модели и почти в 7 раз быстрее, чем XGBoost, что является гораздо лучшим подходом при работе с большими наборами данных, поэтому мы решили проверьте счет, используя эту модель, а также
- Стекирование (ансамбль). Много раз мы наблюдали, что сложение значительно улучшает оценку, поэтому мы решили использовать 3 наиболее эффективные модели в качестве базовых моделей. и впоследствии использовать линейную регрессию в качестве метамодели, тем самым пытаясь улучшить оценку.
Модели глубокого обучения
- LSTM+CNN. Хотя наше тематическое исследование было строго ограничено моделями машинного обучения, мы решили поэкспериментировать с LSTM, за которым следует 1D ConvNet, чтобы наблюдать за оценкой и тем самым попробуй отследить результат.
Источник данных
В рамках этого тематического исследования мы используем файл train.tsv, предоставленный самим Kaggle, для обучения наших моделей. При более тщательном анализе было замечено, что указанный файл состоит из следующих столбцов:
train_id
- идентификатор листингаname
- название листинга. Обратите внимание, что мы очистили данные, удалив текст, похожий на цену (например, 20 долларов США), чтобы избежать утечки. Эти удаленные цены представлены как[rm]
item_condition_id
- состояние товара, предоставленного продавцомcategory_name
- категория объявленияbrand_name
price
- цена, по которой был продан товар. Это целевая переменная, которую вы будете прогнозировать. Единицей является доллар США. Этот столбец не существует вtest.tsv
, так как это то, что вы будете предсказывать.shipping
- 1, если стоимость доставки оплачивается продавцом и 0 покупателемitem_description
- полное описание предмета. Обратите внимание, что мы очистили данные, удалив текст, похожий на цену (например, 20 долларов США), чтобы избежать утечки. Эти удаленные цены представлены как[rm]
Существующие подходы
- Было замечено, что в рамках метода разработки признаков имя_категории закодировано на нескольких иерархических уровнях. Таким образом, каждая из последовательных иерархий рассматривалась как категории и соответствующие им подкатегории. После разделения гистограммы использовались для понимания распределения продуктов с точки зрения количества для каждой категории и их подкатегорий. Следовательно, они использовались как категориальные признаки.
- Длина каждого из предложений из столбца item_description после предварительной обработки текста использовалась в качестве признака.
- Все пропущенные значения были заменены словом «отсутствует», особенно в случае brand_name, category_name и item_description.
- XGBoost похож на стандартный алгоритм, который используется почти всеми для решения подобных тематических исследований, поэтому и в этом случае нет исключений.
- Было замечено, что настройка гиперпараметров является обязательным критерием почти во всех существующих тематических исследованиях при обучении любой модели машинного обучения.
Улучшения
- Поскольку функция train_id представляет собой столбец, состоящий из уникальных серийных номеров и, следовательно, не имеет большого значения во время обучения, поэтому мы исключили ее.
- Мы добавили дополнительную функцию name_length, аналогичную функции item_desc_length.
- Показатели настроений имели значения корреляции намного меньше 0,5 по отношению к цене. Поэтому мы решили исключить эти функции из нашего набора данных.
- Мы заметили много нулевых значений в функции brand и поэтому попытались проверить функцию name на предмет возможности найти нулевые значения.
- В столбце item_description мы заменили ячейки, помеченные как «Описания еще нет», а пустые значения были заменены на «отсутствует».
- Помимо обучения с XGBoost, мы также опробовали Light GBM, чтобы повысить точность, учитывая низкую временную сложность моделей обучения с использованием LGBM.
- При выполнении настройки гиперпараметров вместо использования CV случайного поиска или CV поиска по сетке мы использовали обычную технику итерации. Это улучшило время обучения, тем самым потребовав меньше времени для обучения моделей.
- Мы также поэкспериментировали с Stacking, методом ансамбля, чтобы попытаться улучшить счет.
Исследовательский анализ данных
Предварительное расследование
Набор данных, предоставленный Kaggle, состоит из 1482535 строк и 8 столбцов и после загрузки отображается следующим образом:
Pandas предоставляет нам две функции, а именно describe() и info(), для проведения базового предварительного исследования загруженного фрейма данных.
Приведенное выше представление дает некоторые ценные идеи, которые заключаются в следующем:
- Самая высокая цена, которую может иметь предмет, составляет 2009 долларов США.
- 25% товаров имеют цену менее 10 долларов США, 50% из них - менее 17 долларов США и 75% всех товаров - менее 29 долларов США.
- Категория item_condition_id в основном имеет порядковый номер с самым низким рейтингом, равным 1, и самым высоким рейтингом, равным 5.
- Категория доставки, имеющая номинальный характер, имеет два значения, а именно 0 и 1.
Ниже приведены некоторые выводы, полученные из приведенного выше представления:
- Хотя общее количество строк оказалось равным 1482535, мы ясно видим, что общее количество ненулевых значений имя_категории (1476208), имя_бренда (849853 ) и item_description (1482531) значительно меньше, и, следовательно, мы можем сделать вывод, что набор данных имеет нулевые значения.
- Кроме того, item_condition_id и доставка, являющиеся категориальными функциями, принимают значение целочисленного типа.
Цена
Следующий фрагмент кода генерирует распределение цены с помощью гистограммы:
Из графика мы можем сделать вывод, что распределение price следует асимметрии вправо, и согласно постановке задачи нам нужно вычислить RMSLE (среднеквадратическую логарифмическую ошибку). Следовательно, нам нужно преобразовать характеристику цены в ее логарифмическую форму, что может быть достигнуто с помощью следующего фрагмента кода:
Здесь мы наблюдаем, что асимметрия распределения уменьшается после применения логарифмического преобразования. Кроме того, нам нужно добавить значение 1 к каждому из значений функции цена, так как минимальная цена была равна 0 долларов США, а log (0) не определен.
Используя Box-Plot, мы можем наблюдать, что 50% всех товаров находятся в диапазоне от 10 до 29 долларов США. Также для большинства товаров заявленная цена составляет около 18 долларов США, что показано следующим образом:
Цена доставки
Согласно анализу, список уникальных категорий функции доставки: 1 (комиссия оплачивается продавцом) и 0 (комиссия оплачивается покупателем).
Из приведенной ниже гистограммы можно сделать вывод, что если цена товара ниже, то в большинстве случаев стоимость доставки оплачивает продавец, а если цена высока, то в большинстве случаев стоимость доставки оплачивается продавцом. покупателем:
Идентификатор состояния позиции цены
Мы также заметили, что в списке уникальных категорий функции item_condition_id есть 1, 2, 3, 4 и 5.
Из графика, показанного ниже, мы не можем сделать много выводов, поскольку мы можем наблюдать много совпадений среди 5 категорий. Однако мы можем сказать, что между категориями item_condition_id существует высокий дисбаланс.
Далее мы проанализировали процент встречаемости для каждой из пяти категорий, чтобы лучше понять распределение, как показано ниже:
Таким образом, мы можем сказать, что категория_1 является наиболее доминирующей с 43,2%, а категория_5 уступает наименьшей в 0,2%.
Взгляд на коробочную диаграмму также показывает, что 50-й процентиль для каждой из 5 категорий не показывает большой вариации, которая может быть нам полезна.
описание предмета
Выполнение следующего фрагмента кода создает облако слов, которое дает нам общий обзор наиболее часто встречающихся слов в функции item_description:
Из графика Word-Cloud мы можем получить общее представление о 100 наиболее часто встречающихся словах в функции item_desription. Поскольку слово «Бренд» отображается с самым большим размером шрифта, следовательно, за ним чаще всего следуют такие слова, как «новый», «бесплатный» и т. д.
Пункт Описание Длина-Цена
Следующий фрагмент кода помогает нам сгенерировать распределение цены по длине предложений в функции item_description.
Здесь мы видим, что по мере увеличения длины описания товара цена, по-видимому, снижается. Таким образом, мы можем сказать, что продукты с более коротким описанием, как правило, стоят дороже.
Название бренда
Выполнение подсчета значений для функции brand_name приводит к следующему результату:
Здесь мы видим, что существует 4810 уникальных категорий brand_name. Но для нашего удобства мы попытаемся проследить 10 лучших торговых марок с помощью следующей круговой диаграммы:
На круговой диаграмме мы делаем вывод, что для brand_name отсутствует 71 % данных. Тем не менее, некоторые из наиболее часто встречающихся торговых марок — это PINK (6%), Nike (6%), Victoria’s Secret (5%) и LulaRoe (3%).
Однако такие бренды, как PINK, Victoria’s Secret и LulaRoe, специализируются на продуктах, предназначенных специально для женщин, и, следовательно, мы можем сказать, что продажи женских товаров намного выше, чем мужские.
Кроме того, все три из этих брендов связаны с производством линии одежды, и, следовательно, мы интуитивно понимаем, что выше продажи товаров для женской одежды/аксессуаров.
Название категории
Аналогичный подсчет значения для функции category_name позволяет сделать следующие выводы:
Глядя на данные для функции category_name, мы видим, что косая черта вперед действует как разделитель, поэтому названия категорий можно разделить на несколько подкатегорий. Наша первая задача — определить, сколько таких подкатегорий присутствует.
Для этого выполняем следующую строку кода:
На круговой диаграмме, показанной ниже, видно, что 50 лучших уникальных названий категорий можно разделить на 3 части, поэтому мы рассмотрим main_categ, sub_categ_one и sub_categ_two
Более подробный анализ каждой из трех подкатегорий функции category_name позволяет сделать следующие выводы:
- основная_категория
Как и ожидалось из анализа фирменного наименования, мы видим, что 45% от общего объема продаж приходится на товары для женщин, за которыми следуют товары для красоты, что составляет 14% от общего объема продаж.
- sub_categ_one
Здесь мы также наблюдаем аналогичную тенденцию для продуктов, связанных с женщинами, если рассматривать их как первые 10 уникальных значений функции sub_categ_one. Тем не менее, можно заметить, что одежда, косметика, обувь и украшения являются основным выбором товаров, связанных с женщинами.
- sub_categ_two
Функция sub_categ_two дает нам еще более четкое представление о товарах, которые предпочитают большинство женщин.
Здесь, если мы создадим график Word-Cloud для функции sub_categ_two, мы сможем получить более четкое представление о большинстве часто продаваемых товаров. Кроме того, было замечено, что большинство слов с большим размером шрифта ориентированы на женщин, а видимые слова, связанные с электроникой и игрушками, также можно наблюдать, как показано ниже:
Решение для первого разреза
- Поскольку в цели тематического исследования было строго указано, что нам необходимо оценить RMSLE, поэтому самое первое, что мы сделали, — преобразовали функцию цена в форму журнала. Однако было замечено, что минимальная цена, из которой состоял набор данных, составляла 0 долларов США, поэтому нам нужно было добавить «1», прежде чем применять к нему журнал. Таким образом, теперь мы можем оценить RMSE.
- Кроме того, во многих тематических исследованиях было замечено, что оценки тональности иногда играют важную роль, если присутствует описание. Таким образом, оценки тональности были рассчитаны для каждого описания элемента, в результате чего были созданы четыре новые функции: ss_pos, ss_neg, ss_neu и ss_com. Однако следует иметь в виду, что анализ настроений должен выполняться до предварительной обработки текста описания элемента. Это так, потому что если мы рассмотрим пример, скажем, «Хорошо», то значение ss_pos для «ХОРОШО» выше, чем для «хорошо».
- Предварительная обработка текста — еще один важный шаг, который мы выполнили, чтобы изменить функцию name и item_description для создания name_preprocess и item_desc_preprocess соответственно. Здесь мы выполнили деконтракцию, удаление буквенно-цифровых символов, а также стоп-слов, а также преобразование в нижний регистр, что поможет нам выполнить векторизацию над ним.
- Еще одна вещь, которую мы заметили, заключалась в том, что по мере уменьшения длины описания товара стоимость продукта, по-видимому, увеличивается. Поскольку мы наблюдаем значительную корреляцию между ценой и длиной описания товара, мы рассматриваем item_desc_length как дополнительную функцию в наборе данных.
- Как видно из EDA, выполненного для category_name, мы можем предположить, что три функции: main_categ, sub_categ_one и sub_categ_two в основном находятся в иерархическом порядке. Следовательно, название первой категории можно рассматривать как основную категорию, а остальные подкатегории, как можно сказать, имеют меньший вес. Поэтому мы отбрасываем sub_categ_one и sub_categ_two и переименовываем main_categ в функцию category в наборе данных.
- Кроме того, для удаления нулевых значений категориальных признаков, а именно категории и бренда, мы воспользовались методом импутации модели, в котором мы использовали модель KNN.
- При обучении этого набора данных после характеристики с использованием выбранных моделей мы наблюдаем следующие оценки, полученные с использованием ядра Kaggle:
- Здесь мы видим, что наши модели очень плохо работают с набором данных Kaggle, несмотря на то, что некоторые модели имеют относительно хорошие результаты с набором тестовых данных.
- Поэтому мы модифицировали наш исходный набор данных некоторыми новыми функциями, пытаясь получить более высокие оценки Kaggle.
Окончательный подход
- Мы добавили дополнительную функцию name_length, аналогичную функции item_desc_length.
- В отличие от первого решения, здесь мы рассматриваем все три подразделения категорий как main_categ, sub_categ_one и sub_categ_two.
- Для показателей тональности мы наблюдаем, что каждый из ss_pos, ss_neg, ss_neu и ss_com имеет значения корреляции - 0,021, -0,022, 0,035 и 0,002 соответственно относительно цены. Поэтому мы решили исключить эти функции из нашего набора данных, поскольку ни одна из них не имеет значения корреляции, близкого к 0,5.
- В случае бренда мы наблюдаем много нулевых значений, поэтому мы попытались проверить функцию название на предмет возможности найти нулевые значения. С помощью этой техники мы смогли заполнить 128 886 пустых значений брендов. Что касается остальных, мы пометили их как «отсутствующие».
- Также нам удалось обнаружить 82 517 ячеек, помеченных как «Описания еще нет» в столбце item_description, поэтому мы заменили эти ячейки вместе с нулевыми значениями, пометив их как «отсутствует'
- Что касается нулевых значений в случае столбца category, мы просто пометили их как «отсутствующие».
- Кроме того, во время преобразования функций name_preprocess и item_desc_preprocess с помощью CountVectorizer и TfidfVectorizer мы увеличили max_features до 10 000 и 100 000 соответственно, чтобы улучшить показатели. Поскольку это привело к тому, что наш набор данных имеет очень большую размерность, поэтому из-за вычислительных ограничений мы тренировались, используя некоторые из наиболее эффективных алгоритмов, которые мы наблюдали в первом решении, и отбрасывали остальные.
Описание модели
Укладка
Stacking — это ансамблевый алгоритм машинного обучения. Он использует алгоритм метаобучения, чтобы узнать, как лучше всего комбинировать прогнозы двух или более базовых алгоритмов машинного обучения. Он может использовать возможности ряда хорошо работающих моделей в задаче регрессии и делать прогнозы, которые имеют лучшую производительность, чем любая отдельная модель в ансамбле.
Архитектура модели наложения включает две или более базовых модели, часто называемых моделями уровня 0, и метамодель, которая объединяет прогнозы базовых моделей, называемую моделью уровня 1.
В нашем тематическом исследовании мы заметили, что тремя наиболее эффективными моделями являются LGBM, Ridge Regression и SVM. Итак, мы будем рассматривать эти три модели как наши базовые модели для построения модели ансамбля стекирования. Что касается метамодели, мы будем рассматривать модель линейной регрессии.
Здесь вместо использования предопределенного класса стека из библиотеки sklearn/mlextend мы будем реализовывать наш собственный механизм для модели ансамбля стека, как показано ниже:
- Базовые модели
- Метамодель
LSTM + CNN
Ниже приведен список слоев, которые мы использовали для создания нашей нейронной сети как части первого решения:
- Внедрение. Этот слой превращает положительные целые числа (индексы) в плотные векторы фиксированного размера.
- LSTM: долговременная кратковременная память представляет собой архитектуру искусственной рекуррентной нейронной сети (RNN), состоящую из клетки, входных и выходных ворот и забывающих ворот.
- Conv1D: этот слой создает ядро свертки, которое свертывается с входными данными слоя в одном пространственном (или временном) измерении для создания тензора выходных данных.
- Сведение. Этот слой сглаживает входные данные и не влияет на размер пакета.
- Плотный: это плотно связанный слой нейронной сети.
- Dropout: этот слой случайным образом устанавливает входные единицы на 0 с частотой скорости на каждом шаге во время обучения, что помогает предотвратить переобучение.
Здесь мы использовали слой LSTM, за которым следовала 1D ConvNet для функции item_description, которую мы изначально передали через слой внедрения. Для категориальных функций, состоящих из brand_name и category_name, мы просто передали их через слой внедрения. Что касается остальных числовых признаков, мы объединили их и пропустили через плотный слой.
Выходные данные всех текстовых, категориальных и числовых функций затем объединяются и передаются через несколько пар слоев Dense и Dropout, при этом конечный выходной слой устанавливается равным единицам = 1 и активации = линейным.
Ниже представлена архитектура нейронной сети вместе с формой ввода и вывода на каждом последующем уровне:
Фрагменты кода
- Функция text_preprocess(text, eng_stopwords) используется для функций name и item_description для выполнения предварительной обработки текста.
- Функция w2v_vectors(preprocessed_essays,glove_words,model) используется для вычисления пословного представления каждого из предложений в Функция item_description после предварительной обработки текста
- Функция predict_scores(model, feature_merged_tfidf, df_test) используется для прогнозирования целевых значений тестового набора данных с использованием выбранной модели.
- Функция text_length(text, no_desc_string) используется для определения длины предложений, для которых присутствует описание, иначе она возвращает 0
Окончательное сравнение моделей
В соответствии с новыми методами разработки функций, которые мы внедрили, ниже приведен список значений RMSLE набора тестовых данных вместе с соответствующими оценками Kaggle.
Здесь мы видим, что LGBM работает лучше всего со значением RMSLE 0,43206 в тестовом наборе данных и 0,44016 в ядре Kaggle.
Будущая работа
- Хотя мы разработали простую нейронную сеть в качестве первого решения, можно попытаться разработать более сложные и глубокие нейронные сети для улучшения метрики оценки.
- При вычислении показателей Tf-Idf функции item_description мы взяли диапазон n_gram с максимальным значением 3. Однако мы можем попытаться увеличить этот диапазон в ставке. улучшить счет
- Настройка гиперпараметров, включающая более широкий диапазон значений, также может привести к созданию более эффективных моделей.
- Мы также можем попытаться увеличить количество базовых моделей в случае механизма стекирования, который может помочь нам улучшить оценку.
использованная литература
- https://www.kaggle.com/c/mercari-price-suggestion-challenge
- https://machinelearningmastery.com/stacking-ensemble-machine-learning-with-python/
- https://en.wikipedia.org/wiki/Длинная_короткая_память
- https://www.tensorflow.org/api_docs/python/tf/keras/layers
Вывод
Все файлы, связанные с кодами для сквозной реализации всего тематического исследования, доступны на Github, доступ к которому можно получить, нажав GitHub.