www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Прогнозирование количества лайков в Instagram

Дата публикации May 9, 2017

В этой статье мы покажем наш подход к прогнозированию количества лайков в Instagram. Сначала заполним, как мы собрали набор данных, и проанализируем данные. Затем мы предоставим базовую модель, не глядя на изображение, используя XGBoost. Следующим шагом будет использование Natural Language Processing (NLP) для извлечения некоторых функций. Наконец, сверточная нейронная сеть (CNN) разработана для извлечения функций из изображения.

Github ссылка:https://github.com/gvsi/datascience-finalproject

I. Мотивация

  • Цель:Предсказать количество лайков данного поста в Instagram.
  • Контекст:Влиятельные социальные медиа получают деньги от маркетологов за продвижение продукта или услуги.
  • Заявка:Используйте модель, разработанную в онлайн-маркетинге, чтобы найти авторитетов, которые приносят наибольшее количество показов для данного поста.

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

Сообщение от Леа Камиллери:https://www.instagram.com/p/BRNlFUBAG5i/

2. Данные

Построение набора данных

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

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

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

В конце концов мы натолкнулись на Inconosquare Index Influencers, список из 2000+ авторитетов Instagram. Этот индекс можно найти на:https://influence.iconosquare.com,

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

Теперь о реальной задаче: очистка профилей Instagram этих пользователей. Это включает чтение метаданных из профиля (количество подписчиков / подписчиков, количество постов, описание профиля), сканирование 17 последних изображений от пользователей (изображение в формате JPG, количество лайков, количество комментариев, метка времени, текст описания). ).

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

JSON-файл, полученный для данного пользователя

Скребок

API-интерфейсы Instagram имеют ограничение 60 запросов / час к их внутренним серверам, что делает его абсолютно бесполезным для любого реального приложения или сбора данных. Альтернативой официальным API является сканирование каждой страницы программным способом.

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

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

Вот демонстрация скребка в действии:

Скребок в действии

Для обучения и тестирования нашей модели было собрано 16539 изображений из 972 авторитетов Instagram.

Анализ набора данных

Некоторые краткие метрики данных о собранных данных. Мы видим, что число лайков имеет высокое стандартное отклонение, 61 224,20. Похоже, что существует большое неравенство, так как среднее значение составляет 24 416,38, но 75% постов имеют менее 18 359 лайков.

Сводка набора данных

Следующая гистограмма подтверждает значения, указанные в таблице, большинство постов имеют менее 200 000 лайков. В интересующем нас приложении имеет смысл удалить людей с очень большим числом подписчиков (более 1 000 000 подписчиков) и высоким средним числом лайков (свыше 200 000), поскольку они больше не считаются влиятельными лицами, а являются знаменитостями / звезды. Это также поможет уменьшить ошибку нашей модели.

Мы отфильтровали наш набор данных, чтобы сохранить только для Instagramers среднее число лайков менее 200 КБ, и у них должно быть менее 1 000 000 подписчиков. После фильтрации мы сохранили 746 Instagramers, что соответствует 12678 постам. Стандартное отклонение количества лайков снизилось до 9999,27, а среднее значение - до 8306,93. Гистограмма количества лайков показана справа вверху.

Количество последователей не обязательно означает большое влияние

Мы строим график зависимости количества лайков от количества подписчиков.

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

3. Модели

Сначала мы разработаем базовую модель, содержащую некоторые основные характеристики, полученные из набора данных. Затем мы добавим функции, полученные из Natural Language Processing (NLP), и, наконец, добавим функции, созданные из сверточной нейронной сети.

Для сравнения различных моделей мы будем использовать две метрики производительности: среднеквадратическая ошибка (RMSE) и значение R².

А. Базовая модель

Базовая модель состоит из следующих функций:

Учитывая особенности:

  • Количество подписчиков
  • Количество следующих
  • Количество постов

Извлеченные особенности:

  • Веб-сайт: мы классифицировали веб-сайт, предоставленный в описании пользователя, на различные категории: Youtube, Facebook, Twitter, Blog, Music и другие. Затем мы однозначно кодируем разные категории.
  • День недели: используя данные каждого поста данных, мы однозначно закодировали день недели

Созданная особенность:

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

Из сгенерированных функций мы обнаружили, что:

Веб-сайт

11% пользователей использовали канал Youtube или видео в качестве своего веб-сайта, 4% - профиль в Facebook, 2% - блог и 1% - веб-сайт, связанный с музыкой (Soundcloud или Spotify). 88% пользователей имели веб-сайт в своем профиле.

День недели

Днем, когда загружается наибольшее количество фотографий, является воскресенье с 18%, затем суббота и четверг с 15%, пятница и среда с 14% и, наконец, понедельник с 11%. Похоже, что только два дня имеют разную статистику, в воскресенье больше сообщений, а в понедельник меньше.

XGB

Применяя модель XGBoost к этим функциям со следующими параметрами: max_depth = 4, learning_rate = 0,01, n_estimators = 596, мы получаем RMSE 2876,17 и R² 0,92.

Из графика важности функций, представленного XGBoost, мы можем видеть, что среднее число лайков значительно влияет на результат модели XGB. Оценка F, 4084, больше, чем все остальные функции вместе взятые. С точки зрения основных функций, количество постов, подписчиков и подписчиков имеют низкий F балл. С точки зрения извлеченных функций, суббота, кажется, оказывает большее влияние, чем на другой день. Возможно, предполагается, что публикация в субботу приведет к большему количеству лайков, чем другие. Ранее сообщалось, что распределение постов в течение недели относительно равномерное: больше публикаций публикуется по воскресеньям и меньше постов по понедельникам.

Б. НЛП

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

Поскольку у нас не было много времени, мы решили использовать подход слов. Сначала мы очистили данные и превратили их в работоспособное состояние. Затем мы удалили все знаки препинания, стоп-слова и смайлики из текста (подробнее о смайликах позже). Затем мы разбили слова и использовали функцию scikit-learn CountVectorizer для векторизации текста. Мы также пытались использовать функцию scikit для TF-IDF, однако казалось, что CountVectorizer работает лучше. Когда мы сделали этот процесс для заголовков постов, мы получили более 7000 уникальных слов. Это привело к очень разреженной матрице 16k на 7k. Чтобы уменьшить разреженность матрицы, мы использовали технику, в которой мы использовали бы только верхние слова в тексте вместо всех слов. Таким образом, мы смогли работать с 100, 200, 300 ... словами при оценке наших возможностей.

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

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

Вот пример некоторых из 500 лучших слов (я показываю подмножество 500 лучших слов длиной более 5 символов):

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

Вот лучшие 37 смайликов:

Топ 37 смайликов

Когда мы добавили эти функции к функциям, которые мы использовали для базовой модели, наша RMSE фактически ухудшилась. Случилось так, что эти дополнительные функции НЛП были далеко не такими важными, как средние функции базовой модели. Поскольку модель Base + NLP меньше полагалась на среднюю функцию прогнозирования лайков, наша RMSE фактически ухудшилась. Наш среднеквадратичный счет увеличился до 2895,90, а показатель R² стал 0,9163. Поскольку имеется более 500 функций, график важности функции для этой модели трудно читать.

Однако, используя эту функцию:

vec = model_xgb.feature_importances_for i in range(len(vec)):if vec[i] > .01:print(X_train.columns[i])

Мы обнаружили, что наиболее важными функциями НЛП являются слова:Ада удивительно AMG код эль собирается вот сделать человек поблагодарить время

C. Передача обучения

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

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

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

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

Есть два способа использования предварительно обученных моделей, которые мы оба решаем:

  • Тонкая настройка ConvNet с Inception V3:то есть предварительно обученные веса ConvNet, удалите последние полностью подключенные слои и при необходимости расширите сети. Затем мы настраиваем вес предварительно обученной сети, продолжая обратное распространение. Модель, которую мы использовали, была Inception v3. Два последних полностью связанных слоя были удалены, и мы добавили три дополнительных слоя. Мы переучили его на наших точках данных с помощью графического процессора на машине EC2.
  • Исправлена ​​функция извлечения с VGG 19:это удаляет последний полностью подключенный слой, а затем обрабатывает остальную часть ConvNet как средство извлечения фиксированных функций для нового набора данных. VGG 19 - это сеть классификации изображений, предварительно подготовленная для более чем 14 миллионов изображений в наборе данных ImageNet. Удаление последнего полностью связанного слоя дает вектор объектов размером 4096 для каждого изображения. Мы можем использовать этот (разреженный) вектор как функцию в нашей базовой модели.

Полученные результаты

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

D. Сверточная регрессионная нейронная сеть

мотивация

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

дизайн

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

Архитектура

Выбор архитектуры нейронной сети - это своего рода художественный процесс. Во всех проблемах машинного обучения разработчик модели всегда сталкивается с необходимостью правильного выбора гиперпараметров, чтобы дать модели достаточно свободы для захвата паттернов в данных и достаточно ограничить модель, чтобы не стать жертвой переобучения. В проектировании нейронных сетей эта проблема усугубляется тем фактом, чтовсеявляется гиперпараметром - количество слоев, размеры слоев, количество каналов, размер сверточного фильтра, шаг фильтра и т. д. Чтобы решить эту проблему, мы написали наш код таким образом, чтобы аргументы инициализации модели приняли компактную форму, описывающую архитектура сети. Это позволило нам очень быстро протестировать множество различных архитектур без переписывания кода. Критерием для нашей архитектуры было то, что модель не могла быстро начать переоснащаться после нескольких тренировочных эпох, и активации ReLU были не слишком редкими. Ниже приведена архитектура, на которой мы остановились. Он принимает партии 256 x 256 изображений, имеет 4 сверточных слоя и 5 полностью связанных слоев. Для сверточных слоев числа в верхней части блоков представляют форму вывода для каждого канала, а число в нижней части представляет количество каналов. Для полностью связанных слоев число просто описывает количество нейронов в слое.

Полученные результаты

Си-Эн-Эн была обучена как отдельная модель, однако, чтобы интегрировать ее во всю модель, мы удалили 8 выходов конечного слоя для каждого изображения и использовали их как функции в основном XGBoost. К сожалению, как мы видели в случае НЛП и подходов к обучению, наш тест RMSE увеличился с 2876 до 2964.

Редизайн

Мы пришли к выводу, что рост RMSE можно объяснить связанными с полностью связанными уровнями мета-функциями пользователя. Поскольку эти функции намного более предсказуемы, чем само изображение, сеть научилась игнорировать изображение и, по сути, обучается этим функциям, как стандартный NN. Следующим шагом было просто удалить эти функции из сети и обучаться только на изображениях. При обучении только на изображениях, автономная модель, как ожидается, имела гораздо худшую RMSE. Однако при выполнении извлечения признаков и интеграции с объединенной моделью мы наблюдали снижение RMSE по сравнению с базовой моделью с 2876 до 2837. Анализируя важные функции для совместной регрессии XGBoost, мы обнаружили, что на самом деле она нашла одну из функций из изображений важно. Отрисовывая эту функцию для всех выборок, мы видим, что она принимает форму гауссовского распределения. Исходя из этого, мы предполагаем, что это какая-то особенность, которая непрерывна во всех изображениях, например коэффициент контрастности или яркость, в отличие от дискретного значения, такого как «есть ли человек на этой фотографии?». Ниже вы можете видеть, что вторая особенность, помеченная как «1_», происходит из сверточной нейронной сети.

Вот распределение интересующей нас функции обо всех типовых постах.

Гистограмма NN особенность 1_

Вывод

Добавление различных подмоделей, таких как NLP или CNN, поверх нашей базовой модели показывает, что чрезвычайно сложно извлечь дополнительную прогнозирующую силу из поста Instagram, помимо пользовательских функций. Кроме того, даже с базовой моделью пользователи, которые получают лайки далеко за пределами типичного диапазона, сильно недооцениваются, отбрасывая RMSE или требуя фильтрации. Недостаток чувствительности постов в нашей модели, вероятно, объясняется тем, что у каждого пользователя есть подписчики с достаточно уникальными вкусами, чтобы наша модель не могла обобщить эти предпочтения в широком масштабе. Некоторыми возможными решениями этого было бы создание пользовательских моделей или сбор огромных объемов данных (миллионы постов из тысяч) в попытке точно обобщить весь Instagram. Наконец, все наши модели и подмодели могли бы быть более оптимально настроены и настроены в надежде получить лучшую чувствительность к посту, но наши ограничения по времени разработки сильно ограничивали нашу способность находить творческие решения этой чрезвычайно сложной проблемы.

Корентин Дюге, Джованни Алькантара, Джозеф Шалаби и Сахил Шах.

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map