Эксперименты, решающие сложные бизнес-задачи, размещенные на Hackerearth компанией FactorBranded Data Warriors с помощью [Power of fastai library]

[Меры предосторожности: входящая стена текста с анализом. Ниже в значительной степени используются библиотеки fastai. Если у вас есть некоторый опыт работы с fastai libs, код будет иметь большой смысл]

Справочная информация о проблеме:

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

Цель:

Автоматизировать решение с компьютерным зрением

Размер предоставленного набора данных:

Приводится 100 000 наименований продуктов с их описаниями (от часов до iPhone и домашних ламп). Приблизительно 110 000 изображений приводятся с описанием их продуктов, и если их рентгеновские снимки совпадают (Верно - ›Рентген соответствует описанию продукта, а Неверно -› Рентгеновский снимок не совпадает описание товара).

Разберемся на небольшие действенные модули для решения этой огромной проблемы:

  1. Создайте текстовый классификатор, чтобы классифицировать описания продуктов по их «подкатегориям». Пример: Moto-G - это мобильный телефон, Saree - это женская одежда и т. д. [Примечание: попробовала классификацию на основе категорий, точность около 30-40%, что было не очень оптимально]
  2. Создайте классификатор изображений, чтобы проверить, соответствует ли рентгеновский снимок их подкатегории.

EDA с текстовым классификатором для прогнозирования подкатегории (Код):

  1. Примерно 8% данного набора данных о поездах классифицируются как «Ложные».
  2. Большинство поставок - «мобильные», около 60 000 мобильных
  3. 12 тыс. Товаров помечены как «без категорий»
  4. Создайте текстовый классификатор на основе SGD, чтобы описания продуктов соответствовали их подкатегориям.
  5. Присоединитесь к product_description.csv (предоставляется как часть набора данных для обучения) с описанием продукта и данными поезда.
  6. Замените NaN (подразумевая, что описания продукта не было в предоставленном нам файле) подкатегориями прогнозирования текстового классификатора.
  7. Удалите отрицательные строки (целевая переменная = False) и сохраните их как набор перекрестной проверки.
  8. Используйте положительные строки для построения классификатора изображений.

Понимание беспорядка реальных данных:

Одинаковые продукты написаны разными продавцами по-разному, поэтому создание текстового классификатора важно.

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

Книги классифицируются как «футляры, обложки и ширмы», давайте проверим подкатегории книг:

for i,row in df.iterrows():
    if 'books' in row['product_description'].lower():
        print(row['sub_category'])
Case, Cover and Screenguards
Books
Case, Cover and Screenguards
Case, Cover and Screenguards
Books
nan
nan
Books
Books
Home Decor and Furnishing
Speakers
Everyday Makeup
Books
Books
Speakers
Men's Clothing
Home Decor and Furnishing
nan
nan
Men's Clothing

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

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

Используйте наш текстовый классификатор (который дает точность 95% по набору данных поезда) над набором тестовых данных, чтобы получить «подкатегорию» на основе описания продукта.

Примечание. 95% точности не для набора перекрестной проверки, а для фактического обучающего набора, который был оснащен классификатором текста на основе SGD.

Создание классификатора изображений для подкатегории (Код)

Использовал архитектуру Densenet201 (трансферное обучение, обучение на Imagenet), чтобы получить довольно приличную модель с точностью около 83%. Учитывая, что рентгеновские снимки обычно не классифицируются, это неплохо.

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

Обнаружение поддельных отправлений :

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

Проведите время с данными:

Более глубокий анализ набора данных для обучения выявил некоторые интересные выводы.

~ 9000 отправлений оказались ложными. Некоторые из product_descriptions классифицированы как ложные со своими номерами,

iPhone: 918
redmi:816
galaxy:986
notebook:921
note:868
macbook:88
watch:598

Давайте возьмем настоящий рентгеновский снимок для MacBook Pro:

Macbook Pro явно имеет другую упаковку по сравнению с другими ноутбуками, то же самое с iPhone, Galaxy и т. Д.

Вместо того, чтобы строить классификатор более 70 подкатегорий, расширьте модель, чтобы классифицировать iPhone, Galaxy, Macbooks и т. Д. По отдельности, и вместо того, чтобы классифицировать все мобильные устройства вместе, классифицируйте отдельно в зависимости от производителя.

Последняя модель с наилучшими характеристиками (поскольку наша метрика - F1, мы делаем «ложные» прогнозы только тогда, когда мы абсолютно уверены, что поддельные рентгеновские изображения на самом деле являются поддельными):

pred = learn.predict_array(image[None])
    try:    
        our_pred = row['predictions']
        actual_pred = data.classes[np.argmax(pred[0,:])]
        if our_pred != actual_pred:
            if our_pred == 'mobiles' or our_pred == 'laptops' or our_pred == 'watches' or our_pred == "women's clothing" or our_pred == 'iphone' or our_pred == 'redmi' or our_pred == 'galaxy' or our_pred == 'note' or our_pred == 'notebook' or our_pred=='dslr' or our_pred=='macbook' or our_pred=='saree':
                print(str(i)+" "+our_pred+" "+actual_pred)
                df_test_org.loc[i,'product_description']=False
            else:
                df_test_org.loc[i,'product_description']=True
            if True:
                index_of=data.classes.index(our_pred)
                if np.exp(pred[0,index_of])>0.1:
                    df_test_org.loc[i,'product_description']=True
                      
        else:
            df_test_org.loc[i,'product_description']=True
        
    except:
        df_test_org.loc[i,'product_description']=True
        print("Error")

Инсайты и текущий уровень производства:

Применение ложных изображений в наборе данных для обучения: Применение этой модели к предоставленным ложным данным дает ~ 8000 прогнозов (файл CSV прогнозов вместе с прогнозом нашего классификатора изображений) из ~ 9000 поддельных отправлений. А что насчет других ~ 1000?

Одно из возможных объяснений заключается в том, что продукты на самом деле не являются поддельными, но оператор должен был убедиться, что это не так. Наша модель предсказывает с точностью 97%, что это мобильный телефон, но на самом деле это мошенническая доставка. Возможно, потребуется знать, почему такие изображения помечены как «Ложные».

Переход на производственный уровень: вместо того, чтобы в целом классифицировать как мобильные (поскольку большая часть подделок происходит на мобильных устройствах), создайте классификатор изображений на основе производителя (или сгруппируйте их на основе их сходства с продуктом). Например: Redmi, Xiomi, Galaxy могут иметь похожие рисунки на рентгеновском снимке, и мы можем сгруппировать их вместе.

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

Создайте лучший классификатор изображений. Хотя 83% достаточно прилично, чтобы получить достаточно хорошую оценку, это не будет оптимальным в производственных условиях, и нам нужно лучше классифицировать. Одно может быть: отсеять неправильные изображения, подаваемые в классификатор.

Спасибо за прочтение. Буду признателен за любые мысли по улучшению вышеуказанного автоматизированного решения.

Если интересно, загляните в Часть 1 конкурса (Классифицирующие футболки от myntra).