Часть 1

Сколько раз бывает, что вы заходите в магазин, наполняете тележку всевозможными вещами, просто чтобы понять, что это у вас есть дома / не хотите тратить ТАК много на просто конфеты / просто не хочется это больше. Кроме того, вы не чувствуете, что отправляетесь в поисках законного места для предмета в магазине, который довольно часто превышает ваше среднее расстояние, пройденное за день (упс?). Итак, вы бросаете его туда, где он есть.

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

Если вы ищете способы использовать фотографии из вашего магазина, чтобы определить, какие товары неуместны, этот (состоящий из двух частей) блог определенно для вас. В противном случае, если вас просто интересует, как сложить несколько моделей машинного обучения и глубокого обучения друг на друга, чтобы решить проблему с использованием данных изображений, читайте дальше! (Хотя это может занять некоторое время: P)

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

Постановка проблемы

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

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

1) Насколько быстро пользователь хочет получить результаты?

2) Как часто они будут их проверять?

3) Что важнее - свести к минимуму усилия или не оставить продукт неуместным?

4) Какое устройство они будут использовать для этого? Какие вычислительные ограничения будут у этого устройства?

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

Данные

Описание

У нас есть 3 файла:

1) embeddings.csv - содержит встраиваемые элементы размером (1280,1) изображений товаров в розничном магазине. Они были извлечены из одного из последних слоев современного классификатора изображений, обученного на наборе данных ImageNet. Я извлек его с помощью numpy.genfromtxt, чтобы получить массив формы (13008, 1280).

2) product_spaces.csv - содержит идентификатор области товаров, соответствующей каждому элементу. Форма становится (13008, 1) после расширения на одно измерение. Кажется, это категориальная функция, которая определяет конкретное пространство продукта для каждой записи.

3) plug_labels.csv - указывает, находится ли товар в нужной области продукта. 0, если данное пространство продукта правильное, 1 в противном случае. Все неуместные предметы называются заглушками. Форма становится (13008, 1) после расширения на одно измерение.

Я объединил эти три таблицы в единый фрейм данных с именами столбцов от «1» до «1282».

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

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

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

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

1) Разделение созданного выше набора данных на три исходные части для выполнения отдельных операций над каждой.

2) Создание словаря, содержащего количество вхождений для каждой области продукта.

3) Создание словаря, который сопоставляет 298 пространств продуктов с 298 значениями индекса.

4) Использование значений индекса как единой функции для пространств товаров в новом наборе под названием ‘cat_data’.

5) Нормализация всех столбцов в cat_data.

6) Нормализация внедренных значений для каждого столбца.

7) Создание векторов горячего кодирования для каждой области продукта. В результате форма будет (n_samples, 298). Кодировщик возвращает разреженную матрицу, которую необходимо преобразовать в плотную перед объединением с остальными данными.

8) Горизонтальное наложение нормализованных вложений, пространств продуктов с горячим кодированием и ярлыков плагинов для создания фрейма данных под названием ‘ohe_data’.

9) Присвоение имен всем столбцам в диапазоне от «1» до «1579». (1280 встраиваемых элементов, 298 элементов пространства для продукта + 1 элемент с этикеткой для вилки).

Исследовательский анализ данных

Сколько вилок в комплекте?

Данные сильно несбалансированы. В частности, есть 471 штекер и 12537 штекеров. Придется исправить это во время тренировки.

Сколько у нас уникальных пространств продуктов? Какие бывают ценности?

Значения полей продукта имеют порядок ~ 10¹⁰. Есть 298 уникальных площадок для товаров. Мы закодируем это как категориальную переменную, используя горячую кодировку.

Как выглядят другие функции?

Вложения функций имеют как положительные, так и отрицательные значения и находятся в диапазоне (-10, 10).

Можно ли отделять штекеры от штекеров с помощью этой функции?

Для этого я построил график TSNE в двух измерениях с метками в качестве меток вилок. Вот сюжет для «ohe_data»:

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

Теперь давайте создадим тот же график для cat_data:

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

Можно ли различить все товарные пространства на основе вложений?

Мы проверим, можно ли разделить все пространства продуктов с помощью встраивания функций изображения. Вот сюжет ЦНЕ:

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

Наборы данных, используемые повсюду

Два способа использования этих данных

1) Использование product_space в качестве функции и plug_label в качестве цели. Таким образом, мы проверяем для любого данного элемента (встраивания) и пространства продукта, правильность размещения / сопряжения. Метка вилки (цель) - 0, если да, в противном случае - 1. Мы попробуем это двумя способами:

а) Использование индексов пространств продуктов в качестве входных данных вместе с вложениями. В этом случае общая форма ввода будет (13008, 1281).

б) Использование представлений пространств продуктов с горячим кодированием вместе с вложениями. В этом случае общая форма ввода будет (13008, 1578).

2) Использование product_space в качестве цели. При обучении этой модели мы будем использовать только не-заглушки. Мы обучим глубокую нейронную сеть, чтобы изучить взаимосвязь между предметами и пространством продуктов. После того, как он это узнает, мы будем использовать тестовые данные (уже отложенные), чтобы предсказать количество продуктов для каждого элемента. Затем мы проверим, совпадает ли прогноз в случае штекеров и отличается ли он в случае штекеров. Форма ввода будет (13008, 1280), а форма вывода - (13008, 298).

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

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

1) X

Полные данные, которые будут использоваться во время обучения. Получено из ohe_data. Используется для повышения частоты дискретизации обучающих данных, содержит 4000 вставок, прошедших повышенную дискретизацию из 377 пробок с заменой. Окончательный вид - ›(14029, 1579).

2) x_unb, y_unb

Данные, отделенные от ohe_data перед повышающей дискретизацией, будут использоваться для тестирования. Окончательный вид - ›(2602, 1579), (2602,). Содержит 2508 штекеров и 94 штекера. Это разделение имитирует пропорции, указанные в исходном наборе, что должно отражать реальный сценарий.

3) X_cat

Полные данные, которые будут использоваться во время обучения. Получено из cat_data. Используется для повышения частоты дискретизации обучающих данных, содержит 4000 вставок, прошедших повышенную дискретизацию из 377 пробок с заменой. Окончательный вид - ›(14029, 1579).

4) x_unb_cat, y_unb_cat

Данные, отделенные от cat_data перед повышением дискретизации, будут использоваться для тестирования. Окончательный вид - ›(2602, 1579), (2602,). Содержит 2508 штекеров и 94 штекера. Это разделение имитирует пропорции, указанные в исходном наборе, что должно отражать реальный сценарий.

5) x_train, y_train

Получено из train_test_split из X. Все соответствующие модели будут обучены этому. Форма - ›(11223, 1578), (11223,).

6) x_train_cat, y_train_cat

Получено из train_test_split из X_cat. Все соответствующие модели будут обучены этому. Форма - ›(11223, 1281), (11223,).

7) x_cv, y_cv

Получено из train_test_split из X. Перекрестная проверка будет проводиться с использованием этих данных для всех соответствующих моделей. Форма - ›(2806, 1578), (2806).

8) x_cv_cat, y_cv_cat

Получено из train_test_split из X. Перекрестная проверка будет проводиться с использованием этих данных для всех соответствующих моделей. Форма - ›(2806, 1281), (2806).

9) x_sep_train, y_sep_train

Содержит все точки из x_train, которые предсказываются как пробки по гауссовской наивной байесовской модели (GNB). Форма будет варьироваться в зависимости от прогнозов. Вот это было (5137, 1578), (5137,). y_sep_train - это просто копия y_train.

10) x_sep_cv, y_sep_cv

Содержит все точки из x_cv, которые GNB предсказывает как пробки. Форма будет варьироваться в зависимости от прогнозов. Вот это было (1298, 1578), (1298,). y_sep_cv - это просто копия y_cv.

11) x_sep_unb, y_sep_unb

Содержит все точки из x_unb, которые предсказываются моделью GNB как пробки. Форма будет варьироваться в зависимости от прогнозов. Вот это было (711, 1578), (711,). y_sep_unb - это просто копия y_unb.

12) x_nb, y_nb

Копия функции x_train +, содержащей прогнозы, сделанные GNB на x_train. y_nb - это просто копия y_train.

13) x_nb_cv, y_nb_cv

Копия функции x_cv +, содержащей прогнозы, сделанные GNB на x_cv. y_nb_cv - это просто копия y_cv.

14) x_nb_unb, y_nb_unb

Копия функции x_unb +, содержащей прогнозы, сделанные GNB на x_unb. y_nb_unb - это просто копия y_unb.

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

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

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

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

Ссылка на GitHub: нажмите здесь.

Профиль LinkedIn: нажмите здесь.