Одной из самых больших школ интереса в огромном мире науки о данных является машинное обучение. Машинное обучение — это область исследований, направленная на то, чтобы компьютер максимально точно делал прогнозы на основе данных. Сегодня используются два основных типа машинного обучения: обучение с учителем и обучение без учителя. При обучении с учителем программист будет иметь доступ к данным, которые отображают результат определенного набора функций. Затем «исходные данные» можно использовать в качестве меры прогнозирования для моделирования процесса машинного обучения посредством обучения. В контролируемом обучении метрики оценки классификации, такие как точность и точность, разблокируются для специалиста по данным, чтобы оценить, насколько хорошо работает его модель, тогда как, как и в регрессионном обучении, метрики оценки, такие как средняя абсолютная ошибка и среднеквадратическая ошибка, часто используются для достижения той же цели. измерения эффективности алгоритма машинного обучения. Во многих случаях у программиста может не быть доступа к «результативным данным» или данным прогноза, и ему приходится прибегать к неконтролируемому обучению. При неконтролируемом обучении применяются различные подходы, помогающие специалисту по обработке и анализу данных извлекать полезную информацию из данных. Часто неконтролируемое обучение будет включать анализ взаимосвязи между функциями. Такие методы, как «кластеризация» и «анализ главных компонентов», используются для классификации и определения значимости признаков для других моделей. В конечном счете, оба типа машинного обучения являются подмножеством разработки ИИ и уходят своими корнями в вычислительную статистику. Каждый тип машинного обучения является мощным и использует уникальные методологии для выявления закономерностей в данных.

Сегодня мы сосредоточимся в первую очередь на моделях машинного обучения с учителем и их использовании с практиками обработки естественного языка. В то время как наука о данных может интуитивно показаться областью только для анализа числовых данных (что правильно в буквальном смысле), большое внимание в промышленности уделяется интерпретации данных человеческого языка программным способом. Компании процветают, изучая то, что их пользователи говорят о них (особенно при анализе настроений), и машинное обучение — отличный способ решить проблему «как понять, что люди говорят, из большого набора данных на человеческом языке?» Давайте рассмотрим это, пройдя процесс классификации с использованием данных Reddit…

Рассмотрите это заявление о проблеме…

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

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

Ключевым выводом здесь является то, что это проблема бинарной классификации, где результат можно определить с помощью простого вопроса о том, связаны ли данные с тем или иным классом. Для этой конкретной постановки проблемы мы собираемся проанализировать, принадлежит ли содержимое отправки субреддиту «r/aww» или «r/natureismetal».

Что это за субреддиты и почему их изучение важно для решения нашей проблемы?

Каждый сабреддит имеет огромное различие в типе контента, который он демонстрирует. Это полезно понимать при рассмотрении того, насколько хорошо будет работать наша модель. Компьютеру или человеку может быть сложнее классифицировать похожий контент, тогда как полярность контента более интуитивно понятна. В «r/aww» текстовое содержание относится к сообщениям, которые вызывают положительные эмоции; содержание не графическое и не пугающее. Для «r/natureismetal» сообщения более тесно связаны с негативными настроениями, где допускается содержание NSFW («небезопасно для работы»); содержание часто более графично и более пугающе для свидетеля.

В любой заданной проблеме науки о данных значительная часть времени должна быть потрачена на исследование вовлеченного предмета. Недостаток знаний по предмету чаще приводит к плохому результату и, в конечном итоге, может распространять дезинформацию среди всех, кто решит учиться на вашей работе. Кроме того, исследования по соответствующим темам также могут помочь узнать больше о различных и более эффективных подходах, которые можно использовать для решения проблемы. В этом случае с помощью правил и руководств субреддитов было обнаружено, что каждый субреддит выражает разные изображения для того, что он выбирает для популяризации — это влияет на то, как создаются заголовки сообщений. Например, r/natureismetal требует, чтобы заголовки заявок были описательными, в то время как r/aww не имеет такого требования. Кроме того, r/aww запрещает любой «грустный» контент, в то время как r/natureismetal одобряет демонстрацию изображений животных или грандиозных природных явлений. Также было замечено, что каждый домен subreddit имеет огромную разницу в размере пользовательской базы: r/aww показал около 24,4 миллиона пользователей, а r/natureismetal — около 1,4 миллиона пользователей.

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

Все вышеперечисленное относительно сабреддитов и Reddit как платформы необходимо учитывать при анализе результатов. А пока продолжим анализ данных.

Какие данные мы анализируем?

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

Давайте узнаем, с чем мы работаем…

Хотя сначала это может быть трудно заметить, гистограммы, изображенные выше на обоих рисунках, показывают правильную асимметрию при наблюдении за комментариями к сообщениям из каждого субреддита. Это означает, что большая часть данных, которые у нас есть, непопулярны, и большинство представленных материалов имеют менее 100 комментариев. При более тщательном наблюдении было обнаружено, что ни один из материалов, связанных с r/aww, не получил никаких виртуальных наград, а самый высокий балл за r/aww составил всего 7 голосов — у r/natureismetal был пост с максимальным количеством голосов за 40 830. плюсы для сравнения. Такие наблюдения позволяют нам констатировать, что большая часть данных, которые мы здесь нашли, являются «новыми» и не подвергались такой тщательной проверке со стороны модераторов или пользователей. Существует вероятность того, что наши данные не помечены должным образом. Такое наблюдение необходимо учитывать при анализе ошибок в любых моделях обучения с учителем.

Введение в векторизатор счета

Компьютер не понимает текстовые языковые данные (по крайней мере, с трудом); он понимает только числовые данные — двоичные на самом фундаментальном уровне. Это означает, что любые наблюдаемые языковые данные должны быть преобразованы в числовые данные. Это достигается за счет горячего кодирования с использованием так называемого векторизатора счета от scikit-learn.

Векторизатор счетчика преобразует наши текстовые данные в массивы, выражающие состояние элемента слова. В этом случае мы будем рассматривать диапазон слов, проанализированных на элемент в нашем векторизаторе, как одно слово (мы наблюдаем диапазон n-грамм (1,1)). Для каждого случая, когда в корпусе языковых данных анализируется уникальное слово, наш векторизатор счета добавит «1» к своей ассоциативной ячейке в массиве. Эта «1» представляет логическое состояние переменной, ссылающейся на ее положение в подмножестве корпуса. Например, на картинке выше мы видим, что в левой таблице существует разделенный запятыми текстовый корпус «Красный, Красный, Желтый, Зеленый, Желтый». Векторизатор графа понимает, что в этом корпусе выражены только три уникальных слова: «Красный», «Желтый» и «Зеленый». С правой стороны мы видим таблицу из этих трех слов с массивами, охватывающими длину корпуса (ПРИМЕЧАНИЕ: в правой таблице отсутствует последняя строка… эта последняя строка должна читаться слева направо: [0, 1, 0 ]). При каждом соответствующем экземпляре векторизатора подсчета, анализирующем уникальное слово в корпусе, логическое состояние возвращает истину — все остальное будет ложным. Эти векторизаторы — очень простой способ быстро обнаружить тенденции в текстовых данных. Давайте посмотрим, что можно понять из текстовых данных с горячим кодированием на рисунке ниже.

На приведенном выше рисунке показано визуальное построение суммы логических значений из разреженной матрицы векторизатора счета, связанной с данными r/natureismetal. Это отличный способ для специалиста по обработке и анализу данных визуализировать частотность определенного слова (или выражения с большими диапазонами n-грамм) в текстовом корпусе. Наиболее частым словом, выраженным в r/natureismetal, является слово «the». Интуитивно следует признать, что эта информация не имеет смысла для нашего исследования. Мы не сможем точно различать контент между двумя сабреддитами, пытаясь выделить такое распространенное слово, как аномалия — почти в каждом абзаце, созданном на любом языке, будет использоваться определенный артикль «the». Такие слова, как «the», «and», «in» и многие другие обычно считаются стоп-словами в векторизации.

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

На Рисунке 6 и Рисунке 7 показаны скорректированные векторизованные наборы данных Count, включающие стоп-слова из пакета английского корпуса, известного как nltk (Natural Language Toolkit). Здесь мы начинаем раскрывать существенную разницу в языке в каждом сабреддите. В r/aww мы видим, что такие слова, как «кошка», «собака» и «милый», служат общими индикаторами для демонстрации изображения сабреддита. Для r/natueismetal мы видим, что такие слова, как «есть», «лев» и «орел», служат общими индикаторами для демонстрации изображения сабреддита.

Теперь тренируемся…

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

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

В этой задаче мы разделили наши данные на четыре набора с помощью scikit-learn: набор функций обучения, набор меток обучения, набор функций тестирования и набор меток тестирования. Теперь мы указали, что разделение на поезд-тест разбивает наши данные на «два» набора данных, а не на «четыре». Технически это по-прежнему верно, поскольку теперь у нас есть объединенный «обучающий» набор и объединенный «тестовый» набор — два полных набора данных, состоящих из 4 связанных наборов данных. Мы выбрали разделение 75/25, где 75% наших данных использовались для обучения, а 25% наших данных использовались для тестирования; разделение данных было выбрано случайным образом. Мы также включили в метод scikit train_test_split условие, которое разделяет наш метод выборки, чтобы убедиться, что наши метки равномерно распределены как по обучающим, так и по тестовым наборам. Это помогает нам устранить дисбаланс данных в процессе моделирования.

Каковы наши модели?

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

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

Что такое векторизатор TFIDF?

Мы узнали, что делает векторизатор счета, так почему же мы также используем векторизатор TFIDF? Векторизатор TFIDF работает аналогично векторизатору счета, где текстовый корпус преобразуется в разреженную матрицу для представления тех же данных. Разница в том, что векторизатор TFIDF применяет вес слова к разреженной матрице. Это делается путем анализа «частоты терминов» в данных, где указанный диапазон n-грамм корпуса учитывает, как часто он появляется в этом корпусе. Иногда мы обнаруживаем шум в данных, который можно отфильтровать, включив стоп-слова. Тем не менее, векторизатор TFIDF также будет выполнять некоторые собственные исправления после векторизации, анализируя «обратную частоту документа»; это уменьшит вес слов, слишком часто встречающихся в разных корпусах.

Предположим, мы заметили, что слово «the» осталось в нашем анализе векторизатора TFIDF для нашего исследования. В отдельном посте на сабреддите слово «the» может появляться в два раза чаще, чем все другие уникальные слова в заголовке. Следовательно, его термин частота больше и может иметь больший вес. Однако, если «the» появляется более чем в два раза чаще во всем наборе данных r/aww и r/natureismetal, мы не можем оправдать увеличение его веса в нашем наборе данных. Следовательно, векторизатор TFIDF также рассмотрит возможность уменьшения веса слова «the», поскольку его значимость незначительна.

Каковы наши модели?

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

Наивные байесовские модели предполагают, что каждая из наших функций независима друг от друга. Для нашего исследования это может показаться не очень хорошей моделью для включения, поскольку наши функции могут иметь некоторое отношение друг к другу. Рассмотрим пример, где наблюдается выражение «нехорошо»; «нехорошо» — это выражение, демонстрирующее негативные чувства, но это описание, в котором слово «не» противоречит однословному выражению слова «хорошо». Чаще это предположение нарушается, но это не лишает его возможности быть полезной моделью классификации из-за его способности использовать сглаживание Лапласа для воздействия на вероятный вес n-грамм в его корневой байесовской формуле вероятности. В гауссовом наивном байесовском подходе считается, что значения признаков нормально распределены в наборе данных, где используется среднее частое свойство (среднее), помогающее классифицировать, насколько вероятно свойство связано с меткой. В полиномиальном наивном байесовском методе предполагается полиномиальное распределение с функциями, подходящими для дискретной области. Часто полиномиальная наивная байесовская модель превосходит другие наивные байесовские модели для классификации текста. Единственное условие, которое следует помнить при использовании наивной байесовской модели с преобразованными текстовыми данными (выраженными в разреженной матрице), состоит в том, чтобы преобразовать такую ​​разреженную матрицу в плотную матрицу.

Эффективность перекрестной проверки конвейера и поиска в сетке

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

Процесс прост! (что вы знаете… машинное обучение может быть простым, ха-ха)

Давайте представим конвейеры scikit-learn и GridsearchCV (перекрестная проверка Grid-search).

Конвейер — это класс, предоставленный scikit-learn, который может предоставить нам ярлык для нашего процесса моделирования. С помощью конвейера мы можем предоставить пошаговые инструкции по преобразованию данных. Представьте, что наши данные — это жидкость, текущая по буквальной трубе. Одной из инструкций, которые мы можем предоставить, будет изменение диаметра трубы с 1 дюйма на 2 дюйма по мере того, как жидкость проходит 10 футов по трубе. Другой инструкцией будет изменить диаметр трубы с 2 дюймов на 3 дюйма еще через 10 футов. Как только мы создадим экземпляр нашей модели трубопровода (фактически построим нашу трубу), жидкость (или данные) будет течь по трубе и иметь изменяющуюся площадь поверхности из-за различий в диаметре на протяжении всего ее преобразования (включая инструкции и параметры трубопровода). Жидкость, вытекающая из трубы (вывод данных из трубопровода), будет жидкостью, вытекающей диаметром 3 дюйма (преобразованные данные).

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

Какие результаты мы получаем от нашего машинного обучения?

Что ж, мы успешно внедрили модели в текстовые данные из Reddit, но главный вопрос: "Решили ли мы нашу проблему?"

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

В этом случае мы используем «точность» в качестве метрики оценки для нашей задачи бинарной классификации. Точность - это количество истинных положительных результатов плюс количество истинных отрицательных результатов на общее классифицированное количество прогнозов. При сравнении с нашей базовой оценкой (которая представляет собой не что иное, как угадывание одного класса по всему набору данных) мы можем быть точными в 50% случаев. Наша модель должна превосходить нашу базовую модель, чтобы быть немного более полезной, чем базовая модель. В этом случае было обнаружено, что векторизатор TFIDF в сочетании с мультиномиальной наивной байесовской моделью дал оценку точности обучения ~ 89% и оценку точности тестирования ~ 84%. Это неплохо! Это не здорово!

Мы могли только сказать, что наша проблема была решена лишь частично. В мире социальных сетей, где ежедневно через Reddit могут передаваться миллионы материалов, наша модель классификации текстов оказалась успешной только на 84% при различении небольшого набора текстовых данных с четкой полярностью. Если бы объединенный контент был более похожим, мы могли бы ожидать, что наша модель будет работать хуже. Наша модель также демонстрирует некоторое переобучение и имеет уровень ошибочной классификации 16%.

Итак, что мы извлекаем из этого?

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

Машинное обучение сталкивается со своими ограничениями. Сегодня мы проанализировали, как несколько моделей с различными параметрами могут попытаться классифицировать размеченный контент. Часто текстовые данные не сопровождаются метками; здесь требуется неконтролируемое обучение. Возможно, для будущей работы над этим набором данных мы рассмотрим возможность извлечения большего количества данных для анализа, экспериментов с различными моделями классификации или включения дополнительных функций. Чтобы увидеть полное исследование, обязательно загляните в репозиторий Github Enterprise, где проект был изучен полностью (https://git.generalassemb.ly/chriskuz/project_3).

Соответствующие источники: