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

Оглавление

  1. Бизнес-проблема
  2. Использование машинного обучения / глубокого обучения для решения бизнес-задач
  3. Оценочная метрика (RMSLE)
  4. Исследовательский анализ данных
  5. Функциональная инженерия
  6. Существующие решения
  7. Мои эксперименты с моделями для улучшения
  8. Резюме, результаты и выводы
  9. Будущая работа
  10. Ссылка на мой профиль - код Github и Linkedin
  11. использованная литература

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

Это тематическое исследование основано на конкурсе Kaggle, проведенном в 2018 году приложением для онлайн-покупок Mercari. Ссылка на конкурс kaggle - https://www.kaggle.com/c/mercari-price-suggestion-challenge.

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

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

2. Использование машинного обучения / глубокого обучения для решения бизнес-задач.

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

Давайте посмотрим на одну строку обучающих данных и разберемся с ее полями. (Все данные обучения содержат ~ 1,4 миллиона списков элементов)

Анализ набора данных:

  • train_id или test_id: идентификатор объявления (идентификатор продукта)
  • Название: Это название товара / название товара, указанного продавцом. (Текстовый формат)
  • Идентификатор условия элемента: содержит одно из значений (1,2,3,4,5). В основном это число, которое представляет состояние элемента по шкале от 1 до 5.
  • Название категории: содержит таксономию категории продукта элемента в виде трехуровневой иерархии (разделенных разделителем /). В приведенном выше примере уровень 1 - электроника, уровень 2 - компьютеры и планшеты, уровень 3 - компоненты и детали.
  • Торговая марка: марка товара в списке.
  • Цена. Цена, по которой был продан товар. Это целевая переменная, которую мы будем прогнозировать.
  • Доставка: 1, если стоимость доставки оплачивается продавцом, и 0 - покупателем. Это логический тип данных.
  • Описание предмета. Содержит подробное текстовое описание предмета. Он содержит как можно больше информации о состоянии, характеристиках и всей другой информации, относящейся к продукту.

3. Оценочная метрика (RMSLE)

(Примечание. Это не RMSE. Это RMSLE)

Метрика оценки, которую использовали соревнования, была в основном баллом. RMSLE означает среднеквадратическую ошибку логарифма. Существуют метрики для проблем регрессии, такие как R², RMSE, MAE и т. д. Если мы задумаемся, зачем используется эта метрика, мы увидим, что она имеет различные преимущества с учетом нашей бизнес-проблемы. Я перечислю различные преимущества или то, как эта метрика конкретно поддерживает нашу бизнес-проблему.

RMSLE наказывает больше, когда вы недооцениваете, а не переоцениваете.

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

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

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

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

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

Распределение цен на товарные позиции

Цены соответствуют нормальному логарифмическому распределению. Из одного из существующих ядер Kaggle я узнал, что Mercari допускает прайс-листы только от 3 до 2000. Поэтому мы будем фильтровать эти списки товаров. На графике ниже видно, что цена бревна сосредоточена в районе 2,8–3,0, что составляет примерно 18–20 долларов США.

Колебания цен в зависимости от статуса доставки

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

Колебания цен в зависимости от состояния товара

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

10 ведущих брендов и их вклад в набор данных

Колебания цен по брендам

Эта функция содержит ~ 4800 брендов (при этом 60% строк отсутствуют). Ведущие бренды (по количеству) перечислены ниже во фрейме данных. Мы видим, что на 1000 ведущих брендов (~ 25% ведущих брендов) приходится около 97% товарных списков. (близко к распределению по степенному закону)

Колебания цен по основной категории

5. Разработка функций (создание новых функций)

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

Разработка функций (набор 1) - векторизатор числового текста

Итак, при выполнении EDA я заметил, что в описании предмета было много числовых данных, которые сыграли решающую роль в принятии решения о цене предмета. Например, 5 комплектов элемента XYZ, 10 комплектов элемента XYZ, 512 ГБ SSD компании XYZ, 256 ГБ SSD компании и т. Д ... Таким образом, мы можем заметить, что, хотя элемент принадлежит той же компании, но количество (числовое значение), связанное с ним, играет очень важную роль в определении цены. Итак, чтобы воспользоваться этим паттерном, наблюдаемым в данных, я написал свою собственную функцию векторизации. Итак, как работает эта функция? Итак, на этапе подгонки или на этапе обучения мы сначала находим все шаблоны, такие как (10 мл (NumberText), 50 пакетов (Number Text)). Мы сохраняем весь текст в словаре по индексу. В фазе преобразования или фазы текста мы возвращаем разреженную матрицу, например: предложение - «Мы продаем 10 пакетов твердотельных накопителей емкостью 512 ГБ компании XYZ» векторизация будет {packs: 10, gb: 512} будет (ключ: количество в текстовых данных). Этот метод помог мне сгенерировать примерно 27k новых функций.

Разработка функций (набор 2) - Год Извлечь год из текстовых данных

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

Feature engineering (set 3) - сгруппированная статистика цен

Я позаимствовал этот фрагмент кода из ядра Kaggle - ссылка. Он в основном получает статистику цен, группируя функции (Категория, Бренд, Доставка) вместе и генерируя статистику цен - Среднее, Срединное, Стд. Отклонение, Коэффициент вариации, Ожидаемые диапазоны цен на основе 2 Std. отклонения от среднего и т. д. Это имеет смысл, потому что мы в основном смотрим на исторические цены группы товаров и вводим их в набор функций, чтобы предположить, что они могут быть хорошо связаны с текущими ценами.

Разработка функций (набор 4) - оценка настроения

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

from nltk.sentiment.vader import SentimentIntensityAnalyzer
def generate_sentiment_scores(data):
    sid = SentimentIntensityAnalyzer()
    scores = []
    for sentence in tqdm_notebook(data): 
        sentence_sentiment_score = sid.polarity_scores(sentence)
        scores.append(sentence_sentiment_score['compound'])
    return scores

6. Существующие решения

Есть много ядер для разных подходов, некоторые из них включают:

  1. Модель ЛГБМ - ядро ​​ссылка. Использует LightGBM Regressor, чтобы получить результат 0,44.
  2. CNN с GloVE для встраивания слов - ядро ​​ссылка. Здесь используется модель CNN вместо встраивания слов в имя элемента, описание элемента объединено вместе с категориальными характеристиками для передачи его через Dense MLP. Модель дает оценку RMSLE 0,41 (35-е место)
  3. Модель конька - ядро ​​ссылка. Использует простую регрессию гребня по функциям Tfidf Text для создания прогнозов. Модель дает RMSLE 0,47
  4. Разреженное MLP - ядро ​​ссылка. При этом используется разреженный MLP для генерации вывода через Tfidf Vectorizations текста и One Hot Encoding категориальных функций. Модель дает RMSLE 0,38 (1-е место)

7. Мои эксперименты с моделями для улучшения

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

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

Выходная переменная - цена включает логарифмическое преобразование, как описано в разделе EDA.

Моделирование:

Модели регрессии LightGBM:

Моя первая попытка LGBM-модели. Я получил оценку RMSLE 0,4804.

import lightgbm as lgb
lgbm = lgb.LGBMRegressor(n_jobs=-1,early_stopping_rounds=None)
lgbm.fit(X_train,y_train)

Я выполнил настройку гиперпараметров для использования байесовской оптимизации, благодаря которой мне удалось получить оценку RMSLE 0,46.

Регрессор SGD

Я пробовал эту модель, так как у нее сравнительно меньше времени на тренировки. Я использовал Регуляризатор эластичной сетки с потерями как squared_epsilon_insensitive. С моделью я получил оценку RMSLE 0,5256.

MLP 1

Итак, ниже представлены две архитектуры MLP, которые я пробовал. Используя эту модель, мне удалось получить оценку RMSLE 0,412.

def mlp_1(X_train):
 tf.keras.backend.clear_session()
 model_in = Input(shape=(X_train.shape[1],), dtype='float32', sparse=True)
out = Dense(256, activation='tanh')(model_in)
out = Dropout(0.25)(out)
out = Dense(124, activation='tanh')(out)
out = Dense(64, activation='tanh')(out)
out = Dense(64, activation='tanh')(out)
out = Dense(32, activation='tanh')(out)
model_out = Dense(1)(out)
model = Model(model_in, model_out)
return model
def mlp_2(X_train):
 tf.keras.backend.clear_session()
 model_in = Input(shape=(X_train.shape[1],), dtype='float32', sparse=True)
 out = Dense(512, activation='tanh')(model_in)
 out = Dropout(0.25)(out)
 out = Dense(64, activation='tanh')(out)
 out = Dense(1)(out)
 model = Model(model_in, out)
 return model

Окончательная модель

Итак, в моей последней модели я объединил все модели и взял простое среднее.

y_final = (y_lgbm + y_sgr + y_mlp1 +y_mlp2)/4

8. Резюме, результаты и выводы.

Ниже приводится сводка всех обученных моделей и полученных оценок RMSLE. Как видим, ансамблевая модель - победитель.

Заключительная отправка невидимого набора тестовых данных в Kaggle дала оценку RMSLE 0,39718, которая попала бы в верхнюю 1% таблицу лидеров.

9. Будущая работа

Мы могли бы поэкспериментировать с этим, чтобы еще больше улучшить прогнозы -

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

10. Ссылка на мой профиль - код github и linkedin

Вы можете найти мой полный код здесь, на github ссылка. Вы можете связаться со мной в моем профиле linkedin ссылка, если хотите обсудить. Вы также можете связаться со мной по адресу [email protected].

11. Ссылки

Https://www.appliedaicourse.com/course/11/Applied-Machine-learning-course