Некоторое время назад мы с двумя одноклассниками, Спенсером Чином и Филипом Павловым, завершили проект, в котором основное внимание уделялось использованию машинного обучения для анализа настроений в обзорах Yelp. Это был фантастический опыт. К концу проекта мы не только применили концепции науки о данных к практической проблеме, но и реализовали бизнес-вариант использования для наших обученных моделей.

В нашем классе Data Science нам было поручено сравнить и сопоставить эффективность использования двух разных алгоритмов машинного обучения для обучения классификатора анализа настроений. Мы решили расширить спецификации проекта, создав распределенное приложение с использованием Node.js, Python и Docker, которое предсказывало количество звездочек Yelp Review, когда пользователь вводил его в режиме реального времени. Это приложение использовало классификатор анализа тональности Google Natural Language API, но также отображало результаты, взятые из моделей, которые мы обучили в нашем проекте.

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

Введение в анализ настроений

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

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

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

Чтобы обучить наши собственные модели анализу настроений, мы использовали алгоритмы контролируемого обучения. Набор данных Yelp Reviews, который был взят из репозитория машинного обучения UCI, классифицировал каждый документ в наборе данных как имеющий положительный (1) или отрицательный (0) тон. Наш код был в основном написан на Python и использовал реализации алгоритмов машинного обучения в библиотеке scikit learn и модули предварительной обработки из библиотеки nltk.

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

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

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

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

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

Наивный байесовский

Алгоритм Наивного Байеса был нашим первым выбором для проведения анализа настроений. В классе мы обсудили его приложения в качестве классификатора текста и почувствовали, что это будет отличным эталоном для нашего вторичного алгоритма. В этом разделе я дам краткое введение в Наивный Байесовский метод, но если вы ищете отличное объяснение Наивного Байеса с реальными примерами, вы можете найти его здесь.

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

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

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

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

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

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

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

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

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

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

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

Итерационный подход к предварительной обработке

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

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

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

Алгоритмы стемминга также являются техникой, которую мы использовали на этапе предварительной обработки. Они действуют, группируя различные токены, которые могут происходить от одного и того же корневого слова. Например, «play» и «play» могут быть заменены одним и тем же маркером «pla» перед обучением данных, поскольку их классификация тональности может считаться чрезвычайно похожей.

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

Результаты

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

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

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

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

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

Приложение для прогнозирования звездных баллов

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

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

Мы решили использовать стандартную реализацию анализа настроений в качестве нашего «золотого стандарта» и уже создали приложение для взаимодействия с Google Natural Language API через клиент Node.js до нашего проекта. Учитывая текст, этот API возвращает оценку настроения по шкале от -1,0 до 1,0.

Чтобы предсказать количество звезд, мы сопоставили этот результат по шкале от 0 до 5. Затем мы взяли ожидаемую ценность двух наших лучших алгоритмов для данного обзора. Результат представлял собой балл по шкале от 0 до 1,0, который был рассчитан с использованием формулы ожидаемого значения: балл = 0 * Вероятность (0) + 1 * Вероятность (1). Эта оценка также была сопоставлена ​​по шкале от 0 до 5.

Чтобы наше веб-приложение могло взаимодействовать с нашими алгоритмами прогнозирования, мы разработали веб-приложение api-gateway node.js, которое одновременно обслуживает нашу панель управления Angular.js и предоставляет интерфейсы для результатов API Google Natural Language и реализации наших алгоритмов. Чтобы предоставить этому веб-приложению доступ к нашим реализациям, мы использовали Flask, легкую библиотеку Python, чтобы обернуть функции прогнозирования для наших двух лучших алгоритмов с интерфейсом RESTful.

Наконец, мы Dockerized каждое из наших приложений и использовали docker-swarm, чтобы предоставить простой способ локально развернуть их и поделиться ими со всеми, кто хотел бы сделать то же самое.

Получившееся в результате приложение позволяет пользователям вводить свои отзывы и видеть в реальном времени, сколько звездочек приложение прогнозирует с помощью Google Natural Language API. Мы также представили визуализацию наших результатов двух лучших алгоритмов и комбинаций предварительной обработки, сопоставив ожидаемую ценность обзора между 0–100%.

Заключение

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

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

Признание

Спасибо профессору Суканье Манна из Университета Санта-Клары за ее помощь и руководство в этом проекте!

Ссылки:

Приложение для прогнозирования звезд: https://github.com/deenaariff/Yelp_Star_Prediction_Application/tree/master/prediction-dashboard

Первоначальный файл Readme и записные книжки Jupyter: https://github.com/deenaariff/Yelp_Star_Prediction_Application