Этот пост посвящен решению, которое наша команда выиграла в конкурсе SSC (Статистическое общество Канады) для студентов 2020. Тема заключалась в том, чтобы предсказать количество обзоров подкастов в iTunes. Плакаты, рефераты и результаты прогнозов оценивались, чтобы выбрать 2 лучшие команды. Мы сделали это в течение 10 дней, так что решение будет не очень полным.
Коды и плакат находятся на моем веб-сайте Github ниже, и я прикрепил точные номера строк для каждой части.
I. Структура данных
Данные имеют продольную структуру. Заголовки — это личности, которых мы должны предсказать, но они также имеют временные ряды. Итак, нам нужно предсказать все целевые значения в их временных рядах в тестовом наборе. Набор поездов собирался до 10 декабря 2019 г., а тестовый набор собирался до 10 января 2020 г. И уникальное количество титулов (индивидуумов) в наборе поездов и наборе тестов составляет 5148, 4087 соответственно. Но они имеют около 3000 общих названий. Таким образом, наше моделирование было сосредоточено на прогнозировании цели остальных 1000 наименований, которые не показаны в наборе поездов.
Некоторые сложности с точки зрения поезда и набора тестов
- Существует разрыв (40 дней) между периодами обучения и испытаний, что не очень мало, учитывая общую продолжительность сбора данных.
- Размер выборки для моделирования временных рядов недостаточен. У 30% подкастов всего один день, а у большинства подкастов меньше 31 дня. Таким образом, временные ряды было бы трудно смоделировать.
II. Исследование целевой переменной (коды: от 60 до 114 строк)
Я использовал логарифмическое преобразование для целевой переменной, потому что она сильно смещена вправо.
Графики показывают некоторые характеристики целевой переменной.
- После логарифмического преобразования асимметрия значительно уменьшилась.
- Вариации во временном ряду очень малы. Около 95% всех подкастов имеют такую же ценность в последний день, как и ценность в первый день. Таким образом, полезность временных рядов будет ограничена.
- Многие из подкастов не имеют большого размера выборки для анализа временных рядов. Таким образом, мы можем использовать моделирование временных рядов только для подкастов, которые имеют достаточный размер выборки и большие вариации временных рядов.
- Поэтому мы разделяем три сценария для прогноза. Первый — это общие заголовки в наборе поездов и тестах с небольшими вариациями их временных рядов. Второй — это общие заголовки в наборе поездов и наборе тестов с большими вариациями во временном ряду. Третий — новые названия, которые появляются только в тестовом наборе.
III. Разработка функций
Я пропущу многие детали исследования переменных, включая графики, чтобы не делать этот пост слишком длинным, и представлю здесь некоторые результаты с некоторыми рассуждениями. Наша разработка функций обычно основывалась на здравом смысле и рассуждениях.
- Функции даты (коды: от 153 до 235 строк)
Есть две функции даты. Одна — это дата сбора данных (ежечасно), а другая — дата выпуска подкаста (ежечасно). Таким образом, мы можем сделать несколько функций из них.
- День недели, час, месяц, год освобожденного и очищенного времени.
- Прирост отзывов ежечасно, ежедневно. Я могу найти некоторые закономерности, которые заставят людей писать больше отзывов, например, отпуск, час пик и т. д.
- Если подкаст в эфире или нет. Я мог узнать это, сравнивая последний день даты выпуска и первую дату очистки. Если подкаст находится в эфире, он, скорее всего, будет иметь тенденцию к увеличению количества отзывов.
- Дата добавления новых выпусков и количество добавленных новых выпусков. Эта функция важна, потому что мы можем думать об этом как о своего рода «эффекте лечения» в обычном анализе выживания. Когда добавляются новые эпизоды, люди с большей вероятностью будут писать отзывы.
- Общая продолжительность времени сбора данных каждого подкаста. Эта функция также важна, потому что, поскольку у подкаста больший период, у людей есть больше дней для написания отзывов.
Таким образом, из всех исследований вышеперечисленных функций я смог найти сильное влияние «Общая продолжительность», «Количество новых добавленных эпизодов» и мягкое влияние «часа», «месяца». Чтобы увидеть эффект, я проверил графики с целевой переменной и сводкой по линейной регрессии.
2. Сводная функция (коды: от 528 до 666 строк)
Это та часть, на которую мы потратили большую часть времени. Эта переменная дает сводную информацию о каждом подкасте. Здесь наша гипотеза заключается в том, что если популярные люди будут гостями подкаста, то подкаст получит больше отзывов. И если некоторые ключевые слова будут модными, популярными или более общими, подкаст получит больше отзывов. Итак, мы сделали эти новые функции.
- Мы извлекли имена кастингов из сводной информации, используя технику «Распознавание имен», и собрали количество их подписчиков в Твиттере, используя «веб-скрейпинг».
- Мы исследовали влияние ключевых слов, используя линейную регрессию для каждого слова с фиксированными другими ковариатами. Для этого я сначала выполнил лемматизацию и удалил «стоп-слова», чтобы увеличить размер выборки частоты появления каждого слова в сводке. И я выбрал только слово, которое появляется более чем в 25 различных подкастах, потому что я добавил в модель 4 других ковариаты.
- Мы сделали две оценки, используя результат размера эффекта каждого слова. Первый заключается в суммировании размера эффекта всех значимых слов (повторяющиеся слова учитывались только один раз) в каждом подкасте, если в подкасте есть слова. Второй - использовать максимум, а не суммирование.
Это часть результата линейной регрессии каждого слова. На самом деле, для многих слов я не мог найти, почему они имеют такие эффекты, и я думал, что это могут быть шумы, а не сигналы. Но очевидно, что неанглийские буквы имеют негативные последствия, потому что подкасты наиболее популярны в США. И если включены слова, связанные с Apple, то цель увеличивается. Интересно, что я мог заметить, что мои предыдущие знания о том, что люди эволюционировали, интересуются негативными новостями, такими как убийства, потому что знание плохих новостей помогает кому-то выжить.
3. Функция подкатегории (коды: от 243 до 299 строк)
Ожидалось, что эта переменная будет самой важной характеристикой, но было 86 уровней категорий, а некоторые уровни содержат только 1 образец. Итак, я выбрал перегруппировку для решения этой проблемы, потому что существует очень много похожих категорий.
Метод перегруппировки категорий
- Выберите и исправьте основные категории с достаточным объемом выборки.
- Используйте структуру зависимостей «матрицы встраивания корпуса из 6 миллиардов слов», чтобы получить сходство между категориями.
- Встроить вторичные (небольшие категории размера выборки) в первичные категории
Из косинусных расстояний каждого вектора слов из «перчаточного корпуса из 6 миллиардов слов» я перегруппировал категории, чтобы на всех уровнях было достаточно размеров выборки.
4. Непрерывные функции (коды: от 350 до 416 строк)
Особенности : Общая продолжительность извлечения данных, Количество добавленных новых эпизодов, Количество подписчиков в Твиттере, Оценка на основе эффекта ключевых слов
Я вырезал квантили для «Число подписчиков в Твиттере», «Оценки, полученные на основе эффекта ключевых слов» и сначала преобразовал их в категориальные характеристики. Потому что их вариации очень велики, но эта высокая кардинальность не очень помогает объяснить целевую переменную. Например, 10 миллионов подписчиков в Твиттере не сильно отличаются от 50 тысяч подписчиков в отношении их влияния на целевую переменную. После вырезания квантилей я сделал «Mean(target) Encoding». Я объясню это ниже.
5. Среднее кодирование для категориальных признаков
Размер выборки составил 5148, но есть некоторые категориальные переменные, которые имеют очень большую размерность. Итак, я могу рассмотреть эти методы.
- Перегруппировка их в менее чем 5 уровней. Но если я использую это, я потеряю много информации
- Метод встраивания, который популярен в текстовых данных, таких как «word2Vec». Я не особо задумывался об этом методе, но если учесть высокую кардинальность признаков, размер выборки 5148 не достаточен для использования алгоритма обучения, который является необходимой частью «метода встраивания».
- Среднее кодирование
Среднее кодирование — это умный способ преобразовать категориальные признаки в непрерывные. Предположим, что у нас есть подкатегории {"Искусство", "Комедия", "Новости", "Еда", "Бизнес"}. Если мы преобразуем их в непрерывный, проблема в том, что у нас будет только один бета-коэффициент, который на самом деле должен был иметь 4 бета-коэффициента. Таким образом, мы не можем присваивать произвольные значения каждой категории. Но Mean Encoding присваивает условное среднее значение целевых значений для каждого уровня. Чтобы решить проблему переобучения, я использовал 2 этапа перекрестной проверки, чтобы получить эти условные средства, которые могут добавить шум. На самом деле, это добавление шума не очень полезно для этого случая, потому что размер выборки для каждого инцидента очень мал.
IV. Моделирование
Набор данных имеет продольную структуру, но я сосредоточился на поперечном моделировании, потому что изменение временного ряда целевой переменной было очень небольшим среди 95% подкастов. Итак, выборок 5148, а не 1,4 млн, и мы вводим 8 признаков для моделирования. Должен признаться, что у нас не хватило времени, поэтому мы попробовали только привычные нам линейную регрессию, Xgboost и Random Forest.
Функции
- enco_new_category: функция перегруппировки и среднего кодирования категории.
- duration : общее количество дат, когда каждый заголовок был очищен.
- num_episode: сколько раз добавляются новые эпизоды.
- enco_sum_score_5: 1-мерная непрерывная характеристика из эффекта ключевых слов (использовались 5 квантильных разрезов и среднее кодирование).
- enco_artist: функция перегруппированных и закодированных исполнителей.
- enco_mean_tw_5: количество подписчиков в Твиттере (использовалось 5 квантилей и среднее кодирование).
- enco_month, enco_hour: средние закодированные функции месяца и часа выпуска.
Проверочный набор
- Из 5148 образцов из набора поездов мы сделали набор для проверки (20%).
- Линейная регрессия
Мы сделали это, потому что мы можем получить четкие взаимосвязи между функциями и целевой переменной, а также нам нужно было знать, как наши функции хорошо объясняют изменение целевой переменной по значению R-квадрата.
Результаты
- R-квадрат составляет 55%, что говорит о том, что наша модель не очень надежна для прогнозирования.
- Все переменные значимы при уровнях достоверности 99%, 95%, 90%.
- Все стандартные ошибки очень стабильны.
- RMSE набора проверки составляет 1,34, что выглядит высоким, учитывая масштаб целевой переменной.
2. Xgboost
RMSE проверки составляет 1,32, что немного меньше, чем у линейной регрессии.
Из графика важности функций видно, что трудно предсказать популярность подкастов, используя предварительную информацию. Можно сказать, что люди выбирают подкаст в основном по категории и отчасти по сводной информации. «Продолжительность» и «количество_эпизодов» имеют большое значение, но они бесполезны до выхода подкаста. На самом деле, это просто смещенные условия для прогнозирования количества отзывов.
Настройка гиперпараметров (коды: от 671 до 764 строк)
Для этого я использовал байесовскую оптимизацию. Поскольку набор данных небольшой, «Поиск по сетке» был бы лучше, но я просто хотел попрактиковаться в этом методе.
Это статья о байесовской оптимизации для настройки гиперпараметров.
Для этого мне нужны две части, первая — сделать функцию ошибок для проверки производительности модели в каждом наборе гиперпараметров. Вторая часть — это процесс поиска наилучшего набора гиперпараметров на основе приведенной выше функции ошибки. Я использовал 10-кратную ошибку перекрестной проверки для функции ошибок. Входными данными (гиперпараметрами) являются «Max_depth», «Min_child_weight» и «Размер подвыборки». Для функции ошибок предполагается априорный гауссовский процесс.
3. Функция смещения во времени для прогнозирования (коды: от 768 до 840 строк)
Цель состоит в том, чтобы предсказать все почасовое количество отзывов, поэтому нам также необходимо использовать функции, зависящие от времени. Мы сделали функции «час», «день недели», «месяц», «год» и «количество дней». Мы делали ежедневный целевой прогноз, а не ежечасный прогноз, и давали одинаковые значения для всех часов каждого дня.
Таким образом, только функция «количество дней» была значимой или значимой, а ее R-квадрат в целевых значениях временных рядов составлял более 90% в среднем по всем подкастам. Итак, мы использовали термин «количество дней» в качестве термина смещения для прогнозирования дневного целевого значения.
V. Ограничения
- Мы в основном сосредоточились на моделировании поперечного сечения, поэтому может быть лучший способ прогнозировать почасовые целевые значения. Мы использовали для этого только термин «счетчик дней». Может быть почасовой эффект или некоторая структура зависимости, которую можно рассматривать с помощью моделей временных рядов, таких как ARIMA. Но все же я не уверен, смогу ли я их использовать, потому что размер выборки во временном ряду был очень маленьким.
- Что можно использовать для обработки сводной функции? Мы предполагали, что люди будут быстро улавливать ключевые слова или называть имена из сводки, чтобы выбрать подкаст, поэтому наш способ заключался в том, чтобы сосредоточиться на токенах (слове). И мы просто линейно суммировали эффекты токенов, чтобы создать функцию оценки. Но результат был не очень ясен, чтобы выяснить, почему каждое слово имеет такой размер эффекта.
- Окончательная модель представляет собой единую модель Xgboost, поэтому наложение или объединение моделей может дать лучший результат.
VI. использованная литература
- GloVe: глобальные векторы для представления слов: https://nlp.stanford.edu/projects/glove/
- Практическая байесовская оптимизация алгоритмов машинного обучения: http://papers.nips.cc/paper/4522-practical-bayesian-optimization
- Среднее кодирование: https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0
- Разрешенный способ очистки данных Twitter: https://rtweet.info/
- Использование структуры зависимостей матрицы Wiki_embedding: https://www.kaggle.com/taindow/example-embedding