Здесь я поделюсь, как я решил эту проблему.

Итак, начнем - -

Вот путь, который я выберу и объясню один за другим.

  1. Введение
  2. Бизнес-проблема
  3. Сопоставление с проблемой ML/DL
  4. Понимание данных
  5. Решение для первого разреза
  6. ЭДА
  7. Разработка функций
  8. Моделирование
  9. Результаты
  10. Выводы и будущая работа
  11. Профиль
  12. использованная литература

Давайте углубимся и разберемся в каждом разделе.

1. Введение -

Mercari — приложение для покупок в Японии. Они хотят предлагать цены продавцам, но это непросто, поэтому им нужна система или алгоритм, который автоматически предлагает цены на товары. Так что их владельцы поставили эту задачу на kaggle с каким-то призом.

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

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

Один из этих свитеров стоил 335 долларов, а другой — 9,99 долларов. Можете ли вы угадать, какой из них какой.

sweater_1 — Толстовки с капюшоном «Мстители» ABSOLUTE DEFENSE для мужчин и женщин Повседневная стильная толстовка Стандартный крой Зимняя куртка с капюшоном для мальчиков и девочек.

sweater_2 — Худи/толстовка с принтом ADRO Heartbeat Love Mom & Dad Design для мужчин и женщин.

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

Ценообразование продуктов становится все больше и больше день ото дня в крупных компаниях электронной коммерции. Таким образом, в основном проблема заключается в том, что когда какие-либо продавцы размещают свои продукты на веб-сайте электронной коммерции, затем они используют для заполнения цены на этот продукт, которая не соответствует продуктам, поэтому продукт не продается (предположим, что кто-то перечисляет свой геройский велосипед 10 лет назад по цене 40 000, так что очевидно, что никому это не нужно, потому что цена нового велосипеда героя сама по себе составляет почти 50 000). этот веб-сайт) не может получать прибыль от этого продукта. Так что если таких продуктов будет много, то компании придется нести убытки. Это проблема, которая может закрыть компанию. Итак, чтобы решить эту проблему, мы создадим модель мл, которая может предсказывать цену на основе

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

3. Сопоставление с проблемой ML/DL —

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

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

б. Нет никаких строгих проблем с задержкой, это может занять от 2 до 5 секунд.

в. Интерпретируемость важна.

Как мы знаем, это проблема регрессии. Здесь мы можем использовать RMSE, RMSE, MAE или R-SQUARED в качестве показателей производительности.

4. Понимание данных — —

Я скачал данные с самого конкурса kaggle.

Вы можете скачать данные из Здесь.

Вот информация о данных —

В наборе данных восемь столбцов.

1. Train_id — это идентификатор каждого товара. бывший. 1,2,3 и т.д.

2. Название — название товара. Бывший. Футболка MLB Cincinnati Reds, размер XL. Это текстовые данные.

3. Item_condition_id — это рейтинг товара по его состоянию. Бывший. 1,2,4 и т.д.

4. Category_name — категория товаров. Бывший. Мужчины/Топы/Футболки. Это категориальные данные.

5. Brand_name — название бренда товаров. Бывший. адидас. Это категориальный столбец.

6. Цена — цена товара, это целевая характеристика.

7. Доставка — оплачивается ли стоимость доставки продавцом или покупателем. Это будет 0 или 1.

8. Item_description — это описание товаров. Бывший. Полосатая мужская рубашка с капюшоном, красная, черная футболка. Это текстовые данные.

5. Решение первого разреза —

  1. Сначала я подготовлю данные, значит, я очистю данные и предварительно обработаю их.
  2. Я проведу предварительный анализ данных. Удалите выбросы на основе визуализаций.
  3. Предварительно обработайте текстовые данные и преобразуйте их в векторы с помощью tf-idf или лука или с помощью собственного обученного word2vec в нашем текстовом корпусе). Для векторизации tf-idf я могу использовать метод sklearn tfidfvectorizer.
  4. Я сделаю некоторые функции на основе https://arxiv.org/ftp/arxiv/papers/1612/1612.08333.pdf этого документа, как я посчитаю слова в описании продукта и сделаю его одной функцией, добавив термин частота все слова в описании и разделив его на длину предложения и т. д., мы создадим больше подобных функций на основе анализа.
  5. Затем я создам случайную модель и найду метрическую оценку, чтобы мы могли проверить, насколько лучше наши следующие модели.
  6. После этого я буду обучать некоторые регрессионные модели, такие как гребневая регрессия, а после этого я также создам модель MLP.
  7. Для обучения модели mlp я сначала обучу модель word2vec cbow на текстовом описании, для обучения модели word2vec я сначала сделаю данные из каждого фокусного слова описания в качестве метки и контекстного слова в качестве функции, здесь мы можем взять контекстное слово на основе анализа. для создания функции для каждого слова контекста сначала мы делаем размер вектора словарного запаса (слова в столбце описания), и в индексе вектора контекста я ставлю 1, а в других индексах я ставлю 0, так что это будет первое контекстное слово (представленное двоичным вектором ), скажем, если я выбрал контекстное слово как 5, поэтому мы выполним вышеуказанные шаги для каждого из 5 контекстных векторов, после всего этого я получу 5 векторов, каждый из которых имеет размер словарного запаса. мы сделаем это также для нашего фокусного слова, а затем предоставим входные данные в виде этих векторов контекста (которые мы сделали из контекстного слова, поэтому скажем, что наши vocab_size=50 и context_word=5, тогда вся длина входного вектора равна 250). У меня будет скрытый слой размером n (n - размер каждого вектора представления слова), а затем у меня будет выходной плотный слой узлов vocab_size с функцией активации softmax.
  8. Обучая эту модель, я получу матрицу векторов весов между скрытым слоем и выходным слоем размера (vocab_size, n), которые имеют репрезентативный вектор размера n для каждого слова.
  9. Используя модель word2vec, я преобразую каждую строку (столбец описания) в векторы размера n. А затем я буду использовать простую модель млп для обучения этих новых данных.
  10. По результатам буду дорабатывать дальше.
  11. По сути, мне приходится много настраивать гиперметр.

6. ЭДА —

  • Текстовые данные —

Сначала я предварительно обрабатываю текстовые данные. Текстовые столбцы в наших данных — это item_description и name.

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

Функция деконтракта — в этой функции мы преобразуем некоторую короткую форму в полную форму (если она есть в данных), например, «не будет» в «не будет» и многое другое. Вы можете увидеть код ниже —

def decontracted(phrase):
    # specific
    # in this function we are converting some short form to full #     #form like won't to will not
    phrase = re.sub(r"won't", "will not", phrase)
    phrase = re.sub(r"can\'t", "can not", phrase)
# general
    phrase = re.sub(r"n\'t", " not", phrase)
    phrase = re.sub(r"\'re", " are", phrase)
    phrase = re.sub(r"\'s", " is", phrase)
    phrase = re.sub(r"\'d", " would", phrase)
    phrase = re.sub(r"\'ll", " will", phrase)
    phrase = re.sub(r"\'t", " not", phrase)
    phrase = re.sub(r"\'ve", " have", phrase)
    phrase = re.sub(r"\'m", " am", phrase)
    return phrase
decontracted('this product isn't good, I can't buy it')
# output -------
# this product is not good, I can not buy it.

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

sen = re.sub(‘[^a-zA-Z \n\.]’, ‘’, sen)
# if sen ='oh no! this product is very bad,you should not buy it 😢'
# output ----
# 'oh no this product is very bad you should not buy it'

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

stop_words=stopwords.words(‘english’)
lemmatizer_=WordNetLemmatizer()
def preprocess_text_data(values):
 preprocessed_text=[]
 for sen in tqdm(values):
    sen=str(sen).lower()
    sen=decontracted(sen)
 # removing special characters
 sen=sen.replace(“‘s”,’     is’).replace(“’”,’’).replace(‘!’,’’).replace(‘,’,’ ‘).replace(‘-’,’ ‘).replace(‘.’,’’).replace(‘(‘,’’).replace(‘)’,’’)\
 .replace(‘\r’,’’).replace(‘\n’,’’).replace(‘\”’,’’).replace(‘&’,’’).replace(‘=’,’’).replace(‘?’,’’).replace(‘:’,’’).replace(“‘re”,’ are’)\
 .replace(“‘ve”,’ have’).replace(“‘m”,’ am’).replace(“‘t”,’ not’).replace(“…”,’ ‘).replace(“….”,’ ‘).replace(‘\\r’,’’).replace(‘\\n’,’’)\
 .replace(‘\\’,’’).replace(‘*’,’’).replace(“‘“,’’).replace(“;”,’’).replace(“+”,’’).replace(“%”,’’).replace(“ “,’ ‘)
 
 sen=sen.replace(‘/’,’ ‘).replace(‘[‘,’ ‘).replace(‘]’,’ ‘).replace(‘⚡️’,’’).replace(‘✨’,’’).replace(‘❤️’,’’).replace(‘#’,’’).replace(‘$’,’’)
 # lemmatizing each word in sentences
 sen = ‘ ‘.join(lemmatizer_.lemmatize(e) for e in sen.split() if e.lower() not in stop_words and len(e)>2)
 # except a-z and A-Z remove all things from sentence.
 sen = re.sub(‘[^a-zA-Z \n\.]’, ‘’, sen)
 #sen = re.sub(“ \d+”, “ “, sen)
 # reference — #https://stackoverflow.com/questions/33404752/removing-emojis-from-#a-string-in-python
 
 preprocessed_text.append(sen.strip())
 return preprocessed_text
preprocess_text_data('this's good...,I love this! ❤')
# output -----
# 'this is good I love this'

После написания этих двух функций я передаю каждый свой текстовый столбец функции Preprocessing_text_data один за другим, и функция возвращает список той же длины с предварительно обработанными значениями и, наконец, сохраняет все столбцы в df. Вы можете увидеть код для этого ниже —

df[‘name’]=preprocess_text_data(df[‘name’].values)
df[‘item_description’]=preprocess_text_data(df[‘item_description’].values)
  • Категориальные данные —

Теперь я перейду к категориальным данным. У меня есть два категориальных столбца в названии категории данных и названии бренда.

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

Давайте перейдем к category_name. В столбце category_name я делаю то же самое, переводя все категории в нижний регистр. Затем я провел некоторый анализ между предварительной обработкой и обнаружил, что столбец категории имеет максимальную категорию 5 и минимальную категорию 3, поэтому здесь я думаю, почему бы мне не сделать пять столбцов для каждой строки столбца категории (потому что может быть максимум 5 категорий в ряд) , посмотрим визуально —

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

df[‘subcat1’]=df[‘category_name’].apply(lambda x:x.split(‘/’)[0])
df[‘subcat2’]=df[‘category_name’].apply(lambda x:x.split(‘/’)[1])
df[‘subcat3’]=df[‘category_name’].apply(lambda x:x.split(‘/’)[2])
def subcat4_fun(x):
 try:
   c=x.split(‘/’)[3]
 except:
   c=’nan’
 return c 
 
def subcat5_fun(x):
 try:
   c=x.split(‘/’)[4]
 except:
   c=’nan’
 return c
df[‘subcat4’]=df[‘category_name’].apply(subcat4_fun)
df[‘subcat5’]=df[‘category_name’].apply(subcat5_fun)

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

Теперь я перейду к следующему разделу.

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

Выполнение EDA для данных и понимание каждой функции —

Сначала я увижу распределение цены. Сюжет смотрите здесь —

На этом графике я вижу, что цена большинства товаров ниже 50, а это означает, что очень мало товаров имеют очень высокие цены.

  1. Столбец имени — сначала я хочу понять, что слова, которые относятся к какому-то ценовому диапазону, могу ли я увидеть какое-то слово, которое определяет, является ли цена низкой или высокой. Итак, давайте построим облако слов с названиями продуктов, цена которых превышает 50.

Здесь я вижу, что слова «комплект», «Майкл кор», «Кейт Спейд» и т. д. имеют большой размер, поэтому эти слова очень часто встречаются в продуктах, цена которых превышает 50.

Давайте посмотрим на слова в названии продукта, цена которых меньше 50 —

Так что это интересно. Здесь я вижу, что тех слов, которые настолько велики в облаке из более чем 50 слов, здесь нет. Здесь чаще встречаются слова Victoria Secret, бесплатная доставка и т. д.

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

Теперь я строю график цены в зависимости от количества слов в названии продукта. Смотрите сюжет —

Я вижу, что здесь меньше продуктов с меньшей ценой, которые содержат 7,8 или 9 слов. Означает, что большинство названий продуктов содержат меньше слов как с низкой, так и с высокой ценой. Кажется, это не очень важно, если я посчитаю корреляцию между ценой и each_name_length, то я нашел 0,038, что не так уж и хорошо.

2. Item_condition_id —

Сначала посмотрите график подсчета item_condition_id —

Точек данных с item_condition_id 4 и 5 очень мало.

Я строю график рассеяния между item_condition_id и ценой.

На приведенном выше точечном графике, когда condition_id равен 5, цена всегда меньше 750, а для condition_id 1,2,3 цена также низкая и высокая, и ясно, что точек данных с item_condition_id 1,2 больше. и 3. Эта функция также не выглядит такой уж важной. Потому что корреляция между ценой и этой характеристикой невысокая.

Когда я вижу распределение цены для каждого condition_id, это подтверждает, что это не будет так важно. См. коробочную диаграмму -

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

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

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

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

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

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

Для анализа подкатегории 2 я построил график распределения цен по отношению к 20 ведущим подкатегориям 2, и это дало мне несколько лучших визуальных эффектов. Смотрите, вот блок-график -

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

Давайте посмотрим на 5 лучших ценовых распределений подкатегории 2 с каждым условием —

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

Увидев это, я могу сказать, что это будет важная функция.

5. Подкатегория 3 —

Здесь я также начертил то же самое, распределение цен топ-5 подкатегории 3. Здесь вверху есть подкатегория3, что означает, что для данного продукта нет 3-й подкатегории.

Давайте посмотрим на блок-график -

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

Снова заговор цена dist. каждой 5 лучших подкатегории 3 в зависимости от ее состояния —

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

Итак, давайте двигаться вперед.

6. Подкатегория 4 —

Этот столбец/функция имеет шесть категориальных значений. Посмотрите их ценовое распределение —

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

Вот так сделайте анализ для subcat5 и посмотрите. Я сделал это, но не упомянул об этом здесь.

Теперь пришло время взглянуть на еще одну функцию —

7. Торговая марка —

Если я говорю о функциях brand_name, первое, что я заметил, это то, что в нем много отсутствующих или nan значений. В 42% строк данных нет названия бренда. Как с этим справиться? Я расскажу об этом позже, сейчас посмотрите анализ со значениями nan.

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

Теперь давайте посмотрим на топ-10 самых частых ценовых распределений торговых марок —

Теперь смотрите дистрибутивы. Посмотрите на дистрибуцию Apple и Michael Kors, там цена колеблется в таком широком диапазоне, там цена также довольно высока, и посмотрите на розовый, тендендо и навсегда 21, их ценовой диапазон низок. Каждая торговая марка имеет свое собственное ценовое распределение. Это очень хорошая функция. Если у нас есть Apple в качестве торговой марки, то высока вероятность того, что цена будет высокой, но если торговая марка будет навсегда 21, то вероятность того, что цена будет высокой, очень мала. Так что это хорошая функция для прогнозирования некоторого диапазона цен.

Теперь посмотрите распределение цен на каждую десятку лучших торговых марок в зависимости от их состояния —

Теперь, если я увижу вышеприведенное распределение и возьму распределение цен лулулемона в зависимости от его состояния, то я увижу, что распределение лулулемона с условием 5 отличается от распределения лулулемона с условием 1, например, вы можете увидеть распределение цен Apple и Michael Kors по отношению к их состояние, см. Распределение Michael Kors с условием 5 и Michael Kors с состоянием 1, насколько они различаются (означает, что Michael Kors с состоянием 1 имеют более высокие цены по сравнению с Michael Kors с 5). Вы можете увидеть это и в ценовом распределении Apple.

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

Если вы видите весь блок-график, то есть одна общая черта во всех блок-графиках, я вижу здесь, что каждый синий блок немного впереди каждого оранжевого блока, это означает, что когда стоимость доставки оплачивается покупателем, цена высокая, если мы увидим, что торговая марка American Eagle с каждой доставкой (0 и 1) имеет различный ценовой диапазон от ценового диапазона Michael Kors и lululemon, и мы можем увидеть больше таких отношений.

8. Доставка —

Есть два значения: 0 означает, что стоимость доставки оплачивается покупателем, а 1 означает, что стоимость доставки оплачивается продавцом.

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

Если мы видим корреляцию между ценой и доставкой, она почти равна -0. 24. Что весьма неплохо.

9. Описание предмета —

Это полностью текстовая функция. Я строю графики рассеяния между ценой и количеством слов в item_description и получаю этот график.

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

Это все в части EDA. Вы можете сделать больше.

Давайте посмотрим тепловую карту корреляции между функциями и ценой —

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

Наконец, я выбрал 15 функций. Здесь вы можете увидеть —

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

Из предыдущего анализа мы знаем, что недоступность названия бренда влияет на цену, так что я думаю, что если я создам новую функцию только с 0 и 1, где указано имя_бренда, я сделаю его равным 1, а где нет, я сделаю его 0 ( посмотрите здесь, я не удаляю исходную функцию brand_name, я создаю новую функцию, назовем ее brand_name_exist_encoder). После добавления этой функции, когда я рассчитываю корреляцию между этой функцией и ценой, я получил значение почти 0,21, что довольно хорошо.

Итак, теперь у нас есть еще одна функция brand_name_exist_encoder.

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

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

Теперь в этом разделе я буду использовать три метода.

1. Одно горячее кодирование

2. Векторизатор TF-IDF

3. Word2Vec

Я мог бы сделать tf-idf word2vec, но ограничился только этими тремя.

В основном я сделал функции с каждым методом.

К категориальным данным я применяю только one_hot_encoding, но для текста я применяю эти три метода и создаю три набора функций —

(train_ohe, test_ohe), (train_tfidf, test_tfidf) и (train_w2v, test_w2v).

ПРИМЕЧАНИЕ. Здесь я устанавливаю все энкодеры только на поезд и преобразовываю как поезд, так и тест, чтобы предотвратить утечку данных.

  1. Одно горячее кодирование —

что означает одно горячее кодирование, предположим, у меня есть столбец brand_name, в котором часто встречаются три значения, предположим, у меня есть десять строк, здесь у меня есть три уникальных значения, поэтому я сделаю три столбца name из этих трех уникальных значений brand_name, теперь я выберет первый столбец и проверит, где строки (фактическое имя_бренда) имеют значение, такое же, как это имя первого_столбца, я сделаю его 1, а иначе - 0. Я сделаю тот же процесс для каждых оставшихся двух столбцов. Вы можете лучше понять это, увидев это изображение —

На изображении выше столбец A обозначает, где присутствует brand_name A, а где нет.

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

Я соберу все функции, включая числовую, также используя стек, и сохраню их как train_ohe и test_ohe.

2. Векторизатор TF-IDF —

Теперь я уже сделал одно горячее кодирование категориальных данных, так что не нужно делать это снова. Здесь мне нужно сделать только векторизацию tfi-df для текстовых данных (имя и item_description).

tf-idf означает Частота Термина * Обратная Частота Документа.

Формула частоты термина:

Термин Частота слова = нет. количество слов, присутствующих в предложении/общее количество слов в предложении.

IDF слова = log(номер предложения в корпусе/номер корпуса, в котором представлено слово).

Здесь TF придает большее значение словам, которые часто встречаются в предложении, а IDF дает важные слова, которые встречаются в очень меньшем количестве предложений в корпусе. В формуле IDF есть журнал, который предназначен для стандартизации значений, если журнала нет, то масштаб значений будет слишком большим, что не подходит для наших моделей.

давайте посмотрим на пример векторизатора tf-idf —

корпус — как дела, ты такой смешной, он смешной

теперь вычислите TF (вы в том, как вы) = 1/3 и idf (вы) = log (3/2)

поэтому наше значение tf-idf для вас в предложении «как дела» равно (1/3)*log(3/2).

Теперь я сделаю вектор, и размер этого вектора будет равен размеру словарного запаса корпуса. В моем примере размер словарного запаса равен 7. Таким образом, вектор выглядит так (как, ты, такой, смешной, он, такой). Теперь векторное представление предложения «как дела» будет выглядеть как (tf-idf (как) ,tf-idf(есть),tf-idf(вы)=(1/3)*log(3/2),tf-idf(так),…….,tf-idf(есть)).

Теперь снова то же самое, я соберу все функции, включая числовую, также используя стек, и сохраню их как train_tfidf и test_tfidf, чтобы мне не пришлось запускать их снова.

3. Word2Vec —

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

увидев изображение ниже, вы поймете —

Теперь вопрос в том, как я буду генерировать вектор d-dim, поэтому здесь я решил преобразовать его в 100-мерный вектор, я сделал это с предварительно обученным вектором перчатки, как только вы загрузите эту предварительно обученную векторную модель перчатки, вы можете дать одно слово и он вернет 100-мерный вектор. Вы можете увидеть в коде, как это сделать, и да, вы можете скачать векторную модель перчатки с kaggle здесь или просто поискать в Google glove vector 100 d kaggle download, и вы ее найдете. Давайте посмотрим код —

Я сохраню его как train_w2v и test_w2v.

Теперь все наши наборы функций готовы, поэтому мы перейдем к первой модели.

8. Моделирование —

В соревнованиях kaggle предлагают использовать RMSLE в качестве метрики, почему? потому что на RMSLE меньше влияет выброс, если, скажем, у меня есть выброс в данных, теперь, если мы вычислим mse, то ошибка будет очень высокой, поэтому, если мы используем mse или что-то еще без журнала, то ошибка, которую мы получаем, на основе об этой ошибке мы не можем сказать, что моя модель хороша или плоха, например, скажем, у нас есть три данных в x_test, и все они теперь являются более важными, если ваша модель хороша, тогда она будет давать очень меньше ошибок, теперь, если я добавлю четвертые данные x_test, которые являются выбросами, поэтому теперь, когда вы оцениваете свою модель, вы получите очень высокую ошибку, и вы подумаете, что модель такая плохая, теперь, если вы замените ошибку журналом ошибок, то что будет делать журнал, он сожмет ошибка и показать вам лучшую ошибку.

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

Здесь я буду делать minmax масштабирование на y_train и x_train, minmax я подойду только на y_train и трансформирую y_train, здесь я не буду трогать y_test. посмотреть код —

scaler=MinMaxScaler()
scaler.fit(np.array(y_train).reshape(-1,1))
y_train_minmax=scaler.transform(np.array(y_train).reshape(-1,1))

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

y_pred=model.predict(test_tfidf)
# converting out y_pred to original scale.
y_pred1=(y_pred*y_train.max())-y_train.min()
# calculating mse
mean_squared_error(y_test,y_pred1)

Теперь сначала я сделаю случайную модель (например, тупую модель), чтобы мы могли видеть, что наши первые модели лучше, чем случайная модель, или хуже, чем случайная модель.

В случайной модели я возьму среднее значение y_train и сделаю его прогнозируемой ценой для всего x_test, а затем рассчитаю mse, см. код здесь —

avg_price=y_test_minmax.mean()
predicted_y = [avg_price for i in range(test_tfidf.shape[0])]
y_pred1=(np.array(predicted_y)*y_train.max())-y_train.min()
print("mean_squared_error on Test Data using Random Model",mean_squared_error(y_test, y_pred1))

когда вы запустите это, вы получите 2046.111599547367.

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

  1. Модель SGDRegression —
    Я подогнал три своих набора поездов (OHE, TF-IDF, WORD2VEC) один за другим к этой модели с настройкой гиперпараметров. Здесь я получил mse 1185 по данным OHE, 1263 по данным TFIDF, 1366 по данным W2V. Я вижу, что данные OHE дают лучшие результаты.
  2. Модель LGBMRegressor —
    Здесь я получил mse 1041 по данным OHE, 1002 по данным TFIDF, 1065 по данным W2V. Я вижу, что данные OHE дают лучший результат. здесь у меня лучший результат по данным tfidf.
  3. Модель регрессии хребта —
    Здесь я получил 1108 по данным OHE, 1157 по данным TFIDF, 1303 по данным W2V. Я вижу, что данные OHE дают лучшие результаты. здесь я получил лучший результат по данным OHE.
  4. Модель регрессии Лассо —
    Здесь я получил mse 1592 по данным OHE, 1672 по данным TFIDF, 1644 по данным W2V. Я вижу, что данные OHE дают лучшие результаты. здесь я получил лучший результат по данным OHE. это худшая модель на данный момент.
  5. Модель XGBRegressor —
    Здесь я получил mse 1210 по данным OHE, 1236 по данным TFIDF, 1278 по данным W2V. Я вижу, что данные OHE дают лучшие результаты. здесь я получил лучший результат на данных OHE.

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

Теперь посмотрите производительность всех моделей в одном месте и какая из них дает наилучшие результаты на данный момент —

Выше я вижу, что лучшая модель и ее параметры, поэтому лучшая модель — LGMBMRegressor, которая дает нам ошибку 1002, обучена на данных tf-idf, а гиперпараметры — {'boosting_type': 'gbdt', 'learning_rate': 0.1, «max_depth»: 8, «n_estimators»: 200, «num_leaves»: 60}.

Использование некоторых методов укладки —

Техника ансамбля —

Теперь, продвигаясь вперед, я реализовал методы ансамбля, в качестве методов ансамбля я использовал стек, и я сначала написал код, выполняя настройку гиперпараметров. Я выполнил настройку гиперпараметров для meta_model, sample_size (на котором я обучал свои базовые модели) и base_models. Я сделал это для каждого набора функций (данные ohe, tfidf и w2v).

в основном для этого я сделал некоторую функцию, и, вызвав ее три раза, я получил три таблицы с гиперпараметрами и ошибкой (для данных ohe, для данных tfidf и для данных w2v), я покажу вам код и результаты ниже →

когда я тренировался над суммирующим регрессором на данных OHE, я получил результаты —

по данным tf-idf —

на данных word2vec —

лучший результат — 1009, когда данные — OHE, базовые модели — sgd_lgbm_ridge_lasso, each_sample_size — 250000, а meta_model — модель регрессионной регрессии.

Стекинг с использованием StackingCVRegressor с настройкой гиперпараметров —

Теперь я буду использовать StackingCVRegressor, с его помощью я смогу лучше настраивать гиперпараметры. Прочитайте о StackingCVRegressorздесь.

см. реализацию ниже -

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

по данным tf-idf —

на данных word2vec —

В приведенных выше результатах наилучший результат — 982 для данных OHE, когда базовые модели — sgd_lgbm_ridge_lasso, а meta_model — ridge.

это лучший результат на данный момент.

Теперь я подгоню свои данные word2vec к нейронной сети.

Внедрение моделей глубокого обучения —

Для модели глубокого обучения сначала я буду использовать свои данные word2vec для ее обучения. У меня уже есть данные w2v. Итак, вот код для структуры нейронной сети и обучения нейронной сети —

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

Обучив эту нейронную сеть на данных w2v, я получил mse 1011, что не лучший результат, помните, что в реализации стекирования у меня получилось почти 982.

Нейронная сеть со встроенными слоями —

Теперь я не буду использовать предварительно обученный word2vec для обучения нейронной сети, я буду изучать свой собственный вектор для каждого слова (в категориальных и текстовых данных) через слой встраивания.

Для обучения этой нейронной сети я должен сначала преобразовать каждый категориальный столбец и текстовый столбец в последовательность целых чисел, что я сделал с помощью предварительной обработки keras. предположим, мне нужно преобразовать item_description в sequence , поэтому для этого сначала я подогнал столбец train_item_desc к tokenizer(keras.preprocessing.tokenizer.fit_on_texts(x_train)) и затем использовал texts_to_sequences для преобразования столбцов train_item_desc и test_item_desc в последовательности, и после этого я выполнили заполнение как для поезда, так и для текста с помощью метода pad_sequencs, так что все данные в train_item_desc и test_item_desc имеют одинаковую длину. Давайте посмотрим на изображение ниже для большего понимания —

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

Давайте посмотрим код для структуры модели и подгонки данных к модели —

При обучении этой нейронной сети я получил mse 893, пока минимальная ошибка.

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

9. Результаты —

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

Лучшей моделью является модель нейронной сети со слоем встраивания, которая выдала ошибку 893.9278.

Я представил свою прогнозируемую цену модели на kaggle, я получил RMSLE 0,65249.

10. Выводы и будущая работа —

  1. мы можем улучшить нашу модель, сделав еще одну функцию, которая будет определять, присутствует ли торговая марка или нет. Бывший. если присутствует торговая марка, сделайте его 1, а если нет, сделайте его 0. если мы это сделаем, то ошибка может уменьшиться.
  2. Здесь я не использовал tf-idf взвешенный word2vec для характеристики, мы можем сделать это и посмотреть, как работают все модели.
  3. Для заполнения отсутствующих значений названия бренда мы можем использовать метод заполнения на основе прогнозирования модели. Мы можем взять все данные, где представлено имя_бренда, и сделать их как train_data, а где отсутствует имя_бренда, сделать их тестовыми данными, теперь подогнать модель к данным поезда и сделать прогноз для тестовых данных. но это будет сложно, потому что здесь у нас будет brand_name как target_variable, который является категориальным и имеет так много категорий. один подход для этого, я могу думать только о том, что вы можете удалить те строки из x_train, у которых brand_names очень редко встречаются в поезде, Ex . вы можете удалить точки данных, связанные с brand_name, которых меньше 5 или 10, таким образом вы можете уменьшить количество классов в target_variable.

11. Профиль —

Мой профиль на linkedin — https://www.linkedin.com/in/vishwas-upadhyay-36b94b1b6/

Ссылка на код на гитхабе — https://github.com/vishwas-upadhyaya/mercari_price_suggestion

12. Ссылки —

  1. https://www.appliedaicourse.com/course/11/Applied-Machine-learning-course
  2. https://machinelearningmastery.com/category/deep-learning/