Автор: Гириш Дешмукх, старший инженер-программист, Synerzip.
Машинное обучение — это подмножество одного из самых популярных и загадочных терминов в компьютерном мире; «Искусственный интеллект» или ИИ! В машинном обучении компьютеры применяют методы статистического обучения для автоматического выявления закономерностей в данных. С помощью этих методов можно делать очень точные прогнозы.
Чтобы способствовать обучению и внедрению, многие группы проводят соревнования по ИИ, ориентированные на разработчиков. Kaggle — одна из таких платформ, известная проведением соревнований по прогнозному моделированию и аналитике по всему миру. Они часто анализируют и бросают вызов талантливым людям, желающим преуспеть в методах машинного обучения. Как культура, команды Synerzip часто принимают участие в этих соревнованиях Kaggle, чтобы доказать свою техническую компетентность.
Один из таких вызовов был представлен компанией Mercari. У него самое большое в Японии приложение для покупок, созданное сообществом. Задача заключалась в том, чтобы предложить продавцам ценовые предложения. Но это сложно, поскольку их продавцы могут выставить на рынок Mercari практически все или любой набор вещей.
В этом конкурсе Mercari предлагает людям создать алгоритм, который автоматически предлагает правильные цены на продукты. Наша команда искусственного интеллекта взялась за решение этой реальной задачи по машинному обучению.
Вызов:
В этом конкурсе задача состояла в том, чтобы создать алгоритм, который автоматически предлагал продавцам правильные цены на товары. Они предоставили реальные текстовые описания своего продукта, введенные пользователем, включая такие детали, как название категории продукта, название бренда и состояние товара.
Подробнее об этом челлендже читайте здесь.
Мыслительный процесс:
Как сторонники гибкой методологии, мы разделили проблему на несколько шагов. Мы создали небольшие задачи и разделили их между членами команды.
Используемая технология:
- Исследование и анализ данных: Power BI
- Обработка данных и машинное обучение: Python
Мы следовали стандартным шагам машинного обучения, как показано ниже:
- Понимание проблемы бизнеса
- Исследование и анализ данных с помощью визуализаций
- Подготовка данных с использованием методов обработки данных
- Применить модель машинного обучения
- Оцените модель по заданным данным поезда и теста
Обычный рабочий процесс любого проекта ML, показанный Microsoft:
Исследовательский анализ данных
Анализ предоставленных данных является очень важным шагом в машинном обучении, поскольку он обеспечивает контекст, необходимый для разработки подходящей модели для решения проблемы.
С опытом мы поняли, что при оценке времени для решения задачи машинного обучения значительная часть нашего времени должна быть потрачена на анализ данных.
В R/Python есть ряд инструментов визуализации и библиотек для анализа данных. Мы выбираем Microsoft Power BI для исследовательского анализа данных, так как это интерактивный инструмент визуализации типа plug-and-play, простой для понимания и использования.
Предоставленные данные:
Для этой задачи были предоставлены два файла:
- Поезд.тсв
- Тест.tsv
Файлы состояли из списка списков продуктов. Эти файлы были разделены табуляцией.
- train_id или test_id — идентификатор листинга.
- name — Название листинга.
- item_condition_id — Состояние товаров, предоставленных продавцом
- category_name — Категория листинга
- brand_name — Название бренда
- доставка — 1, если стоимость доставки оплачивается продавцом и 0, если оплачивается покупателем
- item_description — Полное описание предмета
Входные данные для анализа данных были предоставлены в Train.csv.
Когда мы анализировали Train.csv, мы разработали несколько следующих визуализаций для анализа данных Train:
- Счетчик записей
Чтобы подсчитать общее количество записей в Train.csv.
- Определить переменную-предиктор
Нам нужно было определить переменную-предиктор. «Поле цены», представленное в Train.csv, было переменной-предиктором. Нам нужно было предсказать цены на товары в данных Test.csv. Ниже приведен снимок данных поезда:
- Подсчет Train_id по цене
Как показано на изображении ниже, диапазон цен составляет от 0 до 2000 долларов США. Это означало, что были какие-то грязные данные 0 $.
- Считать train_id по brand_name
Как видно на изображении ниже, почти 0,6 миллиона записей не содержат brand_names.
Предварительная обработка данных:
Метод интеллектуального анализа данных для преобразования необработанных данных в понятный формат называется предварительной обработкой данных.
Реальные данные часто зашумлены, непоследовательны и/или не имеют определенного поведения, а также могут содержать ошибки. Предварительная обработка данных является проверенным методом решения таких проблем. Мы использовали следующие методы предварительной обработки данных:
- Очистка данных
- Разработка функций
- Преобразование данных
- Очистка данных:
При очистке данных мы очистили данные, удалив записи с ценой «0» $ и заполнив пустые значения «имя_категории» значением «Другое». - Разработка признаков.
Разработка признаков — это процесс использования знаний предметной области о данных для создания функций, обеспечивающих работу алгоритмов машинного обучения.
В соответствии с анализом данных мы добавили следующие поля:
- Название + название бренда
Мы заметили, что большинство названий брендов также появляются в столбце «Название». Чтобы заполнить 0,6 миллиона пустых значений brand_name, присутствующих в Train.csv, как показано на диаграмме в точке 4, мы объединили Brand_name с name - Текст = Описание товара + название + название категории
Объединение трех вышеуказанных полей дает информацию о продукте в одном месте. После применения IDF (обратная частота документа) эта новая функция повышает точность модели. - Category_Name_X = Category_name + Item_condition_id
Согласно анализу, Category_name и Item_condition_id имеют отношение, поэтому после объединения этих двух полей модель дает хорошие результаты.
- Преобразование объекта:
- Стандартизация данных. В данных Train мы могли видеть, что цена не была нормально распределена. Поэтому мы применили метод логарифмического масштабирования, чтобы уменьшить цену в диапазоне 0,5–4.
- Фиктивные переменные. В регрессионном анализе фиктивная переменная — это числовая переменная, используемая для представления подгрупп выборки в вашем исследовании. В ситуациях, когда вы хотите работать с категориальными переменными, которые не имеют количественной связи друг с другом, используются фиктивные переменные.
- Используя «LabelBinarizer», мы можем создавать фиктивные переменные, поэтому мы использовали «LabelBinarizer» для следующих полей:
- название бренда
- перевозки
- item_condition_id
- Название_Категории_X
- Для следующих категориальных переменных мы использовали «HashingVectorizer»:
- имя
- текст
- Он превращает набор текстовых документов в матрицу scipy.sparse, содержащую количество вхождений токенов (или двоичную информацию о вхождениях), возможно, нормализованную как частоты токенов, если norm=’l1’, или спроецированную на евклидову единичную сферу, если norm=’l2’.
- Мы использовали несколько методов NLP в HashingVectorizer, чтобы удалить ненужные функции и создать новые функции из существующих последовательностей слов.
- Нграмма:
- Диапазон триграмм для построения функций ngram_range=(1, 3)
- Стоп-слова:
- Стоп-слова — это слова, которые мы хотим отфильтровать перед обучением классификатора. Обычно это высокочастотные слова, которые не дают никакой дополнительной информации для нашей маркировки. Мы предоставили собственный список стоп-слов: ['the', 'a', 'an', 'is' , 'это', 'это', ]
- Шаблон токена:
- Сопоставление с образцом — это проверка и обнаружение определенных последовательностей данных некоторого образца среди необработанных данных или последовательности токенов.
- Мы использовали шаблон токена как token_pattern=’\w+’
- Это означает, что ‘\w+’ соответствует любому символу слова (равному [a-zA-Z0–9_])
- Отбрасывать функции с очень низкой и очень высокой частотой:
- В этом варианте использования наблюдаемые признаки с частотой менее 3 не имеют значения.
- Также функции, встречающиеся в 90% записей, не имеют никакого значения, поэтому мы исключили такие функции.
- Трансформатор Tf-idf:
- Частота термина — это количество раз, когда слово встречается в данном документе. Обратная частота документа — это количество раз, когда слово встречается в корпусе документов.
- Использование «tf-idf» для взвешивания слов в соответствии с их важностью. Чтобы иметь такое же масштабирование и повысить точность, мы объединили все функции и применили к ним Tf-idf.
- Применение модели машинного обучения
- Выбор алгоритма машинного обучения зависит от имеющихся данных и предлагаемой задачи. Поскольку здесь нам нужно было предсказать цену продукта, это была проблема регрессии.
- Первоначально мы применяли линейную регрессию, но поскольку ограничение по времени для задачи составляло всего 60 минут, а у нас было 60 миллионов функций, линейная регрессия заняла слишком много времени.
- Мы заметили, что на данных Train точность была больше, чем на тестовых данных, поэтому модель переобучалась.
- Количество функций было 60 миллионов, а модель переобучалась, поэтому мы решили применить регрессию хребта.
- Ридж-регрессия снижает величину коэффициентов признаков, а также минимизирует ошибку между предсказанными и фактическими наблюдениями.
- Регрессия хребта —
- Выполняет регуляризацию L2, т.е. добавляет штраф, эквивалентный квадрату величины коэффициентов.
- Цель минимизации = LS Obj + α * (сумма квадратов коэффициентов)
- Производительность гребенчатой регрессии была намного лучше, чем у линейной регрессии, и мы также получили хорошую точность. Вот модель Ridge, которую мы использовали:
- Ridge(solver='auto', fit_intercept=True, alpha=0,6, max_iter=50, normalize=False, tol=0,01)
- Результаты
- Команда Synerzip показала впечатляющие результаты с хорошим временем: