Нам нужно перевернуть вопрос, чтобы смотреть на преследователя, а не на цель. мы должны быть уверены, что можем выйти и посмотреть в глаза любому, кто стал жертвой преследований, и сказать: «Вам больше не нужно молчать. : Анита Хилл

Введение и обзор проблемы:

Как и в связи с ростом популярности #MeToo, в Интернете публикуется все больше личных историй и переживаний о сексуальных домогательствах и сексуальном насилии. Этот огромный объем онлайн-данных можно использовать для какой-то значимой работы. Поскольку не было проведено много исследований и анализа такого рода наборов данных, это дает нам большие возможности для работы над проблемами, связанными с социальными причинами. В этом тематическом исследовании делается попытка автоматически классифицировать различные формы сексуальных домогательств на основе рассказов, опубликованных на онлайн-форуме SafeCity, для обозначения ярлыков нащупывания / прикосновения, пристального взгляда / пристального взгляда и комментариев. Эта автоматическая классификация различных форм сексуальных домогательств может помочь властям и жертвам частично автоматизировать процесс заполнения онлайн-форм сообщений о сексуальном насилии. Источником вдохновения для этого проекта послужила эта исследовательская работа.

Постановка задачи

Предскажите типы сексуальных домогательств, описав происшествие. Инцидент может относиться к одной, нескольким или ни одной из трех категорий сексуальных домогательств, а именно: комментарий, прикасание / прикосновение и пристальный взгляд / пристальный взгляд.

Например: в описании «этот инцидент произошел в автобусе DTC No. 883 утра. Люди в автобусе оставляют комментарии и тоже пытаются найти повод для прикосновения. Такое случается очень часто ». положительно для трех классов: комментирование, пристальный взгляд / пристальный взгляд и прикосновение / ощупывание.

Источник данных

Источник данных: https://github.com/swkarlekar/safecity

Набор данных состоит из двух папок, одна для классификации по одной метке (binary_classification), а другая - для классификации по нескольким меткам (Multilabel_classification).

binary_classification: Эта папка состоит из трех подпапок, по одной для каждого класса, а именно commenting_data, groping_data и ogling_data. Каждая подпапка состоит из трех файлов CSV для обучения, разработки и набора тестов. Данные для однокомпонентной классификации представлены в двух столбцах, причем первый столбец представляет собой описание инцидента, а второй столбец равен 1, если категория сексуального домогательства присутствует, и 0, если нет. Для каждой категории есть 7201 обучающая выборка, 990 образцов для разработки / проверки и 1701 тестовая выборка.

Multilabel_classification: Эта папка состоит из трех файлов CSV для обучения, разработки и набора тестов. Данные для классификации с несколькими ярлыками состоят из четырех столбцов, в первом столбце содержится описание инцидента, а во втором, третьем и четвертом столбце - 1, если категория сексуального домогательства присутствует, и 0, если нет. Есть 7201 обучающая выборка, 990 тестовая выборка и 1701 тестовая выборка.

Здесь мы будем работать с данными с несколькими метками, поскольку мы ставим это как проблему классификации с несколькими метками.

На изображении выше мы видим, что есть три файла CSV для обучения, проверки / разработки и набора тестов.

Цели и ограничения реального мира

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

Проблема машинного обучения

Вышеупомянутая проблема предсказания метки по текстовому описанию может быть решена с помощью методов НЛП, которые мы обсудим позже.

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

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

Метрики оценки

В традиционных классификационных задачах, таких как мультиклассовые задачи, точность является наиболее распространенным критерием оценки. Кроме того, существует набор стандартных показателей оценки, который включает в себя точность, отзыв, F-меру и область ROC, определенную для задач классификации с одной меткой и несколькими классами. Однако в классификации с несколькими метками прогнозы для экземпляра представляют собой набор меток, и поэтому прогноз может быть полностью правильным, частично правильным (с разными уровнями правильности) или полностью неверным. Ни одна из существующих метрик оценки не отражает такое понятие в исходной форме. это делает оценку классификатора с несколькими метками более сложной задачей, чем оценка классификатора с одной меткой.

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

Мы будем отслеживать следующие показатели оценки:

Потеря Хэмминга (HL): потеря Хэмминга сообщает, сколько раз в среднем неверно предсказывается релевантность примера метке класса. Следовательно, потеря Хэмминга учитывает ошибку предсказания (предсказывается неверная метка) и недостающую ошибку (соответствующая метка не предсказывается), нормализованные по общему количеству классов и общему количеству примеров.

В идеале, мы должны ожидать потери Хэмминга, HL = 0, что означает отсутствие ошибки практически: чем меньше значение потерь Хэмминга, тем лучше производительность алгоритма обучения.

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

Где, I - индикаторная функция. Недостатком этой меры является то, что она не делает различий между полностью неправильным и частично правильным, что может считаться жестким.
Для учета частичной правильности можно использовать модифицированные версии точности, точности, отзыва и меры F1. .

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

Точность (P): это отношение предсказанных правильных меток к общему количеству предсказанных меток, усредненное по всем экземплярам.

Напомнить (R): это доля предсказанных правильных ярлыков к общему количеству фактических ярлыков, усредненная по всем экземплярам.

F1-Measure (F): среднее гармоническое значение точности (P) и отзыва (R) дает F1-Measure.

Как и в одноклассной классификации с одной меткой, чем выше значение точности, точности, отзыва и F1-балла, тем выше производительность алгоритма обучения.

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

Обзор данных:

Здесь у нас есть три файла CSV: train, dev и test, которые будут нашим набором для обучения, проверки и тестирования.

Каждый из этих трех CSV-файлов содержит четыре столбца:

  • Описание = Текстовые данные, описывающие инцидент
  • «Комментарий» = 1, если есть комментарий, иначе 0
  • “Ogling” / “Staring” = 1 , если пристальный взгляд присутствует еще 0
  • «Прикосновение» / «Нащупывание» = 1 , если прикосновение присутствует еще 0

Давайте посмотрим на 5 верхних строк данных поезда, загрузив их во фреймворк pandas.

Здесь, поскольку у нас очень мало точек данных для обучения, мы объединяем набор поездов и проверок и рассматриваем их как набор поездов.

Есть ли в наборе данных нулевые значения?

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

В наборе 658 повторяющихся строк и 93 в тестовой выборке. Теперь сохраняем первый экземпляр повторяющихся строк и дублируем остальные.

Давайте посмотрим на распределение этикеток.

Наблюдение:

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

Давайте посмотрим на распределение трех классов в сочетании друг с другом.

Наблюдение:

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

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

Униграмма Облако слов

Наблюдение:

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

Трехграммовое облако слов

Наблюдение:

Здесь мы получаем гораздо больше контекста, связанного с инцидентами домогательств, например, триграмма «in_the_evening» предполагает, что большая часть инцидентов может иметь место в вечернее время «in_the_bus». «On_the_road» также дает нам контекст, в котором сексуальные домогательства распространены.

Функциональная инженерия

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

Текстовые функции:

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

Разработка функций после предварительной обработки, давайте предварительно обработаем текстовые данные

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

Возможности TF-IDF:

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

Расчет TF-IDF:

TF-IDF для слова в описании рассчитывается путем умножения двух разных терминов.

  • TF (w) = (Сколько раз слово w встречается в описании) / (Общее количество слов в описании)
  • IDF (w) = log_e (общее количество описаний / количество описаний со словом w в нем)

Мы будем использовать функции tf-idf как на уровне слов, так и на уровне символов. Код для того же приведен ниже.

Числовые характеристики:

Нормализация числовых характеристик, которые мы вычислили ранее в разделе определения характеристик на основе текста.

Объединение слов TF-IDF, символов TF-IDF и числовых функций

Встраивание перчаток с утяжелением TF-IDF:

GloVe означает глобальные векторы для представления слов. Это алгоритм обучения без учителя, разработанный Стэнфордом для генерации встраивания слов путем агрегирования глобальной матрицы совпадения слов и слов из корпуса. Мы будем использовать предварительно обученное встраивание слов в GloVe. В этом проекте мы будем использовать 300-мерные векторы встраивания для каждого слова в корпусе.

Сначала загружаем предварительно обученную модель встраивания слов:

Мы создаем словарь со словом в качестве ключа и idf в качестве значения для взвешивания встраивания слов с tf-idf соответствующих слов.

Теперь создание встраивания GloVe, взвешенного по tf-idf, для данных поезда и тестовых данных. Ниже приведен фрагмент кода, показывающий процесс вычисления вложения GloVe, взвешенного по tf-idf, для данных поезда. Если для каждого слова в описании мы сначала проверяем, присутствует ли это слово в glove_words и tfidf_word, если да, мы получаем вложение для слова и соответствующее значение tf-idf, умножаем их и повторяем процесс для всех слов в описание, а затем суммируйте все эти векторы. Так мы получаем 300-мерное вложение для данного описания.

Сочетание функций взвешенного встраивания перчаток TF-IDF и числовых функций

Встраивание FastText:

FastText - это библиотека, созданная исследовательской группой Facebook для изучения представлений слов. FastText разбивает слова на несколько n-граммов. например, триграмма слова «девушки» будет разбита на «девушка», «девушка» и «рлс». Вложение слова для слова «девушки» будет тогда суммой всех этих трехграммных слов. Благодаря этому способу разбивки слов редкие слова могут быть правильно представлены, поскольку весьма вероятно, что некоторые из их n-граммов также встречаются в других словах. FastText может обеспечить хорошую производительность для представления слов, используя информацию на уровне символов. В этом проекте мы будем использовать предварительно обученную модель FastText с использованием библиотеки Gensim.

Встраивание слов FastText для обучающего набора

Теперь, когда у нас есть 300-мерное векторное представление для каждого из описаний в обучающем и тестовом наборе, мы делаем еще одну вещь: кодируем этот 300-мерный вектор в 50-мерный вектор с помощью самодельного автокодировщика. . Затем после добавления этих 50-мерных закодированных объектов к 300-мерным объектам, чтобы получить окончательное 350-мерное векторное представление для каждого описания. Код для части автоэнкодера можно найти в моем репозитории GitHub для этого проекта.

Конечный элемент с встроенным векторным текстом FastText, элементами с автоматическим кодированием и числовыми элементами

Построение модели машинного обучения

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

Существует три метода решения задачи классификации с несколькими метками, а именно:

  1. Преобразование проблемы
  2. Адаптированный алгоритм
  3. Ансамблевые подходы

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

Одним из недостатков этого метода является то, что он не учитывает зависимости между метками, если они существуют.

Существует библиотека scikit-mulitlearn, в которой реализована двоичная релевантность.

Полиномиальный наивный байесовский классификатор:

Сначала мы приспособим наивную байесовскую модель multinomila из scikit-learn к tfidf_train, который представляет собой векторизацию на уровне слова tf-idf для обучающих данных. У многочленных наивных байесов есть важный гипераметр альфа, который мы будем настраивать с помощью cv-формы scikit-learn для поиска по сетке.

После выполнения поиска по сетке по альфа-каналу мы получаем лучшее значение альфа, в результате чего максимальное значение показателя Micro F1 составляет 0,2.

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

То же самое с векторизацией tf-idf уровня символа и векторизацией уровня символа + слова, которую мы получаем после добавления векторизации уровня символа и уровня слова. Результаты отображаются в табличной форме.

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

Логистическая регрессия:

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

После выполнения поиска по сетке на C и решателе. Наилучшее значение C и тип решателя, которые мы получаем, в результате чего максимальное значение показателя Micro F1 равно 10 и «liblinear».

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

То же самое с векторизацией tf-idf уровня символа, векторизацией уровня символа + слова, внедрением GloVe с взвешиванием tf-idf и FastText + Autoencoder + числовым. Результаты отображаются в табличной форме.

Из приведенной выше таблицы логистическая регрессия с tf_idf (слово + символ) дает наилучшую потерю Хэмминга 0,1619.

Машина опорных векторов (классификатор)

Классификатор опорных векторов - это метод обучения без учителя, используемый для задач классификации. Мы будем использовать scikit-Learns реализацию классификатора опорных векторов (SVC) из класса sklearn.svm. Преимущество алгоритмов SVM в том, что они эффективно работают в многомерном пространстве. Он использует подмножество обучающих точек в функции принятия решения, также называемое векторами поддержки, поэтому оно также эффективно с точки зрения памяти. Важные гиперпараметры, которые мы будем настраивать здесь, - это C, который является параметром регуляризации, и ядром для определения функции принятия решения.

В приведенной выше ячейке кода мы устанавливаем SVC на X_tr_fasttext_final, который является обучающими данными для (FastText + Autoencoder + числовой) featurization

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

Модель классификатора опорных векторов с характеристиками tf-idf на уровне символов дает наилучшие потери Хэмминга 0,1636, что лучше по сравнению с другими характеристиками.

Случайный лес (классификатор)

Случайный лес (классификатор) - это метод обучения ансамбля для классификации, он работает путем построения нескольких деревьев решений во время обучения. Для задач классификации выходом классификатора случайного леса является класс, выбранный большинством деревьев. Гиперпараметр, который мы будем настраивать здесь, - это n_estimators, который в основном представляет собой количество деревьев решений в лесу, и max_features, который представляет собой количество функций, которые следует учитывать при поиске лучшего разделения.

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

Случайный лес с tf-idf (слово + символ) дает наименьшие потери Хэмминга 0,1632 среди других функций.

XGBoost (классификатор)

Extreme Gradient Boosting, также называемый XGBoost, - это программная библиотека с открытым исходным кодом, которая обеспечивает упорядочивающую структуру повышения градиента для C ++, java, python, perl, R, scala и julia. Модель XGBoost для классификации называется XGBClassifier. В XGBClassifier есть много гиперпараметров, которые мы настроим кучу из них, например Learning_rate, n_estimators, subsample и max_depth, с помощью класса RandomizedSearchCV () из библиотеки scikit-learn.

Результаты для различных характеристик показаны ниже.

Лучшие модели, основанные на потере Хэмминга

Мы можем видеть, что логистическая регрессия с характеристикой уровня tf-idf (слово + символ) дает лучшую потерю Хэмминга 0,1619. Теперь давайте создадим несколько моделей глубокого обучения и посмотрим, сможем ли мы добиться лучших результатов, чем лучшая модель машинного обучения, описанная выше.

Модели с глубоким уклоном

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

Двунаправленный LSTM со встраиванием GolVe

Поскольку мы имеем дело с текстовыми данными, с которыми в основном связана последовательность. Модель, с которой мы будем экспериментировать в первую очередь, - это двунаправленный LSTM, вы можете узнать больше о модели LSTM здесь. В нашем случае мы собираемся кодировать данное текстовое описание в вектор, этот вектор называется вектором контекста, затем мы передадим этот текстовый вектор контекста в плотный слой / слой классификации, чтобы получить классификацию.

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

Объект токенизатора класса Tokenizer () устанавливается на данные поезда, который связывает каждое уникальное слово в корпусе поезда с целым числом. Затем данные поезда и теста преобразуются, и мы также получаем размер словарного запаса.

Усечение и заполнение входных последовательностей так, чтобы все они имели одинаковую длину для модели, максимальная длина заполнения здесь составляет 300

Модель Архитектура

  • Первый слой - это входной слой, который использует векторы длиной 300 для представления входной последовательности.
  • Второй уровень - это встроенный уровень, который встраивает каждый токен в последовательности в 300-мерное вложение GloVe для представления каждого слова в последовательности.
  • SpatialDropout1D выполняет вариационное исключение в моделях NLP.
  • Следующий уровень - это двунаправленный уровень LSTM со 128 блоками памяти.
  • Следующая операция глобального максимального пула GlobalMaxPool1D () с последующим отключением 0,2
  • Следующий слой - это плотный слой со 100 единицами relu, за которым следует пакетная нормализация и слой отсева.
  • Выходной слой имеет 3 выходных значения, по одному для каждого класса. единицей активации для классификации с несколькими метками является сигмовидная.
  • Поскольку это проблема классификации с несколькими метками, в качестве функции потерь используется binary_crossentropy.

Обучение модели за 10 эпох

Оценка на тестовых данных

Построение графика точности и потерь модели по эпохам

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

Результаты показателей оценки для этой модели

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

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

Двунаправленный LSTM с CNN Conv1D с встраиванием слов FastText работает лучше всего с наименьшими потерями Хэмминга 0,1593, что является самым низким среди всех моделей, которые мы пробовали до сих пор. Итак, возьмем эту модель в качестве нашей последней модели для развертывания.

Развертывание

Конвейер развертывания

Создание веб-приложения с помощью streamlit

Смотрите полное видео здесь

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

  • Некоторые модели глубокого обучения переоснащались из-за очень небольшого количества данных, поэтому наличие большего количества данных определенно помогло бы преодолеть эту проблему. Другая проблема, вызванная меньшим объемом данных, заключается в том, что в методе векторизации, таком как tf-idf (слово + символ), количество функций было больше, чем количество точек данных.
  • В качестве описания используются текстовые данные. использование немного более продвинутых методов, таких как предварительно обученный BERT, чтобы получить вектор, связанный с данным описанием, в который встроена контекстная информация, может дать лучшие результаты.

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

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

Вы можете связаться со мной в LinkedIn и получить весь код этого проекта из моего репозитория GitHub.