Использование методов машинного обучения для создания биржевого робота

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

В настоящее время, наука об анализе данных с целью выявления скрытых зависимостей для их дальнейшего прогнозирования, считается неотъемлемой частью современного мира. Её название – машинное обучение. Сфера влияния машинного обучения распространилась практически на все современные виды деятельности. В медицинской отрасли машинное обучение применяется для прогнозирования состояния здоровья человека на ближайшие годы. Предположим, что у нас есть данные анализов объекта (человека), у которого есть признаки (содержание химических элементов в крови), и есть область знаний (исторические данные о заболеваниях). Сопоставив исходные данные о человеке с областью знаний, машинное обучение позволит спрогнозировать состояние здоровья человека на несколько лет вперед в зависимости от поставленной задачи.

Мы привыкли пользоваться поисковиками, такими как Google или Yandex. Эти компании используют анализ данных, введенных пользователями для обучения поисковой машины. Так как просто невозможно учесть все критерии запросов пользователей и релевантные ответы к ним.

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

Виды моделей машинного обучения

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

Предлагаю рассмотреть наиболее часто применяемые на практике модели: обучение с учителем и обучение без учителя.

Обучение с учителем

Подход к машинному обучению можно логично разделить на два типа: обучение с учителем, то есть на размеченных данных, и обучение без учителя. В случае обучения с учителем у нас есть данные, которые разделены на области признаков объектов и ответов. X = , i=1..l. Постановка задачи обучения с учителем заключается в том, чтобы найти такой алгоритм Q(α, X) →

на котором будет достигаться минимум функционала ошибки. Тип задачи обучения с учителем заключается в ответах, которые необходимо получить. В простейшем случае пространством ответов является множество 2 элементов, например {0, 1} или {-1, 1}. В этом случае множество объектов, которые имеют один ответ, называются классом, и перед нами задача классификации.

Бинарная классификация

В общем случае задача классификации заключается в том, чтобы провести прямую через множества объектов таким образом, что разделяющая прямая отсекала один класс от другого. Задачи классификации бываю многоклассовыми. В этом случае множество ответов не ограничивается двумя числами, Y = {0, 1, …, K}.

Многоклассовая классификация

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

Восстановление регрессии

Обучение без учителя

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

Кластеризация

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

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

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

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

Прикладное применение машинного обучения

В текущей работе будет предложено рассмотрение трёх алгоритмов машинного обучения. В первой части главы будет показано прогнозирование сорта вина в зависимости от его характеристик на примере применения алгоритма К ближайших соседей. Будет проведен анализ данного алгоритма с целью выявления оптимального количества ближайших соседей для достижения большей точности прогноза. Во второй части будет затронута тема восстановления регрессии. Будет показано, как можно спрогнозировать выручку компании в зависимости от её вложений в рекламу по телевидению, радио и газетам. Также введем понятие стохастического градиентного спуска и попробуем применить его для задачи прогноза дохода компании. В заключение сравним результаты работы обучения с помощью нормального уравнения и стохастического градиентного спуска. Инструментарий, который будет использован: Python, Ipython notebook, scipy, sklearn, numpy, pandas.

Метод К ближайших соседей

Метод ближайших соседей, пожалуй, является самым простым алгоритмом в машинном обучении. Алгоритм относит поступивший объект u к тому классу, элементов которого окажется больше среди К ближайших соседей:


Алгоритм К ближайших соседей чувствителен к масштабу признаков. Так, если масштаб одного из признаков существенно превосходит масштабы остальных признаков, то их значения практически не будут влиять на ответы алгоритма. Поэтому очень важно производить масштабирование признаков. Обычно это делается путем вычитания среднего значения признака и деления результата на стандартное отклонение текущего столбца. Для обучения модели будем пользоваться кросс-валидацией, суть проста. На I-м шаге I-блок выступает в качестве тестовой выборки, объединение всех остальных блоков – в качестве обучающей выборки. Такимобразом, на каждом шаге алгоритмобучается на некоторойобучающей выборке, после чего вычисляется его качество на тестовой выборке.

Кросс-валидация

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

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

Считывание данных

 

Данные о винах

 

Теперь выделим из данных целевой вектор, то есть вектор ответов и матрицу признаков.

Выделение целевого вектора и матрицы признаков

Посмотрим матрицу признаков и вектор ответов для первых 5 объектов.

Признаки вин

Посмотрим при каком параметре К – количество ближайших соседей, достигается минимум функционала ошибки.

Определение точности алгоритма с параметром К = 1

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

Нахождение оптимального К

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

Восстановление регрессии. Нормальное уравнение

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

Модель регрессии – линейная:


Линейная регрессия использует простой функционал качества – среднеквадратичную ошибку. Мы будем работать с выборкой, содержащей 3 признака. Для настройки параметров (весов) модели решается следующая задача:

где xi1, xi2, xi3 – значения признаков i-го объекта, yi – значение целевого признака i-го объекта, ℓ -число объектов в обучающей выборке.

Нахождение вектора оптимальных весов w может быть сделано и аналитически. Мы хотим найти такой вектор весов w, чтобы вектор y, приближающий целевой признак, получался умножением матрицы X (состоящей из всех признаков объектов обучающей выборки, кроме целевого) на вектор весов w. То есть, чтобы выполнялось матричное уравнение:


Домножим данное уравнение слева и справа на

и выразим вектор весов:

Матрица:


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

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

Загрузим датасет:

Загрузка датасета

Посмотрим, как выглядят данные, также посмотрим их статистики:

Первые пять значений датасета

 

Попарные зависимости данных

Отмасштабируем матрицу признаков объектов, вычтя из признака значение среднего, и результат поделим на стандартное отклонение:

Масштабирование матрицы признаков

Добавим к матрице X столбец из единиц, используя методы hstack, ones и reshape библиотеки NumPy. Вектор из единиц нужендля того, чтобы необрабатывать отдельно коэффициент w0 линейной регрессии.

Добавление вектора из единиц

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

Объявление функций среднеквадратической ошибки и прогнозирования линейной модели

Основной функцией для прогноза будет являться функция, которая решает нормальное уравнение:

Функция для решения нормального уравнения

 

Значение вектора весов

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

Среднеквадратичная ошибка для линейной модели

Восстановление регрессии. Стохастический градиентный спуск

Параметры w0,w1,w2,w3, по которым минимизируется среднеквадратичная ошибка, можно находить численно с помощью градиентного спуска. Градиентный шаг для весов будет выглядеть следующим образом:

Здесь η – параметр, шаг градиентного спуска. Проблема градиентного спуска, описанного выше, в том, что на больших выборках считать на каждом шаге градиент по всем имеющимся данным может быть очень вычислительно сложно.

В стохастическом варианте градиентного спуска поправки для весов вычисляются только с учетом одного случайно взятого объекта обучающей выборки:

где k – случайный индекс, k{1,…,ℓ}.

Напишем функцию stochastic_gradient_step, реализующую шаг стохастического градиентного спуска для линейной регрессии. Функция должна принимать матрицу X, векторы y и w, число train_ind – индекс объекта обучающей выборки (строки матрицы X), по которому считается изменение весов, а также число η (eta) – шаг градиентного спуска (по умолчанию eta = 0.01). Результатом будет вектор обновленных весов. Наша реализация функции будет явно написана для данных с 3 признаками:

Функция градиентного шага

Создадим функцию stochastic_gradient_descent, реализующую стохастический градиентный спуск для линейной регрессии. Функция принимает на вход следующие аргументы:

– X – матрица, соответствующая обучающей выборке; – y – вектор значений целевого признака;
– w_init – вектор начальных весов модели;
– eta – шаг градиентного спуска (по умолчанию 0.01);
– max_iter – максимальное число итераций градиентного спуска (по умолчанию 10000);
– max_weight_dist – минимальное евклидово расстояние между векторами весов на соседних итерациях градиентного спуска, при котором алгоритм прекращает работу (по умолчанию 1e-8);
– seed – число, используемое для воспроизводимости сгенерированных псевдослучайных чисел (по умолчанию 42);
– verbose – флаг печати информации (например, для отладки, по умолчанию False).

На каждой итерации в вектор (список) должно записываться текущее значение среднеквадратичной ошибки. Функция должна возвращать вектор весов w а также вектор (список) ошибок.

Реализация градиентного спуска

Запустим 10^5 итераций стохастического градиентного спуска. Укажем вектор начальных весов w_init, состоящий из нулей. Зададим параметры eta и seed равными их значениям по умолчанию (eta = 0.01, seed = 42). Проделаем это для того, чтобы понять, как меняется функционал ошибки в зависимости от итерации, в идеальномслучае, если всереализовано корректно, должны увидетьсходимость.