«Люди не покупают то, что вы делаете, они покупают то, что вы делаете». - Саймон Синек

Вы когда-нибудь пытались продать свой старый смартфон, но не можете понять, по какой цене будет продавать его? Что, если вы недооценили его и понесли убытки? Или что, если вы установите такую ​​высокую цену, что никто не будет готов ее покупать?

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

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

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

Это именно та проблема, которую Меркари призвал решить сообщество Kaggle, получив призовой фонд в размере 100 000 долларов.

Содержание Краткое содержание

  1. Бизнес-проблема
  2. Источник данных и его обзор
  3. Постановка задачи машинного обучения
  4. Исследовательский анализ данных (EDA)
  5. Функциональная инженерия
  6. Традиционные модели машинного обучения
  7. Модели глубокого обучения
  8. Развертывание
  9. Эксперименты, которые не увенчались успехом
  10. Дальнейшая работа и возможности для улучшений
  11. использованная литература

1. Деловая проблема

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

Бизнес-цели и ограничения

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

Теперь я шаг за шагом расскажу вам о подходах, которые я использовал для решения этой проблемы, а также как я получил свой результат в 2,77% лучших (на 66-м месте) в таблице лидеров Kaggle. ; в Серебряной зоне. Соревнование давно закончилось, поэтому технически я не смог пробиться в таблицу лидеров. Хотя это была отличная возможность решить эту проблему и посмотреть, где я бы стоял в таблице лидеров во время соревнований. Обязательно прочтите его до конца!

2. Источник данных и его обзор

Данные были загружены Mercari на Kaggle,

Учебный файл (.tsv) состоит из списка продуктов, разделенных табуляцией.

  • train_id - идентификатор листинга
  • name - заголовок листинга
  • item_condition_id - состояние товара, предоставленное продавцом. От 1 до 5. 1 - «новый», 5 - «бедный»
  • category_name - категория объявления
  • название бренда
  • цена - цена, по которой был продан товар. Это целевая переменная, которую мы будем прогнозировать. Единица - доллар США.
  • доставка - 1, если стоимость доставки оплачивается продавцом, и 0 - покупателем
  • item_description - полное описание предмета.

Размер train.tsv = 322 МБ.
Общее количество объявлений о товарах = 14,82 535

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

Тип проблемы машинного обучения

  • Цены (плановые) указаны в реальных числах. Следовательно, эта проблема относится к проблеме регрессии.

Показатель эффективности

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

Выбор этой метрики обусловлен следующими причинами:

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

4. Исследовательский анализ данных (EDA)

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

Проверка нулевых значений в наборе данных

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

Анализ цен (столбец "Целевая")

Построение PDF столбца цен дает нам следующее распределение:

Мы видим, что распределение цен сильно смещено вправо. Мы также видим, что большинство цен составляет от 0 до 250 долларов. Очень мало товаров по цене выше 250 долларов. Распределение похоже на распределение Парето.
Мы получим более ясную картину распределения цен, если проверим цены в нескольких процентилях.

Из цен в указанных выше процентилях мы видим, что 99% цен меньше 170 долларов. Более высокие цены можно рассматривать как выбросы. Теперь можно сделать две вещи.

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

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

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

Удаление цен вне диапазона
Когда я исследовал веб-сайт Mercari, я обнаружил, что цены на товары могут составлять от 5 до 2 000 долларов. И в нашем наборе данных есть определенные продукты, цены на которые ниже 5 долларов (даже 0 долларов), а цены - ›2000 долларов. Я удалил эти списки продуктов из набора данных.

Применение преобразования Бокс-Кокса к ценам

Поскольку исходное ценовое распределение выглядит как распределение Парето, я подумал о применении к нему преобразования коробки-Кокса. Когда мы применяем преобразование box-cox к распределению Парето, результатом будет нормальное распределение. Ниже приводится распределение цен с преобразованием коробки-Кокса.

Что ж, это распределение не похоже на идеальное нормальное распределение. На самом деле все дело в том, что преобразование box-cox будет «пытаться» сделать его нормальным распределением, но не гарантирует этого.

Применение преобразования журнала к ценам

Более простой способ преобразования распределения Парето в нормальное распределение - применение логарифмического преобразования.

В дальнейшем EDA будет фокусироваться на ценах с преобразованием логарифма везде, где это необходимо, а не на преобразовании коробки-Кокса. Причина этого будет обсуждена позже. Но чтобы дать вам спойлер, позвольте мне просто сказать, что преобразование Бокс-Кокса плохо работало на моделях машинного обучения (это будет обсуждаться в следующих разделах).

Анализ колонки отгрузки

Не наблюдается больших различий в количестве товаров, проданных с доставкой, оплачиваемой продавцом [1] или доставкой, оплачиваемой покупателем [0]. Однако очевидно, что количество товаров, по которым продавец оплачивает доставку, меньше, чем количество товаров, по которым ее оплачивает покупатель.

Из PDF-файла с ценами на доставку мы видим, что если цена продукта очень низкая (менее 6 долларов), то доставка в основном оплачивается продавцом.

антилог (~ 1,8 доллара) = 6 долларов

Анализ состояния предмета

Наблюдается значительный дисбаланс в категориях состояния элементов, особенно в категориях 4 и 5. Похоже, что в условиях «удовлетворительно» [4] и «неудовлетворительно» [5] очень мало элементов.

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

Влияние состояния товара на цену (видно из прямоугольной диаграммы) показывает, что средние цены являются самыми высокими для «плохих» кондиционированных продуктов, за которыми следуют «новые» кондиционированные продукты. Это может быть связано с тем, что продукты в плохом состоянии относятся к той категории, где цены обычно выше, например: электронная категория, такая как ноутбук, спортивная категория, например, гироскутер, и т. Д. Таким образом, их собственные цены сами по себе очень высоки.

Анализ текста названия предмета

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

Анализ описания предмета

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

Анализ торговой марки

Есть 4810 уникальных торговых марок. Мы видим, что в топ-50 наиболее упоминаемых брендов большинство из них - это одежда, а некоторые - электроника.

Анализ категорий

Категории указаны в трех частях (разделены косой чертой) следующим образом:

Поэтому я решил разделить этот столбец категорий на три отдельные категории. Нравится,

Количество уникальных значений в основной категории: 11
Количество уникальных значений в подкатегории1: 114
Количество уникальных значений в подкатегории2: 871

Общая категория

[Если я использую термин «Основная категория», он будет синонимом «Общая категория»]

После разделения категории на три части, категория женщин лидирует в общей категории с 44,81%, за ней следует категория красоты с 14,02%. Спортивная категория имеет наименьшее значение.

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

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

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

Как и предполагалось ранее по названиям брендов, большая часть товаров относится к категории одежды, которая также предназначена для женщин. Отсутствуют только ~ 6000 категорий (данные «Без ярлыка»). Поскольку количество пропущенных категорий очень мало, я не думаю, что разработка специальных функций для их заполнения того стоит. Я сохраню его как данные без маркировки и посмотрю, как работает наша модель.

Анализируем дорогие бренды

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

Облако слов 15 ведущих брендов

Топ-10 дорогих брендов в каждой категории

Обратите внимание, что цены ниже - это средние цены.

Для каждой общей категории я взял средние цены каждого бренда и нашел 10 лучших брендов для каждой категории.

Анализ влияния взаимодействия более чем одной функции на цену

Бренд и состояние - ›Цена

Это взаимодействие 15 самых дорогих брендов (по средней цене) и состояния товара показывает, что у этих дорогих брендов нет товаров в «плохом» состоянии. Большинство из них продается с условиями 2 и 3.

Бренд «demdaco» - самый дорогой бренд, за ним следуют «автомобильный счетчик» и «proenza schouler».

Бренд и категория - ›Цена

Категория и состояние - ›Цена

Взаимодействие между категорией и состоянием позиции показывает, что товары категорий «Мужчины», «Женщины» и «Дом» продаются с самыми высокими затратами при условии 1 («Новое» состояние). Самые высокие цены на электронику имеют состояние 4 и 5 («удовлетворительное» и «плохое»).

Категория - ›цена

Наблюдая за взаимодействием общей категории с ценами, видно, что в категории «Мужчины» самые дорогие товары.

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

5. Разработка функций

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

Мы выполним следующие шаги по проектированию функций в наборе данных.

  • Заполнение всех недостающих данных некоторыми значениями по умолчанию
  • Заполните отсутствующие торговые марки
  • Предварительная обработка текстовых данных
  • Разделить категории на три части
  • Добавление описания предмета и подсчета слов в названии предмета
  • Добавить функцию дешевых или дорогих брендов (двоичные данные)
  • Векторизация текста и категориальных данных

Заполнение всех недостающих данных некоторыми значениями по умолчанию

Это можно просто сделать в пандах с помощью функции fillna ().

Заполните отсутствующие торговые марки

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

Лучше не иметь данных, чем иметь неправильные данные.

Мы извлечем название бренда следующим образом:

  • Получите список существующих торговых марок
  • Создайте словарь brand_name - ›category. Это будет использоваться для проверки того, относится ли «предполагаемый бренд к той же категории, что и название бренда, которое мы заполняем. Это для особой осторожности.
  • Псевдокод для заполнения недостающих брендов,
for each brand and category in dataframe:    
    if brand is missing:
        for each brand in existing_brands:
            if brand exists in item_name_text\
               and category == brand_names_categories[brand]:
                    return brand

Используя это, я мог заполнить 1,35 274 отсутствующих торговых марок. Это около 27% изначально отсутствующих брендов.

Предварительная обработка текстовых данных

Следующие шаги были выполнены для предварительной обработки текста.

  • Разорвите текст. Например, не - ›не надо; Я я; Я - ›Я буду
  • Удалите знаки препинания и лишние пробелы
  • Удалить стоп-слова
  • Применение стемминга к тексту

Разделить категории на три части

Разделить категорию на три части с помощью одной строчки кода довольно просто:

Добавление названия предмета и подсчета слов описания предмета

Длина текста может быть решающим фактором для цены продукта.

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

Добавьте функцию дешевых или дорогих брендов

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

Поймите, что дороговизна продукта определяется не только его ценой, но и категорией продукта. Например, футболка для категории мужчин стоимостью 200 долларов очень [очень] дорога. Однако ноутбук по той же цене из категории Электроника считается воровством! Итак, вы видите, категория продукта сдвигает ценовую категорию продукта.

Теперь, говоря о нашем наборе данных, в каждой категории очень много товаров по разным ценам. Должен быть ценовой порог, чтобы определить, что продукт дорогой. Какую цену следует учитывать для каждой категории? Для этого я выбрал 95-й процентиль медианной цены для каждой категории. 95-й процентиль был выбран после анализа того, как изменяются цены после каждого процентиля, и 95-й процентиль казался подходящим порогом.

Сначала я создал словарь с общими категориями в качестве ключей и соответствующими им ценами 95-го процентиля в качестве пороговых значений.

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

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

Векторизация текста и категориальных данных

Машина не понимает "текст" как таковой. Нам нужно преобразовать его в некоторую числовую форму, чтобы мы могли применять математические формулировки [модели] поверх него. Это называется «векторизацией». Существует множество способов векторизации текстовых данных. Здесь я использовал векторизатор Tf-idf с биграммами и max_features = 1,00,000. Другой популярный вариант векторизации текста - это Countvectorizer. Их также называют векторизациями «мешок слов». Как работают Tf-idf и Countvectorizer, выходит за рамки этого блога. Однако я прикрепил ссылки в разделе ссылок, если вы хотите узнать больше.

6. Модели машинного обучения

Разделение поездов составило 80:20.

Прежде чем обсуждать модели и их оценки, напомню, что очень (x10) важно выполнить настройку гиперпараметров для любой модели машинного обучения. Все приведенные ниже оценки cv получены только после тщательной настройки гиперпараметров для каждой модели.

Регрессор лассо. Это модель линейной регрессии с регуляризацией L1. Используя эту модель, он дал оценку 0,7016 по набору резюме. Эта оценка выглядит не очень хорошо. Причина этого может заключаться в том, что L1-регуляризация по своей природе является очень сильной формой регуляризации. Это придает модели разреженность. Это означает, что он может снизить важность / вес функции до нуля. Таким образом, он полностью откажется от некоторых функций.

Риджевая регрессия. Это также модель линейной регрессии с регуляризацией L2. Регуляризация L2, несомненно, уменьшит веса для менее важных функций, но в отличие от L1, она никогда не уменьшит их до нуля. Это дало cv-оценку 0,4385. Это довольно хорошо работает по сравнению с Лассо.

SGD Regression - это регрессионная модель, в которой используется метод «стохастического градиентного спуска», в отличие от Ridge и Lasso, в котором используются «решатели». Было показано, что это дает лучшие результаты по сравнению с двумя вышеупомянутыми регрессиями. Оценка по cv составила 0,4359.

LGBM - это облегченная версия модели повышения градиента. Это модель ансамбля на основе дерева. Оценка cv с использованием этого была 0,4599. Это не дает лучших результатов по сравнению с рассмотренными выше тремя моделями. Причина этого кроется в природе этой модели, т. Е. «Модели на основе дерева». Древовидная модель не очень хорошо работает с данными с очень большим количеством функций. Здесь у нас 2,00,000+ функций, поэтому это не должно было дать нам лучших результатов.

FM FTRL: в этой модели используются машины факторизации (FM) с использованием подхода «Следуй за регулярным лидером» (FTRL). Для реализации этой модели использовалась библиотека WordBatch. Здесь я использовал 1000 измерений для FM. Это означает, что потребуется 1000 комбинаций функций из исходного набора функций и создание модели с использованием FTRL. Если вы хотите узнать, как работает FM FTRL, то ссылки для справки прилагаются в конце. Это дало лучшие результаты, чем все вышеперечисленные модели с оценкой cv 0,4265.

Регрессор стекирования: это еще один тип ансамблевой модели, в которой у нас может быть несколько базовых учащихся и одного мета-учащегося. Таким образом, базовые оценщики будут прогнозироваться индивидуально, и, кроме того, мета-оценщики будут принимать эти прогнозы каждой базовой оценщика как функции и делать прогноз. Отсюда и называется Stacking.
Я использовал ridge, sgdr и lgbm как базовые оценщики и xgb regressor как мета-оценщики. Это дало лучший результат по сравнению с тремя другими моделями регрессии (кроме FM_FTRL). Я не мог включить FM_FTRL в стек, потому что реализация FM_FTRL не имеет определенных элементов / функций, необходимых для клонирования объекта модели во время стекирования в sklearn. Был получен cv-балл 0,4283.

Регрессор голосования: я использовал два типа механизма голосования.

  • Регрессор голосования Sklearn: здесь я использовал ridge, sgdr, lgbm и регрессор суммирования в качестве базовых оценок (в моделях голосования нет мета-оценки). Эта модель работает даже лучше, чем автономный регрессор стекирования, давая оценку cv 0,4270.
  • Ручное голосование: здесь мне пришлось вручную взвесить прогнозы для более чем одной модели (лучшая модель получает больший вес). Попробовав несколько комбинаций, я выбрал FM_FTRL, регрессор стекирования и регрессор lgbm в качестве трех моделей, и каждая из них была взвешена в соответствии с ее индивидуальными характеристиками. Для трех моделей использовались следующие веса:
    fm_ftrl * 0.60 + sstacking * 0.18 + lgbm * 0.22
    На удивление LGBM-модель оказалась очень полезной здесь даже с наименьшим весом. Ни одна из трех других моделей не смогла показать лучшие конечные результаты, давая оценку cv 0,4210.

Все эти красивые оценки, НО ...

Глядя на эти оценки, я попытался представить результаты ручного голосования - лучшая модель на данный момент (по крайней мере, так кажется) на Kaggle. Однако на тестовом наборе данных 2-го этапа Kaggle, который состоит из 3,4 миллиона объявлений, я получил окончательную оценку 0,62143, что меня разочаровало. В конце концов, важен не результат cv, а окончательный счет на Kaggle. Это отражает истинный потенциал вашей модели.

7. Модели глубокого обучения

Наконец, мне пришлось прибегнуть к методам глубокого обучения (DL). Ниже приведены модели, с которыми я экспериментировал.

  • Модель ГРУ с использованием вложения слов Glove
  • 1D модель CNN с использованием вложения слов Glove
  • ГРУ использует встраивание слов Fast Text
  • Модель 1D CNN с использованием встраивания слов Fast Text
  • Сочетание CNN и ГРУ в единой модели
  • Простая модель многослойного персептрона (MLP)
  • Ансамбль лучших моделей

Введение в вложения слов

Ранее мы видели, что мы можем векторизовать текстовые данные с помощью Bag of Words (BOW). Если вы видите, что он работает, то вы обнаружите, что при векторизации текста с помощью BOW мы не захватываем контекст слов. Мы просто используем простые методы для вычисления и присвоения номера каждому слову в отдельности. Лучшее, что мы можем сделать, это n-граммы (например, я использовал биграммы, которые учитывают 2 слова за раз), но векторизация n-граммов слишком затратна для обучения и хранения из-за большого количества результирующих функций. Также, если вы векторизуете текст, используя большие n [граммы], , то, в свою очередь, это ухудшит производительность модели, потому что в каждой результирующей функции слишком много слепых зон. ; также называется «проклятием размерности». (Теория снова выходит за рамки этого блога. Чтобы узнать больше, ссылки прикреплены в конце.)

Таким образом, исследователи нашли гораздо более эффективный способ представления слова, который также отражает его контекст. Их называют вложениями слов. Существует несколько типов встраивания слов, таких как Word2Vec, Glove, Fast Text и т. Д. Каждое вложение слов обучается отдельно на огромных наборах данных (как и весь текст Википедии) с использованием сложных моделей глубокого обучения, что приводит к определенному размерному представлению. для каждого слова (например, 100D, 200D, 300D и т. д.). Мы можем легко загрузить файл вложений слов, который находится в форме словаря, со словами в качестве ключей и их n-мерным вектором в качестве значения.

Модель ГРУ с использованием вложения слов Glove

Здесь для текстового представления я использовал вложение 200 измерений Glove, которые будут переданы через слой GRU. Для категориальных функций я использовал слой встраивания из 32 измерений. Это была простая модель без особой сложности. Я просто хотел посмотреть, как это работает. Полная архитектура изображена следующим образом:

[Ссылка на изображение, если изображение выше нечеткое. Откройте ссылку, затем щелкните правой кнопкой мыши изображение imgur, чтобы открыть изображение в новой вкладке, затем щелкните для увеличения]

Эта архитектура дала мне cv-оценку 0,4885. На тестовом наборе данных Kaggle (этап 2; 3,4 миллиона объявлений) мне было присвоено балл отправки 0,48415. Это выглядит неплохо по сравнению с традиционными моделями машинного обучения. Итак, теперь я могу продолжить работу над импровизацией этой партитуры.

1D модель CNN с использованием вложения слов Glove

Поскольку я был уверен, что модели DL будут работать лучше, по крайней мере, по сравнению с традиционными подходами ML, я решил использовать в своей архитектуре уровень 1D CNN. Слой 1D CNN обычно используется для текстовых данных. Он сворачивает только в одномерном пространстве (а тексты в одномерном пространстве). Для текстового представления я использовал встраивание перчаток из 200 измерений, которые будут пропущены через слой 1D CNN, за которым следует слой MaxPooling. Здесь я внес некоторые изменения в модель и попытался немного усложнить ее, используя пропускать соединения и конкатенации. Функции item_condition, shipping и is_exicing являются низшими кардинальными характеристиками. Эти и числовые данные (т.е. описание элемента и длина слова имени) напрямую используются в качестве входных данных в модели. Я на них пропустил подключение, глубоко в сети. Полная архитектура выглядит следующим образом:

[Ссылка на изображение]

Поначалу архитектура может показаться устрашающей, но, поверьте, это очень легко понять. Просто следуй по стрелкам!

Эта архитектура дала мне оценку отправки 0,44844 в наборе тестовых данных Kaggle . Это было даже лучше, чем простая модель GRU, которую я пробовал раньше.

ГРУ использует встраивание слов Fast Text

Поскольку существует несколько других типов встраивания слов, о которых говорилось ранее, на этот раз я решил использовать встраивания слов Fast Text 300D. Я использовал ту же архитектуру, что описан выше, но вместо уровня 1D CNN я использовал уровень GRU. В остальном вся архитектура точно такая же.

[Ссылка на изображение]

Эта архитектура дала мне оценку отправки 0,45643 в наборе тестовых данных Kaggle . Это был приличный результат, но не такой хороший, как у 1D CNN с использованием Glove.

Модель 1D CNN с использованием встраивания слов Fast Text

Здесь я использовал вложения слов Fast Text 300D для модели 1D CNN. Архитектура модели точно такая же, как у 1D CNN Glove, поэтому я не буду показывать ее снова.

Эта архитектура дала мне оценку отправки 0,43937 в наборе тестовых данных Kaggle . Это была лучшая оценка, которую я получил на данный момент!

Сочетание CNN и ГРУ в единой модели

Поскольку встраивание слов Fast Text оказалось более эффективным, я решил, почему бы не объединить модели 1D CNN и GRU в одной архитектуре и посмотреть, улучшит ли это результат?

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

[Ссылка на изображение]

Эта архитектура дала мне оценку отправки 0,46721 в наборе тестовых данных Kaggle . Это неплохая оценка, но не очень хорошая по сравнению с другими моделями, которые мы видели. далеко. Вы можете видеть выше, что я использовал блоки CNN-GRU в последовательном порядке. Поскольку я не получил хороших результатов при использовании этой архитектуры, я попытался объединить блоки CNN-GRU, чтобы посмотреть, как они работают. Архитектура модели выглядит следующим образом:

[Ссылка на изображение]

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

Простая модель многослойного персептрона (MLP)

«Жизнь действительно проста, но мы настаиваем на ее усложнении» - Конфуций.

Попробовав эти сложные архитектуры, я подумал, почему бы не попробовать очень простую модель, используя всего несколько плотных слоев? Простая многослойная сеть персептронов. Здесь не будет вложений слов. Просто простые векторизаторы BOW, которые мы использовали ранее.

После обучения этой модели я получил оценку отправки 0,43909 в наборе тестовых данных Kaggle . Вау, это что-то потрясающее! Такая простая архитектура показала гораздо лучшие результаты, чем любая из рассмотренных выше сложных архитектур.

Что ж, Конфуций был действительно дальновидным человеком!

Ансамбль лучших моделей

Очевидно, я не собирался останавливаться на достигнутом. Поэтому я решил использовать ансамбль лучших на данный момент моделей DL. Я использовал модели Simple MLP, Fast Text CNN и Glove CNN. Я проводил ручное голосование по каждому прогнозу, так что лучший из них получает более высокий голос. Голосование проходило следующим образом:

Результаты были лучшими среди всех! Это дало мне оценку отправки 0,41689 в наборе тестовых данных Kaggle .

Этот результат попадает в верхние 2,77% частной таблицы лидеров, и моя позиция была бы 66-й.

8. Развертывание

Я создал веб-приложение с помощью Flask и развернул модель.

Вот короткая видео-демонстрация моего развернутого приложения.

9. Неудачные эксперименты.

Преобразованные цены Бокса-Кокса

Когда я преобразовал цены в преобразование коробки-Кокса, я получил подходящее значение λ, равное -0,2435. Обучение модели на значениях с прямоугольной рамкой в ​​качестве целей было довольно простым делом. Однако, когда я попытался преобразовать прогнозируемые значения в реальные цены, выполнив обратное преобразование box-cox, я получил значения nan для некоторых цен.

Причина этого в том, что при отрицательном значении λ максимально возможное преобразованное значение равно -1 / λ. Инверсии, связанные со значениями больше -1 / λ, будут комплексными числами и, следовательно, всеми nan.

БЕРТ

Вместо встраивания слов я попытался использовать вложение предложений с помощью BERT. Однако обучение с помощью BERT (и даже DistilBERT) отнимало слишком много времени. На прохождение одной эпохи ушло 4 часа (очевидно, на GPU)! Также была проблема нехватки памяти. Это из-за большого набора данных.

10. Дальнейшая работа и возможности для улучшений

  • Вместо двоичной функции - дешевое или дорогое - можно использовать несколько уровней «дороговизны» на основе процентилей.
  • Мы можем попробовать другие типы встраивания слов, например встраивания Word2Vec.
  • Мы можем попробовать множество других методов проектирования функций. Например, объединение столбцов описания и текста с последующим встраиванием в них слов.
  • Попробуйте сделать записку из Интернета и получите больше данных.

11. Ссылки

Ссылка на мой репозиторий GitHub



Профиль в LinkedIn