Конкурентоспособное машинное обучение в Numerai

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

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

Введение

Я представлю модель, которую я использовал, участвуя в конкурсе по машинному обучению Numerai, для прогнозирования фондового рынка на основе гомоморфно зашифрованных данных. Код некоторое время был доступен в моей учетной записи github, хотя и не обновлялся с учетом последних его версий.

Есть несколько отличных вводных статей, в которых люди хорошо поработали над созданием базы для построения, хотя я не видел, чтобы кто-то публиковал код или писал о своем решении для чего-то, что составляло бы список лидеров и приносило им деньги ( трагедия общин может объяснить причину этого; модель зарабатывания денег может быть не тем, чем вы хотели бы поделиться).

Этот попал в сотню лучших примерно десять раз, и в общей сложности выиграл мне около 100 долларов и около 150 ЯМР или около того (чья стоимость в долларах колебалась между 10–50 долларов в течение последних шести месяцев или около того, но составляла около 200 долларов в один пункт).

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

Предварительная обработка данных

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

Вместо этого кто-то предложил сделать пару итераций t-SNE в 2–3 измерениях и добавить результирующие функции в качестве дополнительных характеристик исходных данных.

Поначалу это может показаться немного странным, поскольку t-SNE - это в основном метод визуализации для данных большой размерности, но также и PCA, LDA и т.д. в противном случае другие алгоритмы могут пропустить. Добавление полученного низкоразмерного представления к исходным данным может фактически помочь более известным алгоритмам классификации увидеть закономерности. Хотя нет реальной причины для добавления выходных данных t-SNE к исходным данным вместо их использования самостоятельно, это просто привело к более высокой точности этих данных. набор.

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

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

В итоге я выполнил пять итераций t-SNE только для двух измерений и без итераций в более высоких измерениях (ограничение здесь заключалось в том, что большее количество измерений значительно увеличивало время обучения, а дополнительные итерации или измерения не влияли на конечную точность намного больше после это в любом случае):

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

Тренировка ансамбля

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

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

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

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

Обучение блендера и прогнозирование на живых данных

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

Дополнительные эксперименты

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

Вывод

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

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

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

Спасибо за чтение, не стесняйтесь комментировать и задавать вопросы!