- Предиктивная аналитика данных — моделирование и валидация
- Понимание предиктивного анализа данных
- Полезные наборы данных
- R пакет AppliedPredictiveModeling
- Аналитика временных рядов
- Прогнозирование будущих событий
- Сезонность
- Визуализация компонентов
- R пакет – LiblineaR
- R пакет – eclust
- Выбор модели
- Python пакет – model-catwalk
- Python пакет – sklearn
- Julia пакет – QuantEcon
- Тест Грэнджера на причинность
Предиктивная аналитика данных — моделирование и валидация
Представляю вашему вниманию перевод главы из книги Hands-On Data Science with Anaconda
«Предиктивная аналитика данных — моделирование и валидация»
Наша основная цель в проведении различных анализов данных — это поиск шаблонов, чтобы предсказать, что может произойти в будущем. Для фондового рынка исследователи и специалисты проводят различные тесты, чтобы понять рыночные механизмы. В этом случае можно задать много вопросов. Каким будет уровень рыночного индекса в ближайшие пять лет? Каков будет следующий ценовой диапазон IBM? Будет ли волатильность рынка увеличиваться или уменьшаться в будущем? Каким может быть влияние, если правительства изменят свою налоговую политику? Какова потенциальная прибыль и убытки, если одна страна начнет торговую войну с другой? Как мы прогнозируем поведение потребителя, анализируя некоторые связанные переменные? Можем ли мы предсказать вероятность того, что студент-выпускник успешно закончит учебу? Можем ли мы найти связь между определенным поведением одного конкретного заболевания?
Поэтому мы рассмотрим следующие темы:
- Понимание предиктивного анализа данных
- Полезные наборы данных
- Прогнозирование будущих событий
- Выбор модели
- Тест Грэнджера на причинность
Понимание предиктивного анализа данных
У людей может быть много вопросов касательно будущих событий.
- Инвестор, если он может предсказать будущее движение цены акций, он может получить большую прибыль.
- Компании, если бы они могли прогнозировать тенденцию своей продукции, они могли бы увеличить свою цену акций и долю на рынке продукции.
- Правительства, если бы они могли предсказать влияние стареющего населения на общество и экономику, у них было бы больше стимулов для разработки лучшей политики с точки зрения государственного бюджета и других соответствующих стратегических решений.
- Университеты, если бы они могли хорошо понимать рыночный спрос с точки зрения качества и набора навыков для своих выпускников, они могли бы разработать набор лучших программ или запустить новые программы для удовлетворения будущих потребностей с точки зрения рабочей силы.
Для лучшего прогноза исследователи должны рассмотреть множество вопросов. Например, не слишком ли мал образец данных? Как удалить отсутствующие переменные? Является ли этот набор данных предвзятым в плане процедур сбора данных? Как мы относимся к экстремальным значениям или выбросам? Какова сезонность и как мы справляемся с этим? Какие модели мы должны применять? В этой главе будут затронуты некоторые из этих вопросов. Начнем с полезного набора данных.
Полезные наборы данных
Одним из лучших источников данных является UCI Machine Learning Repository. Зайдя на сайт мы увидим следующий список:
Например, если выбрать первый набор данных (Abalone), мы увидим следующее. Для экономии места отображается только верхняя часть:
Отсюда пользователи могут загрузить набор данных и найти определения переменных. Следующий код может быть использован для загрузки набора данных:
Соответствующий вывод показан здесь:
Из предыдущего вывода мы знаем, что в наборе данных имеется 427 наблюдения (набора данных). Для каждого из них у нас есть 7 связанных функций, таких как Name, Data_Types, Default_Task, Attribute_Types, N_Instances (количество экземпляров), N_Attributes (количество атрибутов) и Year. Переменная, называемая Default_Task, может быть интерпретирована как основное использование каждого набора данных. Например, первый набор данных, называемый Abalone, может быть использован для Classification. Функция unique() может быть использована для поиска всех возможных Default_Task, показанных здесь:
R пакет AppliedPredictiveModeling
Этот пакет включает в себя множество полезных наборов данных, которые могут использоваться для этой главы и других. Самый простой способ найти эти наборы данных — с помощью функции help(), показанной здесь:
Здесь мы покажем несколько примеров загрузки этих наборов данных. Чтобы загрузить один набор данных, мы используем функцию data(). Для первого набора данных, называемого abalone, у нас есть следующий код:
Вывод выглядит следующим образом:
Иногда, большой набор данных включает в себя несколько суб-наборов данных:
Для загрузки каждого набора данных, мы могли бы использовать функции dim(), head(), tail() и summary().
Аналитика временных рядов
Временные ряды можно определить как набор значений, полученных в последовательные моменты времени, часто с равными интервалами между ними. Существуют разные периоды, такие как годовой, ежеквартальный, ежемесячный, еженедельный и ежедневный. Для временных рядов ВВП (валовой внутренний продукт) мы обычно используем квартальные или годовые. Для котировок — годовые, ежемесячные и суточные частоты. Используя следующий код, мы можем получить данные ВВП США как ежеквартально, так и за годовой период:
Однако у нас есть много вопросов для анализа временных рядов. Например, с точки зрения макроэкономики мы имеем деловые или экономические циклы. Отрасли или компании могут иметь сезонность. Например, используя сельскохозяйственную промышленность, фермеры будут тратить больше в весенние и осенние сезоны и меньше на зиму. Для розничной торговли у них был бы огромный приток денег в конце года.
Чтобы манипулировать временными рядами, мы могли бы использовать множество полезных функций, включенных в пакет R, называемый timeSeries. В примере мы возьмем среднесуточные данные с еженедельной частотой:
Мы могли бы также использовать функцию head(), чтобы увидеть несколько наблюдений:
Прогнозирование будущих событий
Есть много методов, которые мы могли бы использовать при попытке предсказать будущее, таких как скользящее среднее, регрессия, авторегрессия и т. п. Во-первых, давайте начнем с простейшего для скользящего среднего:
В предыдущем коде значение по умолчанию для количества периодов равно 10. Мы могли бы использовать набор данных, называемый MSFT, включенный в пакет R, называемый timeSeries (см. Следующий код):
В ручном режиме мы находим, что среднее из первых трех значений x совпадает с третьим значением y. В каком-то смысле мы могли бы использовать скользящее среднее для прогнозирования будущего.
В следующем примере мы покажем, как оценить ожидаемую доходность рынка в следующем году. Здесь мы используем индекс S&P500 и историческое среднегодовое значение в качестве наших ожидаемых значений. Первые несколько команд используются для загрузки связанного набора данных под названием .sp500monthly. Целью программы является оценка среднегодового среднего и 90-процентного доверительного интервала:
Как видно из результатов, историческая среднегодовая доходность для S&P500 составляет 9%. Но мы не можем заявить, что доходность индекса в следующем году будет равна 9%, т.к. она может быть от 5% до 13%, а это огромные колебания.
Сезонность
В следующем примере мы покажем использование автокорреляции. Во-первых, мы загружаем R пакет под названием astsa, который выступает для прикладного статистического анализа временных рядов. Затем мы загружаем ВВП США с ежеквартальной частотой:
В вышеуказанном коде — функция diff() принимает разницу, например текущее значение минус предыдущее значение. Второе значение ввода указывает на задержку. Функция, называемая acf2(), используется для построения и печати ACF и PACF временного ряда. ACF обозначает функцию автоковариации, а PACF обозначает функцию частичной автокорреляции. Соответствующие графики показаны здесь:
Визуализация компонентов
Понятно, что концепции и наборы данных были бы намного более понятными, если бы мы могли использовать графики. Первый пример показывает колебания ВВП США за последние пять десятилетий:
Соответствующий график показан здесь:
Если бы мы использовали логарифмическую шкалу для ВВП, у нас был бы следующий код и график:
Следующий график близок к прямой линии:
R пакет – LiblineaR
Этот пакет представляет собой линейные прогностические модели, основанные на LIBLINEAR C/C++ Library. Вот один из примеров использования набора данных iris. Программа пытается предсказать, к какой категории относится растение, используя данные обучения:
Вывод следующий. BCR — это сбалансированная классификационная ставка. Для этой ставки, чем выше, тем лучше:
R пакет – eclust
Этот пакет представляет собой средо-ориентированную кластеризацию для интерпретируемых прогнозных моделей в высокоразмерных данных. Сначала давайте рассмотрим набор данных с именем simdata, который содержит смоделированные данные для пакета:
Предыдущий вывод показывает, что размерность данных равна 100 на 502. Y — это вектор непрерывного отклика, а E — двоичная переменная среды для метода ECLUST. E = 0 для неэкспонированных (n = 50) и E = 1 для экспонированных (n = 50).
Следующая программа R оценивает z-преобразование Фишера:
Определим z-преобразование Фишера. Предполагая, что у нас есть набор из n пар xi и yi, мы могли бы оценить их корреляцию, применяя следующую формулу:
Здесь p — корреляция между двумя переменными, а и
являются выборочные средние для случайных величин х и у. Значение z определяется как:
ln — функция натурального логарифма, а arctanh() — обратная гиперболическая касательная функция.
Выбор модели
При нахождении хорошей модели, иногда мы сталкиваемся нехваткой/переизбытком данных. Следующий пример заимствован отсюда . Он демонстрирует проблемы работы с этим и то, как мы можем использовать линейную регрессию с полиномиальными признаками для аппроксимации нелинейных функций. Указанная функция:
В следующей программе мы пытаемся использовать линейные и полиномиальные модели для аппроксимации уравнения. Слегка измененный код показан здесь. Программа иллюстрирует влияние нехватки/переизбытка данных на модель:
Полученные графики показаны здесь:
Python пакет – model-catwalk
Пример можно найти здесь.
Первые несколько строк кода показаны здесь:
Соответствующий вывод показан здесь. Для экономии места представлена только верхняя часть:
Python пакет – sklearn
Поскольку sklearn — очень полезный пакет, стоит показать больше примеров использования этого пакета. Приведенный здесь пример показывает, как использовать пакет для классификации документов по темам с использованием подхода «bag-of-words».
В этом примере используется матрица scipy.sparse для хранения объектов и демонстрируются различные классификаторы, которые могут эффективно обрабатывать разреженные матрицы. В этом примере используется набор данных из 20 групп новостей. Он будет автоматически загружен, а затем кэширован. ZIP-файл содержит входные файлы и может быть загружен здесь. Код доступен здесь. Для экономии места показаны только первые несколько строк:
Соответствующий вывод показан здесь:
Для каждого метода есть три показателя: оценка, время обучения и время тестирования.
Julia пакет – QuantEcon
Возьмем для примера использование Марковских цепей:
Цель примера состоит в том, чтобы увидеть, как человек из одного экономического статуса в будущем трансформируется в другого. Во-первых, давайте посмотрим на следующий график:
Давайте посмотрим на крайний левый овал со статусом «poor». 0.9 означает, что человек с таким статусом имеет 90% шансов остаться бедным, а 10% переходит в средний класс. Он может быть представлен следующей матрицей, нули находятся там, где нет ребра между узлами:
Говорят, что два состояния, x и y, связаны друг с другом, если существуют положительные целые числа j и k, такие как:
Цепь Маркова P называется неприводимой, если все состояния связываются; то есть, если x и y сообщаются для каждого (x, y). Следующий код подтвердит это:
Следующий график представляет экстремальный случай, так как будущий статус для бедного человека будет на 100% бедным:
Следующий код также подтвердит это, так как результат будет false:
Тест Грэнджера на причинность
Тест Грэнджера на причинность используется для определения того, является ли один временной ряд фактором, и предоставляет полезную информацию для прогнозирования второго. В следующем коде набор данных с именем ChickEgg используется в качестве иллюстрации. Набор данных имеет две колонки, число цыплят и количество яиц, с отметкой времени:
Вопрос в том, можем ли мы использовать число яиц в этом году, чтобы предсказать число цыплят в следующем году?
Если это так, то количество цыплят будет причиной по Грэнджеру для количества яиц. Если это не так, мы говорим, что количество цыплят не является причиной по Грэнджеру для количества яиц. Вот соответствующий код:
В модели 1 мы пытаемся использовать лаги цыплят плюс лаги яиц, чтобы объяснить количество цыплят.
Т.к. значение P довольно мало (оно значимо при 0,01) мы говорим, что количество яиц является причиной по Грэнджеру для количества цыплят.
Следующий тест показывает, что данные о цыплятах не могут быть использованы для прогнозирования следующего периода:
В следующем примере мы проверяем доходность IBM и S&P500 с целью выяснить, что их них является причиной по Грэнджеру для другого.
Сначала мы определим функцию доходности:
Теперь функция может быть вызвана с входными значениями. Цель программы — проверить, можем ли мы использовать отставания на рынке для объяснения доходности IBM. Точно так же мы проверяем, объяснить отставания IBM доходами рынка:
Результаты показывают, что индекс S&P500 можно использовать для объяснения доходности IBM за следующий период, поскольку он статистически значим на уровне 0,1%. Следующий код будет проверять, объясняет ли отставание IBM изменение S&P500:
Результат предполагает, что в течение этого периода доходность IBM может быть использованы для объяснения индекса S&P500 следующего периода.
Источник