Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 6

 
Dr.Trader:

"CSV file" и "R dataset" на закладке evaluate это просто разные способы указать источник данных. Если в них подать одни и те же данные, то и результат при тестировании модели будет одинаковый.

Если перед запуском rattle выполнить

, то этот самый dataset_validate теперь будет доступен на закладке evaluate как R dataset. Но результат проверки модели в итоге будет такой же самый как если просто выбрать опцию csv file и указать файл C:/dummy_set_validation.csv, данные для теста в обоих случаях будут идентичные.

Cамо обучение было на другом файле, dummy_set_features.csv, так что заглядывание в будущее тут невозможно, ибо данные в обоих файлах разные, и вообще не зависят от времени (а от формулы). Я считаю что нейронка отлично справилась и нашла 6 входов которые определяют результат, снизила воздействие остальных входов, и какой-то своей нейронной логикой описала нужную формулу.

Я на всякий случай сверил оба файла чтоб найти дубликаты строк, мало-ли они всётаки есть. Вот код на R:

Если это выполнить до запуска rattle, то в нём будет доступен выбор обоих таблиц dataset_train и dataset_validate для обучения и проверки модели, повторов в них уже не будет. Слава R.

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

Видно я не способен объяснить то, что хочу.

1. Не могли бы Вы указать даты начала и конца для обоих файлов?

2. В файле dataset_validate ничего убирать нельзя, так как это файл имитирует поступление бар за баром. 

 

Я с утра ещё подумал над этим, всё на самом деле не так просто.

Согласно вашей формуле, существует всего 2^6 = 64 комбинации используемых входов. Если алгоритм обучения как-то определит значимость именно этих 6 входов, то он вполне может запомнить все 64 комбинации. И тогда уже не важно что комбинация всех входов в валидационной выборке уникальна, модель возьмёт только тех 6 значимых входов и определит уже известный ей ответ. У меня с нейронкой так и вышло. Я сейчас убрал пару комбинаций 1,3,5,7,9,11 входов из тренировочного файла, но оставил подобные комбинации в валидационном файле. Ошибка при тренировке осталась по прежнему 0%, но вот при валидации - выросла до 50% на тех новых комбинациях. А это плохо, на форексе спред бы увёл депозит в минус. СанСаныч прав, тут всё дело в переобучении, признаю я был не прав.

Видимо поэтому многие модели и не работают на форексе, они просто запоминают некие комбинации, но не справляются с новыми.

 
СанСаныч Фоменко:

Видно я не способен объяснить то, что хочу.

1. Не могли бы Вы указать даты начала и конца для обоих файлов?

2. В файле dataset_validate ничего убирать нельзя, так как это файл имитирует поступление бар за баром. 

Нет, всё правильно, я понял. То что вы говорите относится к форексу, и я с этим согласен. Но я говорил про файлы от Алексея, и обучение модели на них. 

https://c.mql5.com/3/96/dummy_set_features.zip - обучение

https://c.mql5.com/3/96/dummy_set_validation.zip - валидация

результат в файлах определяется формулой "1-mod(sum(input_1; input_3 ; input_5 ;  input_7 ;  input_9 ; input_11);2)" 

 

Дайте пожалуйста ссылку на те файлы о которых вы говорили, я попробую на них обучить нейронку. 

 
Ребята,

Я правильно мысль ухватил, что лес на всех данных переобучился, хотя и выделил важные фичи. Для него надо очищать данные и еще раз обучать.

А НС без очистки данных нормально обучалась ?

Спасибо 
 
Dr.Trader:

Нет, всё правильно, я понял. То что вы говорите относится к форексу, и я с этим согласен. Но я говорил про файлы от Алексея, и обучение модели на них. 

https://c.mql5.com/3/96/dummy_set_features.zip - обучение

https://c.mql5.com/3/96/dummy_set_validation.zip - валидация

результат в файлах определяется формулой "1-mod(sum(input_1; input_3 ; input_5 ;  input_7 ;  input_9 ; input_11);2)" 

 

Дайте пожалуйста ссылку на те файлы о которых вы говорили, я попробую на них обучить нейронку. 

Держите, в архиве.

Это RData. Открываете R, грузите rattle и из него доступны фреймы данных 

"R1.F1"    "R1.F3"    "R1.F4"    "R1.F5"    "R1.F6"   - это для обучения, имеет разные целевые переменные, которые обозначены буквой Fi

"R2.F1"    "R2.F3"    "R2.F4"    "R2.F5"    "R2.F6"   - это для проверки 

"Rat_DF1"  "Rat_DF2"  "Rat_DF3" - это файл, который содержит все целевые переменные

Файлы:
ALL_cod.zip  3281 kb
 
Alexey Burnakov:
Ребята,

Я правильно мысль ухватил, что лес на всех данных переобучился, хотя и выделил важные фичи. Для него надо очищать данные и еще раз обучать.

А НС без очистки данных нормально обучалась ?

Спасибо 
Да, для этого задания из первого поста всё так и есть. Но если применять НС для Форекса, то НС на мусоре тоже переобучится и будет хуже работать на новых данных, так что отбор входных данных там тоже актуален.
 
Dr.Trader:
Да, для этого задания из первого поста всё так и есть. Но если применять НС для Форекса, то НС на мусоре тоже переобучится и будет хуже работать на новых данных, так что отбор входных данных там тоже актуален.

d Тестовые данные чистые. Значит, закономерность там есть на любых участках. На реальных данных не обойтись без того, чтобы обучающую выборку разбивать на несколько частей и при обучении модели контролировать показатели на подвыборке или нескольких подвыборках. Это прямо правило.

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

 

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

 

И еще один аспект, очень важный. Тестовый пример содержит взаимно независимые наблюдения. Каждая строка никак не зависит от любой другой. В реальности на временных рядах соседние наблюдения будут зависимы. Например, два соседних значения машки будут сильно скоррелированы. И поэтому любые - подчеркну, ЛЮБЫЕ - методы будут лажать на сырых реальных данных. Правильный способ, идеальный, для подготовки реальных данных к обучению - это так их отобрать, чтобы соседние наблюдения не были физически связаны. Для временных рядов это означает, что если вы берете индикаторы с окном 20, то соседние наблюдения в выборке для обучения должны браться с разницей не менее 20 шагов. Чтобы не было их взаимной связи. Тогда начинает работать статистика и собственно обучение закономерностям а не случайным скоплениям похожих данных. Надеюсь, вы поймете меня.

 

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

 

Алексей 

 
Dr.Trader:

Но поскольку НС как чёрный ящик, логику решения узнать нельзя. Можно посмотреть на веса, определить среднее абсолютное значение к каждому входу, и нарисовать диаграмму. И узнать что 1, 3, 5 ,7, 9, 11 важнее остального. Но при этом остальные входы тоже почему-то используются, нулевых весов нигде нету. То есть получается наоборот, сначала проходит обучение, затем мы можем определить важные входы.

Попробуйте какой-нибудь алгоритм контрастирования НС. Алгоритм может самостоятельно прореживать как входы (вам не придется их отбирать просмотром "вручную"), так и связи (и нейроны скрытых слоев, само собой). На выходе получите краткое описание логики работы.
 
СанСаныч Фоменко:

Держите, в архиве.

Это RData. Открываете R, грузите rattle и из него доступны фреймы данных 

"R1.F1"    "R1.F3"    "R1.F4"    "R1.F5"    "R1.F6"   - это для обучения, имеет разные целевые переменные, которые обозначены буквой Fi

"R2.F1"    "R2.F3"    "R2.F4"    "R2.F5"    "R2.F6"   - это для проверки 

"Rat_DF1"  "Rat_DF2"  "Rat_DF3" - это файл, который содержит все целевые переменные

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

Результаты ниже относятся к обучению на R1.F3

1) С Rattle вышел забавный результат. НН со стандартной конфигурацией показала ошибки train/validate/testing - 30%/29%/33%. Ошибка на R2.F3 - 35%. Но всё это просто удачный случай на самом деле, в другой конфигурации она бы легко недо- или переобучилась, тут просто повезло.

2) Потом я взял простой грубый подход с обучением без контроля, 200 скрытых нейронов, сеть обучалась пока результат не перестал улучшаться. Ошибки train/validate/testing/R2.F3  -  2%/30%/27%/45%. Ну это понятно, сеть переобучилась.

3) Обучение с контролем. Это отличается от деревьев, но с нейронкой так вообще всегда надо делать чтоб её не переобучить. Суть в том чтобы иногда приостанавливать обучение, и сверять результаты train/validate/testing. Золотого правила сверки результатов я не знаю, но вполне нормальный подход это обучать на train датасете, потом смотреть на ошибки в validate и testing датасетах, прекратить обучение когда ошибки в validate/testing перестанут понижаться. Это даёт какую-то гарантию от переобучения. R2.F3 во время всего этого процесса считается недоступным, и тест на нём делается только после конца обучения. В этом случае ошибки train/validate/testing/R2.F3  -  27%/30%/31%/37%. Тут опять наблюдается переобученность, но небольшая. Можно было остановить процесс обучения пораньше, после того как ошибка train стала заметно меньше ошибок validate/testing, но это уже гадание... могло помочь, а могло бы и нет.

 

У "R1.F1" целевая переменная имеет три значения, Rattle так не умеет с нейронкой, и нужно писать свой код на R, я этот датасет пропустил.

"R1.F4" "R1.F5" "R1.F6" давали в нейронке в Rattle примерно такие-же результаты для всех 4 ошибок, мне кажется адекватный подход с нейронкой тоже даст примерно теже результаты, я с ними дальше не занимался.

 

Про методику обучения.

 

Здесь я описывал стандартный способ, который обычно применим и дает хороший результат: https://www.mql5.com/ru/blogs/post/661499 

 

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

  Далее беру обучающую часть (наибольшую) - 10 лет самых отдаленных в прошлое. Создаю индексы строк для проведения кроссвалидации. То есть делю данные на 5 равных кусков, жестко отделенных по дате. При кроссвалидации модель перебирает параметры обучения такие как глубина, количество итераций и т.д., обучаясь на четырех пятных частей обучения и замеряет ошибку на одной пятой части обученения. Делает так 5 раз, каждый раз выбирая другую тестовую часть из пяти. Получается пять метрик ошибки (для одного набора обучающих параметров). Они усредняются и подаются как тестовое значение ошибки на данных не участвующих в обучении.

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

 

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

 

И в конце валидируем модель на 5 годах котировок, чтобы оценить работу вне выборки.

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

Пакет в R - caret.

 

До связи.

Алексей 

СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: первое серьезное обучение модели и результаты
СОПРОВОЖДЕНИЕ ЭКСПЕРИМЕНТА ПО АНАЛИЗУ ДАННЫХ ФОРЕКСА: первое серьезное обучение модели и результаты
  • 2016.02.27
  • Alexey Burnakov
  • www.mql5.com
Начало по ссылкам: https://www.mql5.com/ru/blogs/post/659572 https://www.mql5.com/ru/blogs/post/659929 https://www.mql5.com/ru/blogs/post/660386 https://www.mql5.com/ru/blogs/post/661062
Причина обращения: