Учебник по машинному обучению и турнир Numerai

Что такое Numerai?

Numerai - хедж-фонд, использующий модели машинного обучения из краудсорсинга.

Numerai выпускает еженедельные наборы данных, относящиеся к финансовым данным, и пользователи используют эти данные для построения модели, которая генерирует прогнозы будущих движений на рынке. Эти прогнозы выполняются хедж-фондом Numerai, и участники получают вознаграждение (~ 20 000 долларов США) в зависимости от выполнения их прогнозов.

Что это?

Это учебное пособие для начала работы с турниром Numerai, цель которого - обобщить его как подход к решению большинства других проблем машинного обучения.

В этом руководстве предполагается, что вы знакомы с программированием (имеете опыт хотя бы одного курса информатики или его эквивалента), но вам не обязательно иметь опыт работы с машинным обучением. Формат учебника структурирован следующим образом:

  1. Настройка среды разработки
  2. Понимание данных
  3. Понимание показателей производительности
  4. Выбор модели
  5. Добавление проблемных компонентов

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

Настройка среды разработки

В этом разделе содержатся инструкции по установке Python, Anaconda, CUDA, cuDNN и Tensorflow GPU. По сути, конечная цель состоит в том, чтобы при обучении модели ваш компьютер использовал графический процессор вместо процессора. Когда я настраивал свою среду, некоторые из них у меня уже были установлены, но у меня возникли некоторые проблемы, когда версии не совпадали. Не было полукомплектного ресурса для настройки среды разработки, поэтому я включаю его здесь! Если у вас все работает нормально, можете пропустить этот раздел.

Я использую Windows 10 с графическим процессором NVIDIA GeForce GTX 860M. Настройка должна быть аналогичной для других графических процессоров NVIDIA - и модель должна по-прежнему тренироваться даже без графического процессора (хотя и намного медленнее). Как найти свой GPU.

Анаконда

«Conda - это система управления пакетами с открытым исходным кодом и система управления средой, работающая в Windows, macOS и Linux».

Моя наивная интерпретация Conda заключается в том, что она включает и устанавливает множество полезных приложений Python (некоторые из них перечислены ниже) при первой загрузке. Кроме того, вы также можете использовать Conda для простой загрузки дополнительных пакетов. Вы можете скачать все вручную, Conda просто сделает это за вас.

Conda включает Python 3.4, scikit-learn, pandas, numpy и pip.



Следуйте инструкциям по ссылке выше, и все будет в порядке.

CUDA, cuDNN и графический процессор Tensorflow



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

  1. Обновите pip (еще одну систему управления пакетами) до последней версии.
conda install pip

2. Загрузите новейший драйвер для вашего графического процессора.



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

Доступ к среде Anaconda в вашей среде IDE

Для этого проекта я установил PyCharm IDE. Основная причина этого в том, что я хотел попрактиковаться в Git, системе контроля версий, а PyCharm - одна из IDE, поддерживающих Git. Git помогает сохранять и получать доступ к различным версиям вашего кода и широко используется в промышленности.

Скорее всего, у вас есть собственная среда IDE, с которой вы уже знакомы, и с ней все будет в порядке. Конечно, настройка Anaconda в качестве вашего интерпретатора будет отличаться в зависимости от IDE, которую вы используете, но вы, вероятно, сможете найти ее в настройках. Вот как вы настраиваете среду Anaconda в PyCharm.



Понимание данных

Теперь, когда у нас есть настройка, мы можем приступить к просмотру данных.

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

Скачайте и откройте .zip, и вы найдете два файла .csv.

  • numerai_training_data.csv
  • numerai_tournament_data.csv

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

Файл training_data содержит все данные обучения. Файл турнирных_данных разделен на проверочные, тестовые и живые данные. Это разделение важно для перекрестной проверки, о чем будет сказано ниже.

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

Вот как я организовываю свои файлы, но вы можете установить TRAINING_PATH и TESTING_PATH, где хранятся ваши наборы данных.

Установка путей к файлам:

tour = '102' #tournament number 102
TRAINING_PATH = 'C:/Users/Peter/Desktop/Numerai/numerai_dataset_%s/numerai_training_data.csv'%(tour)
TESTING_PATH = 'C:/Users/Peter/Desktop/Numerai/numerai_dataset_%s/numerai_tournament_data.csv'%(tour)

Импортируйте данные с помощью панд:

import pandas as pd
training_data = pd.read_csv(TRAINING_PATH, header=0)
tournament_data = pd.read_csv(TESTING_PATH, header=0)

Мы можем получить некоторую сводную статистику данных обучения с помощью функций head () и tail (). Вот как выглядит training_data:

training_data.head()
training_data.tail()

  • Мы обнаружили, что обучающие данные содержат 393 613 строк с 54 столбцами.
  • Первые три столбца - это «id», «era» и «data_type».
  • Следующие пятьдесят столбцов содержат функции в диапазоне от «feature1» до «feature50».
  • Последний столбец - «цель» (0 или 1).

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

Что означают или представляют все эти данные?

Numerai дает нам два факта о данных: они запутаны (это означает, что мы не можем получить никакого значения из функций), и «столбец эпохи соответствует неопределенным периодам времени». Вот что делает этот турнир уникальным - мы поговорим об этом позже.

Теперь, когда у нас есть данные, что нам с ними делать?

Y = f (X) охватывает основную идею обучения с учителем, что мы и пытаемся сделать; учитывая некоторые входные данные X, найдите функцию (модель) f, которая дает нам выходы Y.

Ключевое понятие: обучение с учителем

В обучающих данных нам даны как функции (подумайте значения X), так и цель (подумайте значения Y). Цель состоит в том, чтобы использовать эти обучающие данные для обучения / создания модели, которая сможет дать нам правильные целевые метки (значения Y) для новых значений для функций (значения X).

Эти новые данные называются тестовыми данными, потому что вам неизвестны целевые метки (значения Y), как для обучающих данных. «Обучение модели» включает использование примеров пар (X, Y) из обучающих данных для создания модели, которая может принимать новые значения X и предсказывать новые значения Y.

Пример: y = mx + b имеет структуру (линейную) и некоторые параметры (m, b).

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

Дополнительное примечание. Модели выполняют регрессию и / или классификацию.
Регрессия используется для непрерывных значений, например прогнозирование температуры, а для дискретных значений используется классификация, например горячий / холодный или 1/0. Для турнира Numerai вы выполняете логистическую регрессию. Вы будете прогнозировать вероятность того, что целью будет «1», поэтому значения будут между [0,1].

Давайте посмотрим на тестовые данные, которые находятся в файле Tournament_data:

tournament_data.head()
tournament_data.tail()

Если мы посмотрим на файл турнирных_данных, мы обнаружим те же 50 столбцов функций, но на этот раз в данных турнира есть новые типы данных: 'validation', 'test' и "жить". У нас есть образцы от "era121" до "era132", которые относятся к данным проверки, плюс "eraX", который принадлежит тестовым и оперативным данным. Вы можете видеть, что в столбце «target» для наблюдений eraX указано NaN (не определено), поскольку это значения, которые вы пытаетесь предсказать.

  • Данные «валидации» по сути такие же, как данные обучения ранее. У вас есть функции и цели, и вы будете использовать данные обучения и проверки для создания модели. Почему они разделены, будет рассмотрено позже.
  • «Тестовые» данные используются Numerai в качестве начальной проверки, когда вы отправляете свою модель, чтобы убедиться, что она проходит определенные тесты. Опять же, у вас нет целей для тестовых данных, потому что вы будете прогнозировать их цели и отправлять свои прогнозы в Numerai.
  • «Живые» данные - это то, что Numerai фактически использует для инвестирования в фондовый рынок, а Numerai определяет успешность ваших представлений после того, как прогнозы используются на фондовом рынке в течение трех недель. Вы будете отправлять свои прогнозы для данных в реальном времени вместе с данными тестирования.

Цель состоит в том, чтобы предсказать целевые (Y) значения (0 и 1) для тестовых и текущих данных с учетом предыдущих данных ( обучение + проверка), где нам известны фактические целевые (Y) значения.

«В чем важность всех этих типов данных?»

Ключевая концепция: переоснащение и перекрестная проверка

Вот где возникает разделение между данными обучения и проверки. Возвращаясь к Y = f (X), мы подходим к идее создания / обучения модели. Если вы посмотрите на график ниже, представьте, что черные точки представляют собой только данные обучения. Синяя линия представляет собой хорошо подобранную модель, что означает, что она очень точно предсказывает данные обучения. Но если бы вы использовали синюю линию для прогнозирования новых точек данных (проверочных, тестовых или оперативных данных), это, вероятно, не будет очень точным. Было бы лучше использовать более общую модель, такую ​​как черная линия, которая представляет собой простую линейную модель.

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

Один из способов избежать переобучения - использовать перекрестную проверку.

Перекрестная проверка начинается с разделения данных на наборы для обучения и проверки. Numerai уже делает это за вас, но вы можете рассматривать оба набора как свои «полные» обучающие данные, потому что у вас есть значения X и Y для этих наблюдений. Перекрестная проверка работает путем обработки некоторых ваших обучающих данных, таких как тестовые и живые данные - вот один из способов подумать об этом:

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

  1. Вытяните часть данных и «сделайте вид, что мы их не видим» (данные проверки)
  2. Создайте модель на основе остальных данных, которые мы «видим» (данные обучения).
  3. Используйте эту модель для создания прогнозов для данных, которые мы якобы блокировали, и
  4. Сравните свои прогнозы с истинными значениями

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

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

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

Понимание показателей производительности

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

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

Логарифмическая потеря

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

Для сравнения, случайная модель даст логарифм потерь 0,6931. Если вы посмотрите на прошлые турниры на веб-сайте Numerai, вы обнаружите, что допустимые модели редко имеют потери журнала в реальном времени ниже 0,690, хотя взаимосвязь между потерей журнала проверки (что вы получаете при загрузке набора данных) и потерей журнала в реальном времени (после трех недель, разрешающий период) неясно.

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

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

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

Для действующей модели потребуется согласованность не менее 58% (потеря журнала должна быть ниже 0,693 в 7 из 12 периодов тестирования).

Следует отметить, что согласованность имеет значение только для проверки вашей модели - вам нужно только позаботиться о том, чтобы ваша согласованность составляла ›58%, когда вы загружаете свои прогнозы, это не имеет значения для живого выступления. Было бы действительно полезно выяснить, может ли высокая согласованность быть связана с более низкими потерями в реальном времени.

Оригинальность
Оригинальность определяет, не коррелируют ли загруженные прогнозы с ранее представленными.

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

Согласованность
Согласованность определяет, имеют ли валидация, тест и оперативный набор прогнозы, созданные одной и той же моделью.

Согласование требуется, но это не проблема.

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

Часть 2: https://medium.com/@bradleyting/explain-machine-learning-to-someone-who-has-made-a-hello-world-pt-2-bcc6ec994c3a