Эй, 👋.
Я хочу поделиться своим опытом, участвующим в #melidatachallenge 2019. (Challenge Mercadolibre.com)
Я не эксперт. Мне нравится участвовать в конкурсах, подобных этому, чтобы узнать о машинном обучении и AI с реальными мировыми приложениями, вскоре я опубликую свой опыт и мое решение для вызова депрегар (классификация изображений).
Соревнование
Задача была очень интересной, классифицируя продукты электронной коммерции, используя только его названия.
Приз
Первое и второе место получат билеты в Кипоту. От 3 до 5 место Intel Movidius.
Результат
Мне удалось быть в топ-20 с оценкой 0,8954/1 Было более 150 участников, конкуренция была тяжелой и захватывающей. Конечно, я узнал много новых вещей.
jefferson1100001. | 0.895456 | 7 | 20 |
Давайте объясним мой подход
Первое, что я сделал, должен был посмотреть данные, Mercadolibre предоставлял два файла, rain.csv и test.csv. Вот как выглядит urch.csv:
Hidrolavadora Lavor один 120 бар 1700W Bomba A … | Electric_pressure_washers. | испанский язык | ненадежный |
Placa de Sonido – Behringer UMC22 | Sound_Cards. | испанский язык | ненадежный |
Maquina de lavar Electrolux 12 килограмм | СТИРАЛЬНЫЕ МАШИНЫ | португальский | ненадежный |
Существует 12 6444401 действительных строк, набор данных несбалансирован, а некоторые категории присутствуют на одном языке.
Предварительная обработка данных
Здесь я опишу свои предварительные процедуры без кода.
Удалить тильды Испанские и португальские слова имеют тилды, такие как Телефоно. Этот шаг мутирует слово Telefono.
Удалить слов сепараторы Некоторые заголовки имеют черту, точки и другие знаки препинания без пробела между ними, например Kit.ruedas.moto.
Я заменяю каждый из этих знаков с пространством.
- + , . ( ): [ ] { } _/
Удалить другие знаки препинания и цифры Я удалил любой другой знак пунктуации и цифры, но число должно быть окружено границей слова.
Токенизировать название Я подал заявку на WordPunctTekedizer, предоставленный NLTK, чтобы разделить каждый заголовок словами.
Удалить стоп слова По полученному множеству слов я отбросил стопорные слова, такие как: «ООН», «УСАС», «ООН) …
Стебель каждый токен Я использовал Snowballstemmer, предоставленный NLTK. Stemming – это процесс уменьшения надущих (или иногда полученных) слов к их слову стебля. Например: Cámara преобразуется в «CAM».
Результат предварительной обработки
Давайте посмотрим названия титулов до и после предварительной обработки:
Placa de Sonido – Behringer UMC22 | Plac Son Behring UMC22 |
Опртунидад! Ноутбук Dell I3 – 4 ГБ DDR4 – HD 1TB – Win 10 | Oportun Notebook Dell I3 4GB DDR4 HD 1TB Win |
Cámara Instantánea Fujifilm Instax Mini 9 – Azul Cobalto | CAM Instantane Fujifilm Instax Mini Azul Cobalt |
Я сохранил копию Train.CV со всеми назначенными названиями, список со всеми возможными категориями и списком со всеми этикетками.
Словарь:
Итализация всех предварительно обработанных названий и с помощью счетчика я создал словарь, содержащий слова, только если их частота. Это означает, что слово должно происходить как минимум два раза в некотором титуле.
Словарь выглядит так
{‘Kit’: 785233, «Оригинал»: 469537, «ПРАТУСКА»: 232647, «LED»: 220194, …}
Есть 1251,659 уникальных токенов, после фильтрации их словарь имеет 513,307 поставленные слова.
Превратим предварительно обработанные названия на номера на этом шаге, я использовал словарь для преобразования каждого заголовка в массив чисел. Это очень просто для каждого слова в заголовке, замените его соответствующим индексом слова в словаре плюс 1. (0 зарезервировано).
Предварительно обрабоможенный титул, как это:
[«Портон», «Гэп», «Хой», «MTR», «MARC»]
Становится:
[120, 121, 122, 123, 124]
Последовательность Max Word имеет LEN 27, если преобразованное название имеет прокладку менее 27 лет, мы прокладываем его Zeros Таким образом, каждый заголовок имеет ту же длину.
[120, 121, 122, 123, 124, 0, 0, 0, 0, 0, 0, 0, ….]
Теперь пришло время для обучения машине
Я использовал Tensorflow + Keras, модель имеет следующую архитектуру:
Ключевые моменты, которые вы должны знать
Случайные значения семян, так что вы можете получить воспроизводимые результаты.
Используйте стратифицированные образцы при расщеплении теста и поезда Это означает, что каждый набор должен иметь одинаковую долю классов.
Возьмите 1% для тестирования Набор данных относительно большой, 1%, кажется, представляет собой хорошее количество функций набора данных для проверки.
Используйте Class_Weights Из-за несбалансированной природы набора данных Class_Weights увеличил BACC модели.
Исследуйте данные локально И, возможно, предпроблесс локально, но использовать многопроцессорную
Используйте Colab или Kaggle Воспользоваться преимуществами ГПУ и тренироваться быстрее
Обучение:
После 18 эпох модели, кажется, добивается хороших результатов, прежде чем начать переоценить. Сбалансированная точность была: 0,86774697
Тестирование нового названия: если мы кормите модель с помощью полных новых данных, например:
"БУЗО Гарри Поттер чекументирует катушку Cicatriz Hogwarts
Это будет предсказать:
Sponshirts_And_hyvily.
Альтернативная попытка:
Я также создал небольшую модель только с 1400 категориями, представляющими надежное подмножество. Цель состояла в том, чтобы кормить эту модель с ненадежным подмножеством, чтобы определить, были ли ненадежные категории в неправильных категориях, но это добавляет сложность и я бы оптимизировал две модели вместо одного.
Следующие шаги:
- Вы можете использовать Label_Quality как-то, чтобы увеличить модуль ACC.
- Используйте путаницу Matrix или любые измерения производительности для обнаружения, где наша модель выполняет худшую.
- Используйте сложную архитектуру или CNN
Github со всем кодом:
https://github.com/jeffersonlicet/ml-titles-classification
Оригинал: “https://dev.to/jeffersonlicet/text-classification-using-machine-learning-tensorflow-ai-2pf5”