И проблемы построения модели классификации для выбора элемента из списка произвольной длины

Для тех, кто не знаком с Strange Planet:

Что это?

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

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

Почему кто-то хочет предсказывать описание?

Почти каждый пост включает однословное описание комикса в следующем формате:

Со временем последователи начали угадывать это слово еще до того, как прочитали его (и объявляли, когда угадывали правильно). Это привело к таким дискуссиям:

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

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

Комиксы, отобранные для анализа

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

  • Комикс ровно 4 панели
  • Описание точно указано в комиксе.
  • Описание состоит только из одного слова

Этим критериям соответствует почти каждый комикс, что дает мне работу с 138 комиксами.

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

Количество слов

В среднем в комиксах "Странная планета" 35 слов. Самый короткий комикс состоит из 5 слов, а самый длинный комикс - из 74 слов. На панели 3 чаще всего нет слов (у 14% комиксов третья панель пуста).

Комиксы также становятся немного длиннее со временем:

Расположение описания сообщения в комиксе

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

Частота использования слов

Я запустил две модели, чтобы посмотреть, какие слова чаще всего используются в сообщениях. В первой модели я не исключал стоп-слова¹, потому что думал, что язык существ во вселенной Strange Planet может не иметь тех же стоп-слов, которые Python присвоил английскому языку. Я обнаружил, что 20 наиболее часто используемых слов в комиксах попадают в категорию стоп-слов, поэтому я создал новую модель, исключающую стоп-слова. (Постоянные читатели не удивятся, обнаружив «поддержку» наверху.)

Из второго списка слов я также построил облако слов, чтобы показать наиболее часто используемые слова в Strange Planet.

Анализ настроений

Я использовал анализ настроений Naïve Bayes² из библиотеки TextBlob. На основе этого анализа я зафиксировал вероятность того, что комическое или описательное слово имеет положительный оттенок.

Несколько моментов, на которые следует обратить внимание из этого анализа настроений:

  • Описание, скорее всего, будет проанализировано как имеющее нейтральное отношение (вероятность = 0,5). Это имеет смысл, потому что в описании меньше материала, из которого можно сделать вывод, чем во всем комиксе.
  • Синяя линия указывает на область графика, в которой тональность комикса и тональность описания совпадают. Над этой строкой описание скорее положительное, чем комическое. Под этой строкой комикс скорее будет позитивным, чем описание. Большинство точек находится ниже линии, что указывает на то, что комиксы, как правило, интерпретируются как более позитивные.
  • Вообще говоря, комиксы «Странная планета», скорее всего, будут иметь положительные эмоции (больше точек находится в правой части графика).

Длина слов

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

Модель

Несколько предположений

До сих пор стоп-слово никогда не использовалось в качестве описания. Чтобы упростить мою модель и сделать ее (возможно) лучше, я предположил, что стоп-слово никогда не будет использоваться для описания сообщения.

Из всех комиксов дважды используются только два описательных слова (остальные уникальны):

d e l i b e r a t e

c o m p l e t i o n

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

Проблемы построения модели

Обычно, когда вы создаете модель классификации, вы хотите, чтобы она принимала входные данные и выводила классификацию для этих данных:

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

Чтобы обойти эту проблему, я преобразовал свои обучающие данные³ в традиционную задачу классификации, в которой каждое слово в комиксе представляет собой уникальный образец. Прогноз, сделанный для каждого образца слова, помещает его в одну из двух категорий: «это описание» или «не является описанием». Это позволило мне построить стандартную модель классификации (в случае этого проекта модель случайного леса).

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

Несбалансированные классы

Из-за метода, который я использую для создания набора обучающих данных, мои данные разделяются таким образом, что:

  • 3,8% моих образцов находятся в группе «это описание»
  • 96,2% моих образцов находятся в группе «не описание»

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

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

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

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

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

Результат

К сожалению, моя модель оставляет желать лучшего. Из 37 комиксов, к которым я попытался уместить данные, я получил ровно ноль правильных слов. См. Ниже слово, которое я пытался угадать («слово»), в сравнении со словом, предсказанным моей моделью («rf_predict»).

Когда я подогнал модель к повторно выбранным обучающим данным, у меня были основания полагать, что модель будет работать хорошо. Моя оценка f1 составила 0,95, а точность - 0,97. Это было намного выше базовой точности, которую я выбрал для выборки, равной 75%.

Так почему же моя модель так плохо работает?

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

Обучающие данные решали гораздо более простую задачу классификации:

Данное слово является описанием или нет?

При случайном угадывании эта модель может быть верной в 50% случаев.

Однако данные тестирования были гораздо более сложным вопросом:

Какое слово из этого списка наиболее вероятно будет описанием?

При случайном угадывании шансы на правильность варьируются от ~ 20% до ~ 2%.

Некоторые другие причины, по которым было довольно сложно предугадать описание:

  • Хотя 138 комиксов - это много для создателя за короткий период времени, на самом деле этого недостаточно для создания хорошей модели.
  • В этом учебном лагере мой репертуар инструментов для моделирования данных растет с каждым днем. Возможно, через две недели я узнаю новый навык, который поможет мне лучше построить эту модель. Через год, со всеми новыми комиксами и всеми моими новыми навыками, кто знает, насколько моя точность могла бы улучшиться.
  • Функции ввода, которые я использовал, могут быть не очень предсказуемыми для вывода.
  • Метод, который я использовал для повторной выборки моих данных для улучшения моих несбалансированных классов, возможно, привнес новые проблемы.

Заключение

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

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

Я также успокоился, зная, что уже существует мультфильм "Странная планета", в котором признается, насколько сложно сделать определенные прогнозы:

[1] Стоп-слова - это слова, которые одновременно используются часто и несут мало смысла. В английском языке эти слова включают: I, the, it, who, that, because, any… Часто бывает полезно удалить эти слова, потому что они в первую очередь добавляют шум к моделям.

[2] В обработке естественного языка (NLP) модели наивного Байеса начинаются с предположения, что все слова независимы друг от друга. В некоторых случаях это может быть проблематично (например, если в тексте написано «не доволен», слова «не» и «счастлив» интерпретируются как не связанные). Хотя это может показаться наивным предположением (поняли? Поняли? :)), оно часто может давать полезные прогнозы. В этом случае, когда я сравниваю анализ настроений комикса со словом из анализа комикса, я считаю, что получу лучший результат, анализируя каждое слово независимо.

[3] Создавая прогнозную модель, вы всегда хотите разделить данные, которые у вас есть, на данные обучения и данные тестирования. Ваша модель строится на основе предоставленных обучающих данных. Затем, чтобы вы могли увидеть, насколько на самом деле предсказуемая модель, вы передаете ей свой набор тестовых данных (который она не видела раньше) для составления прогнозов.

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