Учебное пособие по сравнению методов прогнозирования в Python

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

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

Проблема, как обсуждалось в предыдущей статье, имела ряд проблем:

  • Более 60% данных WDI отсутствовало.
  • Количество особенностей намного превышает количество наблюдений. WDI измеряются ежегодно, и у большинства из них всего от 20 до 40 лет.
  • Прерывистые исторические записи нашего показателя бедности, который мы пытаемся предсказать

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

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

Классические методы временных рядов против методов машинного обучения

Стандартные учебники по временным рядам, такие как Прогнозирование: принципы и практика, обсуждают многие методы прогнозирования, такие как экспоненциальное сглаживание, ARIMA и векторная авторегрессия (VAR). Хотя эти методы доминируют во временных рядах (см. Этот пост экономиста Фрэнсиса Дибольда), машинное обучение начинает появляться как альтернативный метод для временных рядов, находя полезность, особенно в многомерных временных рядах. Здесь - это статья, в которой обсуждаются стратегии машинного обучения для временных рядов, а здесь - интересная статья об успехе моделей случайного леса в прогнозировании вспышек птичьего гриппа.

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

Представляем данные

В 2014 году ООН призвала к информационной революции, чтобы задействовать лучшие доступные инструменты и методы для достижения Целей устойчивого развития (ЦУР). Здесь мы пытаемся использовать машинное обучение для прогнозирования одного из показателей ЦУР 1, цель которого - повсеместно искоренить нищету во всех ее формах.

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

«Сбор данных обследований домохозяйств о бедности - дело дорогое и трудоемкое, а это означает, что политики часто принимают решения на основе старых данных… машинное обучение может радикально изменить правила игры, сделав измерение бедности более дешевым и намного более близким к реальному времени». - Асли Демиргуч-Кунт, директор по исследованиям Всемирного банка

В этом проекте мы попытаемся спрогнозировать один конкретный WDI: Коэффициент бедности на уровне 1,90 доллара США в день (ППС 2011 года) (% населения). Это один из основных показателей, используемых для измерения прогресса в достижении первой Цели устойчивого развития. Мы спрогнозируем показатель на 2010 год с помощью методов машинного обучения, используя данные до 2009 года включительно по всем показателям (включая целевой показатель). Выбор целевого года (например, 2010 г.), для которого у нас уже есть данные, позволяет нам сравнивать наши прогнозы с фактическими отчетными значениями и измерять успех (или неудачу) наших алгоритмов. Это покажет нам, насколько хорошо прогнозист будет работать в будущем с невидимыми данными.

Дополнительные сведения о обработке данных (с использованием Python и Pandas), необходимой для анализа и очистки этого набора данных, см. В моем предыдущем блоге. Кроме того, пропущенные значения рассчитываются с использованием собственной линейной интерполяции Pandas. Рассмотрение процесса вменения также обсуждается в моем предыдущем блоге. Обратите внимание, что для некоторых реализаций древовидных алгоритмов обучения пропущенные значения учитываются. Некоторые интересные эксперименты с этим подробно описаны ниже.

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

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

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

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

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

Количество функций, которые мы создаем для каждого индикатора, также можно настраивать. Давайте рассмотрим случай, когда мы решили создать по 3 функции для каждого индикатора. В наборе данных WDI 1594 индикатора. После удаления индикаторов согласно разделу Повторное введение данных выше у нас осталось 820 индикаторов. Всего это дает нам 2460 функций, p.

Как видите, p ›› n. Мы можем считать эти данные многомерными. Это несколько затрудняет выбор модели машинного обучения и метода оценки, о чем будет сказано ниже.

Прогнозное моделирование

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

Наивный прогнозист

Наш наивный прогнозист использует последнее значение SI.POV.DDAY для данной страны в качестве прогноза цели для этой страны.

Экспоненциальное сглаживание

Превосходное введение в экспоненциальное сглаживание можно найти в главе 7 книги Прогнозирование: принципы и практика. Здесь я реализую метод линейного тренда Холта с использованием библиотеки Python, statsmodels, так как считаю его наилучшим соответствием данным, имеющим тренд, но не имеющим сезонного компонента. Это расширение простого метода экспоненциального сглаживания для включения отдельного члена в прогноз для тренда. Для работы с классическими методами временных рядов в Python с использованием моделей pandas, numpy и statsmodels я нашел курс Хосе Марсиаль Портилла по Udemy, Python для анализа данных временных рядов быть отличным ресурсом.

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

Процесс обработки данных, который я использовал для подготовки данных для экспоненциального сглаживания, отличался от описанного выше. Для экспоненциального сглаживания это намного проще, поскольку интерес представляют только исторические значения индикатора, которые мы пытаемся предсказать (SI.POV.DDAY). Сначала мы конвертируем индекс года в метку времени с помощью pandas to_datetime () перед передачей данных в statsmodels. Данные организованы следующим образом:

Каждый столбец таблицы содержит значение нашего показателя бедности SI.POV.DDAY для данной страны до 2009 г. включительно. Помните, что цель нашего алгоритма прогнозирования - прогнозировать SI.POV.DDAY на 2010 год.

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

Лассо-регрессия

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

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

Случайный лес

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

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

XGBoost

Хорошее объяснение повышения градиента представлено здесь. Повышение градиента - это метод, при котором деревья строятся по одному, и каждое новое дерево помогает исправлять ошибки, сделанные ранее построенным деревом. Риск переобучения выше, чем для случайных лесов, поэтому важна настройка параметров, помогающая обеспечить хорошее обобщение модели. В своей записной книжке я прохожу несколько итераций настройки некоторых параметров, которые делают модель более консервативной и предотвращают переоснащение, такие как гамма, max_depth, min_child_weight, альфа-регуляризация L1 и лямбда-регуляризация L2.

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

Оценка моделей

Из-за большой размерности наших данных любые показатели производительности в нашем обучающем наборе, такие как R², p-значения и т. Д., Могут вводить в заблуждение из-за высокого риска переобучения. Поэтому жизненно важно, чтобы мы использовали какую-то меру в отдельном наборе тестов. Это может быть либо балл по набору сдерживающих тестов, либо баллы, связанные с наборами тестов перекрестной проверки, используемыми в обучении. В этом проекте я измеряю производительность, используя данные сдерживающего тестирования.

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

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

В следующей таблице результатов показано RMSE, полученное из ряда различных линейных моделей по сравнению с наивной моделью при прогнозировании нашей целевой переменной SI.POV.DDAY для всех стран в нашем целевом году, 2010, по сравнению с реальными значениями.

XGBoost без каких-либо попыток импутации данных до обучения оказался, безусловно, самой успешной моделью, которую я пробовал. Я немного вручную настроил параметры для XGBoost, чтобы получить оценку RMSE 3,11. Я использовал следующие параметры:

Интересно, что ключевым параметром успеха с XGBoost была настройка reg_lambda. Это термин регуляризации L2, аналогичный тому, что используется в линейной регрессии гребня. Таким образом, две наши самые эффективные модели, XGBoost и lasso, выполняют регуляризацию.

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

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