Непрерывный проект машинного обучения

Классификация текста в Python

Научитесь создавать модель классификации текста на Python

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

В этой статье мы сосредоточимся на обучении модели контролируемого обучения классификации текста на Python.

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

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

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

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

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

Это можно рассматривать как проблему классификации текста. Классификация текста - одно из широко используемых приложений обработки естественного языка (NLP) в различных бизнес-задачах.

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

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

Я разделю процесс на три разных поста:

  • Обучение классификационной модели (этот пост)
  • Парсинг новостных статей (ссылка)
  • Создание и развертывание приложения (ссылка)

В этом посте рассматривается первая часть: обучение модели классификации. Мы рассмотрим это в следующих шагах:

  1. Постановка проблемы и подход к решению
  2. Входные данные
  3. Создание исходного набора данных
  4. Исследовательский анализ данных
  5. Функциональная инженерия
  6. Прогнозные модели

1. Постановка проблемы и подход к ее решению

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

2. Исходные данные

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

Он состоит из 2225 документов с новостного веб-сайта BBC, соответствующих сообщениям в пяти тематических областях с 2004 по 2005 годы.

  • Бизнес
  • Развлечение
  • Политика
  • Спорт
  • Техника

Файл загрузки содержит пять папок (по одной для каждой категории). В каждой папке есть отдельный файл .txt для каждой новостной статьи. Эти файлы включают тело новостной статьи в необработанном тексте.

3. Создание исходного набора данных.

Цель этого шага - получить набор данных со следующей структурой:

Мы создали этот набор данных с помощью сценария R, потому что пакет readtext значительно упрощает эту процедуру. Скрипт можно найти здесь.

4. Исследовательский анализ данных

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

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

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

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

Глядя на наши данные, мы можем получить% наблюдений, принадлежащих каждому классу:

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

Другой интересующей переменной может быть длина новостных статей. Мы можем получить распределение длины по категориям:

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

Записную книжку EDA можно найти здесь.

5. Разработка функций

Разработка функций - неотъемлемая часть построения любой интеллектуальной системы. Как говорит Эндрю Нг:

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

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

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

5.1. Текстовое представление

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

  • Векторы подсчета слов

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

  • TF – IDF Векторы

TF-IDF - это оценка, отражающая относительную важность термина в документе и во всем корпусе. TF означает Term Frequency, а IDF означает Inverse Document Frequency:

Значение TF-IDF увеличивается пропорционально тому, сколько раз слово появляется в документе, и компенсируется количеством документов в корпусе, содержащих это слово, что помогает учесть тот факт, что некоторые в целом слова встречаются чаще .

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

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

  • Вложения слов

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

  • Функции на основе текста или NLP

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

Мы также можем использовать функции на основе NLP, используя модели Part of Speech, которые могут сказать нам, например, является ли слово существительным или глаголом, а затем использовать частотное распределение тегов PoS.

  • Тематические модели

Такие методы, как скрытое распределение Дирихле, пытаются представить каждую тему вероятностным распределением по словам в так называемом тематическом моделировании.

Мы выбрали векторы TF-IDF для представления документов в нашем корпусе. Эти выборы мотивированы следующими пунктами:

  • TF-IDF - это простая модель, которая дает отличные результаты в этой конкретной области, как мы увидим позже.
  • Создание функций TF-IDF - это быстрый процесс, который сокращает время ожидания пользователя при использовании веб-приложения.
  • Мы можем настроить процесс создания функции (см. Следующий абзац), чтобы избежать таких проблем, как переоснащение.

При создании объектов с помощью этого метода мы можем выбрать некоторые параметры:

  • N-граммовый диапазон: мы можем рассматривать униграммы, биграммы, триграммы…
  • Максимальная / минимальная частота документа: при построении словаря мы можем игнорировать термины, у которых частота документа строго выше / ниже заданного порога.
  • Максимальное количество функций: мы можем выбрать первые N функций, упорядоченных по частоте использования терминов в корпусе.

Мы выбрали следующие параметры:

Мы ожидаем, что биграммы помогут улучшить производительность нашей модели за счет учета слов, которые обычно встречаются в документах вместе. Мы выбрали значение Minimum DF, равное 10, чтобы избавиться от чрезвычайно редких слов, которые встречаются не более чем в 10 документах, и Maximum DF, равное 100%, чтобы не игнорировать любые другие слова. Выбор 300 в качестве максимального количества функций был сделан, потому что мы хотим избежать возможного переобучения, часто возникающего из-за большого количества функций по сравнению с количеством обучающих наблюдений.

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

Следует упомянуть одно важное соображение. Напомним, что для вычисления оценок TF-IDF необходимо наличие корпуса документов для вычисления члена обратной частоты документов. По этой причине, если мы хотим прогнозировать по одной новостной статье за ​​раз (например, после развертывания модели), нам нужно будет определить этот корпус.

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

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

5.2. Очистка текста

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

  • Очистка специальных символов: специальные символы, такие как двойные кавычки «\ n», должны быть удалены из текста, поскольку мы не ожидаем от них какой-либо предсказательной силы.
  • Верхний регистр / нижний регистр: мы ожидаем, например, что «книга» и «книга» будут одним и тем же словом и будут иметь одинаковую предсказательную силу. По этой причине мы уменьшили каждое слово.
  • Знаки препинания: такие символы, как «?», «!», «;» был удален.
  • Притяжательные местоимения: кроме того, мы ожидаем, что «Трамп» и «Трамп» обладают одинаковой предсказательной силой.
  • Создание корней или лемматизация: выделение корней - это процесс сокращения производных слов до их корня. Лемматизация - это процесс сведения слова к его лемме. Основное различие между обоими методами заключается в том, что лемматизация предоставляет существующие слова, тогда как выделение корня дает корень, который может не быть существующим словом. Мы использовали лемматизатор на основе WordNet.
  • Стоп-слова: такие слова, как «что» или «что» не будут иметь никакой предсказательной силы, поскольку они предположительно будут общими для всех документов. По этой причине они могут представлять собой шум, который можно устранить. Мы загрузили список английских стоп-слов из пакета nltk, а затем удалили их из корпуса.

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

5.3. Кодирование этикеток

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

5.4. Поезд - тестовый сплит

Нам необходимо выделить набор тестов, чтобы доказать качество наших моделей при прогнозировании невидимых данных. Мы выбрали случайное разделение, в котором 85% наблюдений составляют обучающий тест, а 15% наблюдений составляют тестовый набор. Мы выполним процесс настройки гиперпараметров с перекрестной проверкой обучающих данных, подгоним под нее окончательную модель, а затем оценим ее с помощью полностью невидимых данных, чтобы получить как можно менее предвзятую метрику оценки.

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

6. Прогностические модели

6.1. Методология и модели настройки гиперпараметров

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

Мы пробовали следующие модели:

  • Случайный лес
  • Машина опорных векторов
  • K Ближайшие соседи
  • Полиномиальный наивный байесовский
  • Полиномиальная логистическая регрессия
  • Повышение градиента

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

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

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

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

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

6.2. Измерение производительности

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

  • Точность: показатель точности измеряет соотношение правильных прогнозов к общему количеству оцененных экземпляров.
  • Точность: точность используется для измерения положительных паттернов, которые правильно предсказываются из общего числа предсказанных паттернов в положительном классе.
  • Напоминание: отзыв используется для измерения доли правильно классифицированных позитивных паттернов.
  • F1-Score: этот показатель представляет собой гармоническое среднее между значениями отзыва и точности.
  • Площадь под кривой ROC (AUC): это измерение производительности для проблемы классификации при различных настройках пороговых значений. ROC - это кривая вероятности, а AUC - степень или мера разделимости. Он говорит о том, насколько модель способна различать классы.

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

6.3. Выбор лучшей модели

Ниже мы показываем сводку различных моделей и их оценочные показатели:

В целом, мы получаем действительно хорошие значения точности для каждой модели. Мы можем заметить, что модели Gradient Boosting, Logistic Regression и Random Forest кажутся избыточными, поскольку они имеют чрезвычайно высокую точность обучающего набора, но более низкую точность набора тестов, поэтому мы отбросим их.

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

6.4. Модель Интерпретации

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

Приведем пример неправильно классифицированной статьи. Фактическая категория - политика, хотя модель предсказывала технологии.

Депутаты выступили с угрозой Blackberry

Депутаты будут изгнаны из палаты общин, если они будут использовать Blackberry в помещении, которое постановил спикер Майкл Мартин.

Карманные компьютеры стоимостью 200 фунтов стерлингов можно использовать в качестве телефона, пейджера или для отправки электронной почты. На этой неделе устройства приобрели новую известность после того, как Аластер Кэмпбелл использовал свое устройство, чтобы случайно отправить ругательство журналисту Newsnight. Г-н Мартин сообщил, что некоторые депутаты использовали Blackberry во время дебатов, а также предостерег участников от использования скрытых наушников.

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

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

6.5. Графики уменьшения размерности

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

Существует множество приложений методов уменьшения размерности в машинном обучении. Один из них - визуализация. Уменьшая размерное пространство до 2-х или 3-х измерений, которые содержат большую часть информации, мы можем построить точки наших данных и иметь возможность распознавать некоторые закономерности как людей.

Мы использовали два разных метода уменьшения размерности:

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

Построим график результатов:

Мы видим, что использование метода t-SNE упрощает различение разных классов. Хотя мы использовали только методы уменьшения размерности для построения графиков, мы могли бы использовать их, чтобы уменьшить количество функций, которые будут использоваться в наших моделях. Этот подход особенно полезен в задачах классификации текста из-за обычно большого количества функций.

6.6. Прогнозируемые условные вероятности

Прежде чем приступить к процессу парсинга веб-страниц, мы должны принять во внимание дополнительные соображения. В наборе обучающих данных есть статьи с пометками «Бизнес», «Развлечения», «Спорт», «Технологии» и «Политика». Но мы могли бы подумать о новостных статьях, которые не вписываются ни в одну из них (например, о погодных новостях). Поскольку мы разработали модель обучения с учителем, такие статьи ошибочно можно отнести к одному из 5 классов.

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

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

Когда у нас есть статья, в которой ясно говорится, например, о политике, мы ожидаем, что условная вероятность принадлежности к классу «Политика» очень высока, а остальные 4 условные вероятности должны быть очень низкими.

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

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

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

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

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