Ранее в этом году мне выпала честь принять участие в Хакатоне НБА 2019 в офисе Лиги в Секаукус, штат Нью-Джерси. В рамках процесса подачи заявки НБА представило два технических контрольных вопроса - один, который включал расчет расширенных показателей игроков для каждой игры постсезона 2019 года, а второй, который был сосредоточен на прогнозировании количества взаимодействий для 1000 постов в Instagram от НБА. .

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

Заявление о проблеме

Поставленная задача довольно проста: у нас есть данные, относящиеся к более чем 7500 постам NBA в Instagram, и на основе этих данных нас попросили спрогнозировать количество взаимодействий для удерживаемого набора из 1000 постов.

Два набора данных включают следующие поля:

  • Подписчики при публикации (количество подписчиков в Instagram на момент публикации)
  • Дата создания (отметка даты и времени сообщения)
  • Тип сообщения (классификация сообщения как фото, фотоальбом или видео)
  • Описание (заголовок / описание публикации в Instagram)
  • Взаимодействия (взаимодействия в Instagram - что мы будем прогнозировать по нашему набору задержанных)

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

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

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

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

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

Из этих визуализаций мне быстро выделяются два наблюдения. Во-первых, в межсезонье НБА (с июля по октябрь) наблюдается снижение вовлеченности. Кроме того, помимо некоторых выбросов, существует две отдельные «полосы» вовлеченности.

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

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

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

Шаг 2: Разработка функций

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

Дата создания - интуитивно понятно, что сообщения в межсезонье могут работать хуже, чем в середине сезона НБА, и точно так же сообщения в 1:00 EST могут работать хуже, чем в 19:00 EST. Исходя из этого предположения, для нас имеет смысл извлечь некоторые общие функции, связанные с датой, из наших уникальных временных меток, таких как месяц, день недели и час.

Мы можем создать эти новые функции в нашем обучающем наборе DataFrame, используя объект доступа серии Pandas dt, как показано ниже:

posts_df['month'] = posts_df.created_ts.dt.month
posts_df['weekday'] = posts_df.created_ts.dt.weekday
posts_df['hour'] = posts_df.created_ts.dt.hour

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

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

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

2) Emojis - Хотя это может показаться глупым, мне было любопытно, влияют ли Emojis на взаимодействие с постом. В нашем наборе данных Emojis отображается как строка ‘??’, поэтому мы можем искать эту подстроку в нашем описании и создавать сводную таблицу, чтобы понять результаты.

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

3) Аккаунты с тегами. Хотя мы не можем проанализировать само изображение, мы можем сделать обоснованное предположение относительно публикации в Instagram, пометив игроков НБА тегами (например: «@stephencurry at the buzzer!» ). Решить эту проблему непросто, и, вероятно, проще всего будет, если мы посмотрим на наиболее и наименее эффективные сообщения и определим, имеют ли какие-либо помеченные аккаунты высокую корреляцию с вовлечением.

Глядя на 20 самых популярных постов, мы видим, что выделяются два игрока: Леброн Джеймс (@kingjames) и Кайри Ирвинг (@kyrieirving). Фактически, каждое из 77 сообщений включает упоминание одного или обоих из этих двух игроков. Жюри четко высказалось, и у них есть любимые игроки. Мы обязательно создадим категориальные переменные для Леброна и Кайри (например, contains_kingjames), чтобы указать, есть ли в описании поста упоминание соответствующего игрока. Хотя этот метод может быть неприменим для прогнозирования эффективности публикации на 10 лет в будущем (экстраполяция), поскольку мы решаем проблему интерполяции (сообщения, попадающие в наш набор обучающих данных), это кажется полностью верным. .

Точно так же мы можем выявить некоторые тенденции среди худших публикаций. Сообщения, в которых упоминаются альтернативные лиги или игры (например, NBA Africa Game, WNBA, Jr NBA и т. Д.), кажутся плохими. Кроме того, описания, включающие большое количество отмеченных игроков, также оказываются внизу нашего списка. Мы можем проверить эти гипотезы, создав категориальную переменную (contains_alternate_league), а также непрерывную переменную (player_mentions) и изучив результаты.

Шаг 3: моделирование

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

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

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

На основе наших исходных моделей наша модель линейной регрессии делает прогнозы на основе данных, которых не видел раньше, со средней ошибкой ~ 3%. При среднем значении вовлеченности примерно 692 000 взаимодействий мы делаем прогнозы, которые в среднем неверны на 21 036 взаимодействий (неплохо!)

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

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

После выполнения одного «раунда» перекрестной проверки K-Fold (со значением K, равным 5), мы можем снова сравнить наши различные модели, усредняя их среднюю абсолютную процентную ошибку для каждого сеанса обучения и тестирования. Неудивительно, что наша модель линейной регрессии по-прежнему работает лучше всего (средняя абсолютная процентная ошибка составляет 3,0%).

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

Выбрав последнюю модель, мы можем завершить этот проект, обучив новые модели линейной регрессии на полноте наших обучающих данных. Стоит отметить, что стандартная модель линейной регрессии из SciKit-Learn на самом деле представляет собой регрессию методом обычных наименьших квадратов (OLS) под капотом. Эта модель оптимизирует коэффициенты наших характеристик, чтобы минимизировать сумму квадратов различий между наблюдаемыми и прогнозируемыми значениями вовлеченности. В нашем конкретном приложении нам была поставлена ​​задача оптимизировать среднюю абсолютную процентную ошибку (MAPE), другую функцию потерь. На высоком уровне OLS зависит от масштаба, а MAPE - нет. Поскольку у нас нет явных выбросов, которые могли бы исказить нашу модель, я решил обучить свои модели линейной регрессии с помощью «ванильной» модели линейной регрессии от SciKit-Learn. Улучшение моей работы над этим проектом могло бы заключаться в создании настраиваемого решателя для оптимизации коэффициентов признаков по отношению к настраиваемой функции потерь - интересный проект на другой день!

Вывод

Поскольку эта задача была основана на искусственных данных взаимодействия с Instagram, я, к сожалению, никогда не узнаю точность моих окончательных прогнозов. Но что я действительно знаю, так это то, что за мою заявку я был вознагражден поездкой в ​​штаб-квартиру НБА, чтобы соревноваться в дальнейших задачах Data Science с некоторыми из самых ярких умов в мире спортивной аналитики.

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