Я выбрал эту тему для своего завершающего проекта, потому что мне очень хотелось иметь такую программу, когда я работал менеджером по маркетингу около 5 лет назад. Мне приходилось придумывать контент для каждой из социальных сетей, которыми я управлял каждый день, не зная о своих ожидаемых результатах работы. Мне пришлось публиковать что-то новое в социальных сетях на основе моей истории публикаций из аналитического инструмента Facebook и моей интуиции. Для меня было бы лучше, если бы в то время у меня была автоматизированная программа реагирования. Я установил стратегии, основанные на истории публикаций компании, чтобы получить как можно больше откликов, но это была такая непредсказуемая работа. Поэтому я решил создать программу прогнозирования реакции в социальных сетях, которая помогает менеджерам социальных сетей, которые создают контент для интернет-маркетинга почти каждый день. Для начала я решил создать программу прогнозирования реакции на страницу Facebook, Topher.
Дизайн продукта
Я разработал Topher, чтобы помочь менеджерам социальных сетей работать лучше, чем в среднем в прошлом, анализируя их историю публикаций и сообщения конкурентов. Другими словами, эта программа показывает, получите ли вы больше, чем среднее количество реакций, которые вы получили на данный момент.
Цель продукта - предсказать реакцию на сообщение, введенное пользователем. Facebook известен своей кнопкой «Мне нравится», но в прошлом году (март 2016 года) он запустил субэмоциональные смайлики, такие как любит, ха-ха, вау, которые являются позитивными, грустные и злые, которые являются негативными.
Я разделил эти реакции на 3 категории: лайки, положительные реакции, отрицательные реакции. Я разработал эту программу, чтобы предсказать, получит ли этот пост при вводе текста больше чисел каждой категории реакции, чем средняя производительность на странице Facebook. Эта программа автоматически оценивает вашу производительность сразу после того, как вы записываете введенный текст на странице. Я не включил «количество репостов» и «количество комментариев» для этого анализа, потому что мы не можем сделать вывод, какое действие для репостов и комментариев является положительным или отрицательным, только с помощью чисел.
Наборы данных
Я получил около 15 тысяч сообщений со страниц 5 продуктовых магазинов с помощью Facebook API. Данные содержат текст и количество реакций по каждому типу реакции. Facebook предоставляет данные, состоящие из двух частей текста: «Сообщение о статусе» и «Текст ссылки», выделенные красными линиями на картинке выше (рис. 1). Помимо текстовых данных, эти данные состоят из другой информации, такой как «Тип содержания», «Дата публикации», «Ссылка на содержание» и т. Д. Изначально я проанализировал набор данных «Whole Foods Market» и позже расширил свой анализ еще на 4 набора данных.
Предварительная обработка данных
Во-первых, я отфильтровал некоторые резко отклоняющиеся значения и сообщения с очень небольшим количеством реакций из набора данных. В дополнение к этому, распределение данных имеет чрезвычайно положительный перекос, поэтому я применил естественное преобразование журнала, чтобы обеспечить нормальное распределение моих данных. Поскольку эта программа предназначена для того, чтобы помочь вам получить больше лайков или положительных реакций, чем среднее число (среднее) из ваших предыдущих постов, фильтрация этих постов поможет согласованности моей модели.
Вдобавок к этому, если ваш пост платный, вероятность того, что его увидят большее количество людей, чем количество постоянных поклонников, выше, и вероятность того, что он получит больше откликов, будет выше. На самом деле, когда я сравнивал тексты выбросов, я не мог сказать какой-либо особой разницы между выбросами и обычными сообщениями только с текстовыми данными. Поэтому я подозреваю, что эти экстремальные выбросы могут быть оплачиваемыми постами, или может быть какой-то контекст для тех постов, которые вызвали чрезвычайно большое количество откликов. Однако на этот раз я не могу доказать свою гипотезу, так как у меня нет доступа к информации о том, какая публикация является органической или платной на каждой странице. Поэтому на этот раз я просто отфильтровал их для единообразия моей модели.
Во-вторых, я объединил две колонки текста в одну, потому что «сообщение о статусе» и «текст ссылки» отображаются в сообщении одновременно. На протяжении всего проекта я понял, что чем больше текста у вас будет, тем лучше вы получите результаты моделирования.
В-третьих, для простоты я удалил из текста специальные символы, числа и названия ссылок (например, «https: //…»).
В-четвертых, нормализация данных. Поскольку у каждой страницы разное количество поклонников, степень воздействия разная. Я нормализовал количество каждой реакции, разделив количество реакций на количество поклонников каждой страницы, когда я расширил свой анализ на еще 4 набора данных (например, Safeway, Sprouts, Walmart и Kroger).
Наконец, когда я изучил корреляцию между переменными, я заметил, что количество реакций и количество лайков сильно коррелированы. Это связано с тем, что кнопка «Нравится» была единственной кнопкой эмоциональной реакции на Facebook до мая 2016 года, и более 95% реакций исходили от «num_likes».
С этого момента я буду в основном объяснять процесс анализа данных и моделирования с помощью набора данных Whole Foods Market (как WFM).
Обработка естественного языка (NLP)
Для обработки текстовых данных я использовал Scikit-learn (sklearn), NLTK и библиотеку Gensim для анализа текстовых данных.
Во-первых, я удаляю частые, но ненужные слова с помощью стоп-слов и создаю разреженную матрицу текста с помощью векторизатора Tf-idf, который придает больший вес частым и важным словам из всего текста. Tf-idf - это сокращение от «Term-frequency and Inverse Document Frequency», и это числовая статистика, которая предназначена для отражения того, насколько важно слово для документа в коллекции или корпусе, и является широко используемым методом для поиска информации. В дополнение к этому, я отфильтровал наименее частые слова, которые встречаются в корпусе только один раз.
Мне пришлось изучить настоящие слова и определить, какие слова являются ненужными или важными, и обновить список игнорируемых слов, который содержит слова, которые нужно отфильтровать из исходного корпуса, и снова и снова исследовать распределение слов. Это может быть такая утомительная работа, но она очень важна для обработки естественного языка.
Я также изучил n-граммы, которые полезны для последовательности соседних слов. N-грамма - это непрерывная последовательность n элементов из заданной последовательности текста. Я смог понять, какие слова часто используются вместе, и лучше понять слова в контексте.
Матрица разреженного текста, созданная после очистки и фильтрации ненужных слов, будет использоваться в качестве предиктора, чтобы предсказать, получит ли публикация большее количество реакций при моделировании.
Дополнительная разработка функций
Для моделирования классификации я создал предсказатель текста с помощью векторизатора tf-idf, описанного выше. Однако, имея только токенизированные текстовые данные, я не смог получить высокую оценку точности, поэтому мне пришлось придумать еще несколько методов для проектирования функций. Я пробовал создать несколько функций, таких как векторное представление текста с помощью word2vec, типы содержимого, удобочитаемость и длину текстового столбца.
Чтобы сделать вывод первым, длина текста была эффективной, чтобы различать текст ниже среднего и выше среднего. Когда я просмотрел данные, я увидел, что более короткие тексты вызывают больше реакций в целом, поэтому я создал столбец для длины текста и также использовал предиктор для моделирования классификации.
В дополнение к этому, столбец типов содержимого немного увеличивает показатель точности. Однако я не включил эту функцию, потому что моя программа не будет получать ввод, какой тип содержимого (например, видео, изображение, только текст) будет использоваться для этого сообщения. Несомненно, существуют положительные корреляции между типами данных и количеством реакций. Однако на этот раз я решил не включать эту функцию и в ближайшем будущем объединю ее с анализом изображений и видео.
Выбор модели
Ниже представлена анатомия моей последней модели для Topher.
Цель
Тофер классифицирует ввод текста пользователем на 2 класса (ниже / выше среднего), каждый по 3 реакции.
- реакции: лайки, положительные реакции (любит, ха-ха, вау), отрицательные реакции (грусть, гнев)
- целевой класс: ниже среднего класса (класс 0), выше среднего класса (класс 1)
Предикторы
- очищенные и токенизированные текстовые данные
- длина текста
Модель: классификатор Adaboost с классификатором дерева решений
Моя последняя модель - это классификатор Adaboost (сокращение от «Adaptive Boosting»), который представляет собой метаалгоритм машинного обучения для метода ансамбля.
Классификатор дерева решений
Классификатор дерева решений является базовым классификатором для этой модели. Классификатор дерева решений разбивает входные данные на предопределенные классы по наиболее значимому дифференцирующему значению во входных переменных. Поскольку повторяющийся процесс принятия решения выглядит как узлы дерева, он называется деревом решений.
Классификатор Adaboost
Adaboost Classifier превращает свои базовые классификаторы в классификаторы рабочих недель тренировочных недель до сильных. Согласно документу Scikit-learn, повышающие базовые оценки строятся последовательно, и одна пытается уменьшить смещение комбинированной оценки. Мотивация состоит в том, чтобы объединить несколько слабых моделей для создания мощного ансамбля.
Слабые модели добавляются последовательно, обучаются с использованием взвешенных обучающих данных. Процесс продолжается до тех пор, пока не будет создано заранее заданное количество слабых учеников (пользовательский параметр) или пока не удастся улучшить набор обучающих данных.
Я разделил свой набор данных на набор данных для обучения и тестирования с соотношением 7: 3. Я обучил свою модель с помощью данных поезда и протестировал модель с помощью тестового набора данных. Наконец, у меня 0,87 для оценки точности для всех пяти источников / num_likes с классификатором Adaboost. Это означает, что моя модель классификации предсказывает производительность вводимого текста с точностью 87%.
Если посмотреть на окончательную модель Тофера, то всего 6 классификационных моделей работают вместе. Сначала я начал анализировать только набор данных Whole Foods Market для каждой реакции (Num_likes, Num_pos и num_neg) и расширил свой анализ на все 5 наборов данных продуктового магазина. С помощью этих шести моделей пользователи могут сравнивать результат ввода текста не только со своим прошлым набором данных, но и со своими конкурентами.
У меня гораздо более высокий показатель точности для положительных и отрицательных реакций. Вы можете увидеть числа внутри красной рамки. Однако это не очень хорошие результаты для этой модели, потому что эти модели переоснащены.
Согласно Википедии, при переобучении статистическая модель описывает случайную ошибку или шум вместо лежащих в основе отношений. Переобучение происходит, когда модель слишком сложна, например, если у нее слишком много параметров p по сравнению с количеством наблюдений. Модель, которая была переобучена, имеет низкую эффективность распознавания p, поскольку она слишком остро реагирует на незначительные колебания обучающих данных. В этом случае эти 4 модели для num_pos и num_neg предсказывали в основном только один класс (ниже среднего).
Это связано с тем, что количество данных для положительных и отрицательных реакций очень мало (менее 5 процентов от всего набора данных). Поскольку Adaboost склонен к переобучению при использовании небольшого набора данных и слишком большого количества параметров (в данном случае, разреженной текстовой матрицы с более чем 16 000 столбцов), это произошло с этими четырьмя моделями. Однако я не исключил эти модели, потому что полагаю, что смогу решить эту проблему, когда позже получу больше данных.
Оценка производительности модели
Моя лучшая модель набрала 87% точности. Точность - это соотношение правильно спрогнозированных наблюдений. Эта оценка интуитивно понятна и является основным критерием выбора лучшей модели, но этого недостаточно для оценки производительности классификатора. Для более тщательной оценки модели классификации я также использовал обычную функцию из библиотеки Scikit-learn - отчет о классификации. Я проанализирую производительность модели с помощью моей основной модели с набором данных из 5 продуктовых магазинов для num_likes.
Отчет о классификации
В отчете по классификации есть 3 основных показателя классификации: точность, отзывчивость и оценка f-1.
- Точность указывает соотношение правильных положительных результатов из выбранного класса: истинно положительные / (истинные положительные + ложные положительные)
- Отзыв указывает соотношение правильно предсказанных положительных событий и релевантных данных: истинно положительные / (истинные положительные + ложно отрицательные)
- Оценка f-1 представляет собой гармоническое / взвешенное среднее значение точности и запоминания. Таким образом, эта оценка учитывает как ложные срабатывания, так и ложные отрицательные результаты. Интуитивно это не так просто понять, как точность, но F1 обычно более полезен, чем точность, особенно если у вас неравномерное распределение классов. : 2 * (Вызов * Точность) / (Вызов + Точность)
Судя по отчету о классификации моей лучшей модели, каждая из оценок выглядит довольно хорошо. Между классами есть некоторые различия в точности и запоминании, но в целом эта модель хорошо работает с более чем 16 000 функций (токенизированные слова).
Веб-приложение
Я работал над созданием веб-приложения с использованием Flask и Reactjs вместе с разработчиком. Эта программа предназначена для мгновенного отображения результата при вводе текста в поле ввода.
Демонстрация программы
Ниже представлена демонстрационная страница Topher. Первое окно предназначено только для набора данных WFM, а второе окно основано на наборе данных 5 продуктовых магазинов. Если вы хотите увидеть, как ваш ввод текста будет работать только с вашими данными в прошлом, вы можете использовать первое окно. Если вы хотите сравнить свою производительность с другими, вы можете ввести текст во втором окне.
Например, введите «счастливой пасхи» в первом поле, и тогда вы увидите, что ваш ввод получит больше, чем среднее количество реакций. В этой демонстрации «Популярность выше среднего» означает, что вы получите больше, чем среднее количество «лайков» ваших предыдущих публикаций.
Эта программа сейчас закрыта для публики. Я свяжу программу здесь, когда скоро создам веб-сайт для общего пользования.
Дальнейшая работа
В этом проекте я сосредоточился на анализе текста, пытаясь уловить взаимосвязь между текстами и реакциями. Интуитивно понятно, что качество изображений и видео оказывает наибольшее влияние на то, как пользователи фиксируют взгляды пользователей на Facebook.
Чтобы проверить свою гипотезу, я провел краткий опрос окружающих меня людей.
Вопрос: Что вы видите в первую очередь, когда смотрите этот пост?
- Статус
- Изображение / Видео
- Текст ссылки
Большинство людей (58 из 60), которых я спрашивал по этому поводу, ответили, что
сначала их внимание привлекла картинка, а затем «текст ссылки» и «сообщение о статусе». Я хотел бы в ближайшее время расширить масштаб проекта до изображений и видео.
Об авторе
Я с энтузиазмом занимаюсь наукой о данных / машинным обучением из Сан-Хосе, Калифорния. Я учусь на протяжении всей жизни и в настоящее время очень интересуюсь НЛП и глубоким обучением. Вы также можете найти меня в Linkedin.