В прошлом я изучал и тренировал различные модели машинного обучения и глубокого обучения. И реализация и механизм каждого алгоритма, который я изучил, становится сложнее и сложнее предыдущего. Поэтому, когда я начал делать свой проект по обработке естественного языка, я был готов поставить шестеренку на 5 и использовать самые сложные модели, которые я знаю, и получить максимальную точность, и жизнь будет прекрасна! Я не только оказался неправ, но и усвоил самый ценный урок: в конце концов, мир вращается только вокруг одной вещи — данных.

В этом блоге мы рассмотрим создание достойной модели из очень ограниченного, ровно 7200 необработанных текстовых обучающих данных и достигнем F1-Score 0,7 и потери Хэмминга 0,16.

Определение проблемы

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

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

Для оценки производительности модели мы будем использовать 2 метрики:

  1. F1 Score, Precision and Recall Matrix.
    Нам нужно знать долю точек данных, предсказанных как относящиеся к определенному классу (точность), а также всех предсказанных точек данных, какая часть из них была правильно классифицирована (отзыв).
    В качестве ограничения для нас Ложные срабатывания и Ложноотрицательные результаты могут быть очень дорогостоящими, поэтому мы используем F1-Score в качестве показателя производительности.
  2. Потери Хэмминга.
    Поскольку у нас есть проблема классификации с несколькими метками, потери Хэмминга помогут предсказать среднюю долю ошибочно предсказанных меток.

Понимание данных

Если посмотреть на метки отдельных классов, общий доступ к данным не очень сбалансирован.

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

Вот это настораживает, из 7200 точек 2000+ точек не относятся ни к какому классу [0,0,0]. Также существует очень мало точек данных, в которых сосуществуют 2 или более классов.

Для просмотра распределения длин предложений была построена ящичковая диаграмма, и было замечено, что 95% описаний содержат 25 слов и менее, но есть также описания, содержащие более 400 слов, поэтому существует очень асимметричное распределение длина описания.

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

Здесь я попробовал несколько вещей

  1. Использовали предопределенные векторы перчаток и значения tf_idf слова, чтобы преобразовать предложение в 300-мерный вектор.
  2. Используется Fasttext , встраивание на уровне слов, чтобы получить 300 тусклых векторов. FastText разбивает слова на несколько n-грамм (подслов). Например, триграммы слова «яблоко» — это app, ppl и ple. Вектор вложения слова для яблока будет суммой всех этих n-грамм.
  3. Используемые векторы ngram tf_idf (unigram, bigram, trigram) — 2853 измерения.

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

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

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

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

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

При изучении данных я узнал, что данные не являются грязными данными, в них нет тегов html или нежелательных элементов. Итак, я провел самую базовую очистку данных, убрав стоп-слова (a, the, am, are..), любые специальные символы и сокращения de (don’t -› do not).

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

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

Модельные эксперименты

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

«SMOTE сначала выбирает экземпляр миноритарного класса a случайным образом и находит его k ближайших соседей миноритарного класса. Затем синтетический экземпляр создается путем случайного выбора одного из k ближайших соседей b и соединения a и b для формирования сегмента линии в пространстве признаков. Синтетические экземпляры создаются как выпуклая комбинация двух выбранных экземпляров a и b.».

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

  1. Простая нейронная сеть

2. ЛСТМ

3. Си-эн-эн

4. Модель Берта для характеристики до 728 тусклого вектора с последующим применением простой нейронной сети.

К моему удивлению, ни одна из моделей, настроенных на гиперпараметры, не преодолела 0,6 F1score и 0,2 потери Хэмминга.

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

Я еще больше упростил модель, разделив проблему на 3 подзадачи, где я обучил 3 отдельные модели случайного леса, по одной для комментирования, взгляда и нащупывания. И во время прогнозирования я объединил результат трех моделей. Этого очень легко добиться с помощью библиотеки skmultilearn.problem_transform.BinaryRelevance.

Кроме того, я также попробовал более простые модели, чтобы проверить, как они работают с данными с бинарной релевантностью, например:

  1. Наивный Байес
  2. Логистическая регрессия
  3. Ядро SVMS
  4. RandomForest

Результаты не были шокирующими, я обнаружил, что случайный лес с бинарной релевантностью работает лучше всего с F1_score 0,7 и потерями Хэмминга 0,16.

Как мы видим, функции SMOTE, то есть синтетические функции, не добавили большого количества информации, чтобы оказать существенное влияние. Более того, модели глубокого обучения также не работали так же хорошо, как модели машинного обучения. Здесь Random Forest дал нам лучшую модель, и мы будем использовать Random forest в качестве нашей окончательной модели.

Результаты и заключение

Я смог получить f1_score 0,69 и потерю Хэмминга 0,16, проверенные на ранее неизвестных данных.

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

Будущая работа

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

Гитхаб



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



Многометочная классификация текста с помощью Scikit-MultiLearn в Python — YouTube



Курс AppliedRoots по прикладному машинному обучению.

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

Свяжитесь со мной