Тысяча слов стоит картинки (или двух)
Цели:
- Используйте обработку естественного языка и машинное обучение, чтобы предсказать Subreddit, из которого возник новый пост, на основе его заголовка и текста описания.
- Создайте интерактивную информационную панель для анализа компонентов и понимания влияния различных методов НЛП на производительность модели.
Методы:
- Собирайте заголовки сообщений и тексты описаний из двух субреддитов.
- Векторизация извлеченных данных с использованием обработки естественного языка
- Обучайте модели бинарной классификации на векторизованных данных.
- Визуализируйте влияние различных методов векторизации и инженерных функций на моделирование.
- Оцените точность модели по ряду различных параметров.
Данные
Я выбрал два субреддита, заполненных исключительно ботами, генерирующими естественный язык (NLG), и собрал заголовок и описательный текст для всех сообщений в каждой категории, используя pushshift
Reddit API.
Обзор класса:
r/SS
|32,299
сообщений от6/2015–1/2020
удалено из240s
*
r/SubredditSimulator использует марковскую цепочку генерации естественного языка для симуляции субреддита, ограничивая публикации и комментарии набором предварительно созданных учетных записей ботов. Этот субреддит предназначен для просмотра, а не взаимодействия с ним.
2. r/GPT2
| 11,311
сообщений от 5/2019–1/2020
удалено из 118s
*
r/SubSimulatorGPT2 похож на (и был вдохновлен) r/SubredditSimulator, с основным отличием в том, что он использует GPT-2, а не простую модель цепи Маркова для генерации сообщения/комментарии.
*pushshift
ограничивает запросы до 1000 сообщений, поэтому я сегментировал парсинг по месяцам в r/SubredditSimulator (пик 688 сообщений в месяц) и по третям месяцев в r/SubSimulatorGPT2 (пик 2061 сообщений в месяц) с задержкой в 1 секунду между запросами.
Полный словарь данных доступен по адресу pushshift.io/api-parameters/
3. Word2Vec
Векторизатор подсчета
Модуль CountVectorizer
в sklearn
возвращает вектор для общего количества каждого слова в корпусе. Анализируя соответствующие частоты тысяч слов и фраз по мере их появления в разных классах, модель машинного обучения может предсказать класс незнакомого текста на основе ассоциаций, которые она «выучила» между определенными векторами (словами) и классами, на которых она обучалась ( r/SS
и r/GPT2
в данном случае).
Такие слова, как «the» и «of», появляются так часто, что могут создавать шум, затмевая слова, которые встречаются реже, но имеют большую прогностическую ценность. Мы называем их stop-words
. Ниже представлены первые 5 слов по общему количеству в обоих сабреддитах, включая и исключая стоп-слова.
Как показано выше, слово «the» появляется чаще в r/GPT2
, чем в r/SS
. Это и подобные различия в подсчете стоп-слов между классами, вероятно, означают артефакт соответствующих алгоритмов генерации естественного языка: по неизвестным причинам GPT2
боты используют определенные стоп-слова со значительно отличающейся скоростью, чем их SS
аналоги. Таким образом, хотя мы часто удаляем стоп-слова в НЛП, для этого проекта стоп-слова могут оказаться полезными для предсказаний.
Векторизация TF-IDF
Вместо того, чтобы вручную идентифицировать и удалять стоп-слова, мы также можем вычислить вектор частоты термина и обратной частоты документа (TF*IDF
). Частота терминов отражает важность слова в данном документе (как долю от общего количества слов в документе), в то время как обратная частота документов (IDF) добавляет веса терминам в зависимости от их важности (редкости) во всех документах.
Важно отметить, что по мере того, как термин появляется во все большем количестве документов, его вектор TF-IDF приближается к нулю. Кривая IDF для гипотетического корпуса из 100 документов ниже демонстрирует, как IDF понижает рейтинг общеупотребительных слов по сравнению с теми, которые встречаются в меньшем количестве документов.
Расчет TF-IDF: This is an example sentence.
TF для термина «пример» здесь равен 1/5
или .2
. Если термин «пример» появляется в общей сложности в 15 документах в нашем корпусе из 100 документов, приведенная выше кривая IDF предполагает соответствующий IDF примерно 2
. Таким образом, вектор TF-IDF для «примера» в этом предложении равен TF*IDF = .2*2 = .4
.
Я также рассчитал mean TF-IDF score
для каждого вектора, взяв среднее значение баллов в документах, где термин получил .1
или больше (адаптировано из метода, описанного в этой статье). Применение минимального порога к вычислению среднего позволяет избежать пересчета стоп-слов, которые появляются так часто, что их средний балл искажается. Этот расчетный показатель предназначен для приблизительного определения средней важности термина по всему корпусу.
Начальная загрузка
Путем «загрузки» случайных выборок из r/GPT2
данных (первоначально 11 311 сообщений) я создал фрейм данных почти в три раза больше, чтобы соответствовать количеству сообщений из r/SS
(32 299). Начальная загрузка требует выборки с заменой, потому что мы увеличиваем масштаб, используя дубликаты исходных данных. Ниже приведено упрощение: берутся изначально несбалансированные классы 5 и 2 и загружаются до 5 и 5 для сбалансированного набора данных.
4. Моделирование
Когда данные векторизованы, а классы сбалансированы, мы готовы приступить к моделированию. Со многими функциями традиционная модель логистической регрессии, вероятно, будет демонстрировать высокую дисперсию, поэтому я начал с подбора регрессии Риджа (логистическая регрессия со штрафом l2
) для решения потенциальных проблем мультиколлинеарности.
Оценка векторных коэффициентов модели выявила удивительную взаимосвязь между значениями бета и средними показателями TF-IDF. Для нескольких терминов с относительно небольшими средними баллами TF-IDF Ридж обнаружил удивительно большие величины их коэффициентов. Я предполагаю, что Ридж рассчитал более высокие бета-значения для этих терминов, чтобы противодействовать их меньшим векторным значениям, потому что они обладают большей предсказательной силой, чем первоначально предполагалось TF-IDF.
Эксперименты с дополнительными параметрами
Наконец, я создал интерактивную панель инструментов в Tableau для одновременного управления несколькими параметрами НЛП. Панель инструментов включает данные из многочисленных методов и моделей векторизации и позволяет искать определенные слова или фразы, чтобы увидеть, как различные векторы влияют на модель.
Результаты
Я стремился оптимизировать для отзыва или возможности точно идентифицировать сообщения, созданные ботами на основе GPT2
. Поскольку NLG, стоящий за r/GPT2
, более совершенен, чем в r/SS
, человеку довольно легко догадаться, какой алгоритм отвечает за данный образец текста. Я стремился построить модель, которая могла бы делать аналогичные прогнозы между двумя классами авторов ИИ.
Чтобы лучше понять последствия несбалансированных занятий, я протестировал 15 одноклассников на аналогичной задаче. Участникам дали 2 минуты, чтобы прочитать 10 случайно выбранных сообщений из каждого класса с включенными ярлыками, а затем 2 минуты, чтобы угадать классы для 10 новых сообщений без ярлыков. Участники не знали, что данные тестирования были отобраны из несбалансированных данных. Ниже приведены суммарные результаты этих тестов в дополнение к оценкам нескольких моих наиболее эффективных моделей машинного обучения:
Полиномиальные модели наивной байесовской классификации менее интуитивны для интерпретации коэффициентов (см. третий слайд интерактивной панели инструментов), но применение этой техники дало несколько лучшие результаты, чем Ридж, поэтому я нанес эти оценки выше.
Последняя итерация модели заработала показатель отзыва чуть более 80% после того, как я удалил посты с нулевым взаимодействием с человеком. Хотя публикация и комментирование в смоделированных сабреддитах разрешено только ботам, людям разрешено голосовать и взаимодействовать с контентом другими косвенными способами. Фильтрация только сообщений с каким-либо человеческим взаимодействием сузила набор данных до того, что можно было бы считать более репрезентативной выборкой каждого класса ботов.
Выводы:
- Необходимы дальнейшие исследования, чтобы понять артефакты стоп-слов, присутствующие в тексте, созданном NLG.
- Учитывая компромисс между величинами коэффициента Риджа и средними показателями TF-IDF, обработку данных и моделирование нельзя рассматривать изолированно, а скорее как часть более крупного процесса.
- Несбалансированные классы могут значительно снизить производительность модели, если с ними не обращаться должным образом. Это проблема не только машин, но и людей, когда речь идет о прогнозировании новых данных.
Спасибо за чтение!