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

 
Aleksey Vyazmikin:

Дело в том, что если даже из всех взяли 50%, то дальше уже идет четкий отбор из этих 50% на первый корневой сплит (или в Alglib это не так?). У CatBoost есть не только случайный отбор предикторов, но и случайный сплит (добавляются случайным образом веса к вычислениям) на первых деревьях.

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

Предикторов, сейчас будет в районе 600, поэтому полный перебор уже не реален.

В Alglib из 50% предикторов перебираются все оставшиеся, каждый делится на 4 части по квартилям, и из всех вариантов выбирается разделение с лучшей ошибкой.

В принципе случайное разделение не сложно приделать.
Отдельных деревьев в хорошими результатами на тесте не видел (45-50%), а вот лес из них уже интереснее)


 
По важности предикторов смотрел на:
в пакетах xgboost, lightGBM были встроенные методы оценки важности фичей (feature importance) для «деревянных моделей»:

  1. Gain
    Эта мера показывает относительный вклад каждой фичи в модель. для расчета мы идем по каждому дереву, смотрим в каждом узле дерева какая фича приводит к разбиению узла и насколько снижаетcя неопределенность модели согласно метрике (Gini impurity, information gain).
    Для каждой фичи суммируется её вклад по всем деревьям.
  2. Cover
    Показывает количество наблюдений для каждой фичи. Например, у вас 4 фичи, 3 дерева. Предположим, фича 1 в узлах дерева содержит 10, 5 и 2 наблюдения в деревьях 1, 2 и 3 соответственно Тогда для данной фичи важность будет равна 17 (10 + 5 + 2).
  3. Frequency
    Показывает, как часто данная фича встречается в узлах дерева, то есть считается суммарное количество разбиений дерева на узлы для каждой фичи в каждом дереве.
Не особо они правильно важность разделяют.
У меня лес обученый по 5 барам результат на тесте дает лучше, чем по 100. Но когда по 100 учишь первые 5 не отмечены важными, а какие-то дальние.
При обучении по 100 ошибка отдельных деревьев и леса ниже - очевидно за счет переобучения и придачи важности 30-100 барам. Но очевидно что они не важны ни по обычной логике, но по тому, что лес на 5 барах выдает лучшие результаты.
 
Кстати, не понял чем Cover от Frequency отличается? А точнее что такое наблюдение фичи в Cover? (С разбиением по фиче в Frequency понятно). Деревья вроде разбивают по фичам, а не наблюдают.
 
Aleksey Vyazmikin:

Там скрипт на R с генетическим алгоритмом по созданию дерева, отбираются поколения по улучшению энтропии. Потом идет какой то финальный отбор. Я забираю все деревья для финального отбора и вытаскиваю из них листья для отдельных дальнейших измерений в MT5. Скрипт публично не выкладывался, поэтому и подробных описаний нет. Видимо это как из леса выбирать лучшее дерево, но тут есть ограничение по глубине для избегания переобучения, ну и процесс занимает на всех ядрах примерно 2 дня на последней выборке, где не все бары, а только сигналы на вход, а если все бары за 3 года, то там расчет идет 1,5 месяца. После окончания расчета я делаю расщепление дерева, т.е. убираю столбец с корневым предиктором лучшего дерева популяции и запускаю все по новой, оказалось что и на 40 такой процедуре бывают создаются очень хорошие листья, таким образом я пришел к выводу, что лучший математический расклад дерева не всегда является самым эффективным, и одна информация мешает проявлению другой, что оказалось уже позже используют в том же CatBoost, когда рандомно выбирают предикторы из всей выборки для построения одного дерева.

После беглого просмотра кода, увидел генетический подбор фичей для построения дерева из пакета rpart. Т.е. каждому дереву предлагался для обучения свой набор фичей. За счет генетики такой подбор быстрее полного перебора.
Но дерево не волшебное, а то которое предлагает rpart. Думаю - оно там стандартное.
 
Maxim Dmitrievsky:

сначала обучаете модель на всех фичах, сохраняете ошибки

затем, последовательно, рандомизируете каждый из предикторов, допустим нормальным распределением, и чекаете ошибку опять на всех фичах, включая этот рандомизированный (измененный), сравниваете с исходной. Переобучать модель при этом не нужно. И так проверить каждый из предикторов. Если предиктор был хороший, ошибка на всей выборке (включая все остальные исходные предикторы) резко увеличится по сравнению с исходной. Сохранить разницы ошибок, отсеять по ним наилучшие фичи. Затем, в конце, обучиться только на лучших и модель в продакшн. Плохие предикторы это шум для модели, нафиг они нужны со своим 1%. Хороших обычно остается штук 5-10, важность остальных убывает по экспоненте (закон Ципфа)

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

если осилите, как раз про отбор предикторов ОЧЕНЬ грамотно (уже кидал ранее)

Нашел ваш пост о permutation.
Интересный вариант. Надо попробовать.
Хотя боюсь, что если применить его к модели на 100 барах, и попытаться удалить 95 баров и оставить  первые 5, то результат будет 50%. Ведь эти первые 5 почти не участвовали в разделениях (в среднем лишь 5% узлов построено на них).
 
elibrarius:
Нашел ваш пост о permutation.
Интересный вариант. Надо попробовать.
Хотя боюсь, что если применить его к модели на 100 барах, и попытаться удалить 95 баров и оставить  первые 5, то результат будет 50%. Ведь эти первые 5 почти не участвовали в разделениях (в среднем лишь 5% узлов построено на них).

Это я уже не знаю что вы там делаете со 100 барами, наверное надо по нормальному применять и все будет

 
Maxim Dmitrievsky:

Это я уже не знаю что вы там делаете со 100 барами, наверное надо по нормальному применять и все будет

хочется автоматизировать процесс отсева неважных предикторов)

 
Maxim Dmitrievsky:

сначала обучаете модель на всех фичах, сохраняете ошибки

затем, последовательно, рандомизируете каждый из предикторов, допустим нормальным распределением, и чекаете ошибку опять на всех фичах, включая этот рандомизированный (измененный), сравниваете с исходной. Переобучать модель при этом не нужно. И так проверить каждый из предикторов. Если предиктор был хороший, ошибка на всей выборке (включая все остальные исходные предикторы) резко увеличится по сравнению с исходной. Сохранить разницы ошибок, отсеять по ним наилучшие фичи. Затем, в конце, обучиться только на лучших и модель в продакшн. Плохие предикторы это шум для модели, нафиг они нужны со своим 1%. Хороших обычно остается штук 5-10, важность остальных убывает по экспоненте (закон Ципфа)

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

если осилите, как раз про отбор предикторов ОЧЕНЬ грамотно (уже кидал ранее)

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

А вообще - результаты из статьи впечатляют. Надо попробовать на практике.
 
elibrarius:

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

А вообще - результаты из статьи впечатляют. Надо попробовать на практике.

перемешайте, какая разница

 
elibrarius:
В Alglib из 50% предикторов перебираются все оставшиеся, каждый делится на 4 части по квартилям, и из всех вариантов выбирается разделение с лучшей ошибкой.

В принципе случайное разделение не сложно приделать.
Отдельных деревьев в хорошими результатами на тесте не видел (45-50%), а вот лес из них уже интереснее)


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

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

У Alglib ветвление излишнее, поэтому там не обучение, а запоминание происходит. Я думаю, что леса идея хорошая, но они будут корректно работать, если каждое дерево содержит уникальные правила (листья) и число сплитов не очень большое - 4-10.


elibrarius:
По важности предикторов смотрел на:
в пакетах xgboost, lightGBM были встроенные методы оценки важности фичей (feature importance) для «деревянных моделей»:

  1. Gain
    Эта мера показывает относительный вклад каждой фичи в модель. для расчета мы идем по каждому дереву, смотрим в каждом узле дерева какая фича приводит к разбиению узла и насколько снижаетcя неопределенность модели согласно метрике (Gini impurity, information gain).
    Для каждой фичи суммируется её вклад по всем деревьям.
  2. Cover
    Показывает количество наблюдений для каждой фичи. Например, у вас 4 фичи, 3 дерева. Предположим, фича 1 в узлах дерева содержит 10, 5 и 2 наблюдения в деревьях 1, 2 и 3 соответственно Тогда для данной фичи важность будет равна 17 (10 + 5 + 2).
  3. Frequency
    Показывает, как часто данная фича встречается в узлах дерева, то есть считается суммарное количество разбиений дерева на узлы для каждой фичи в каждом дереве.
Не особо они правильно важность разделяют.
У меня лес обученый по 5 барам результат на тесте дает лучше, чем по 100. Но когда по 100 учишь первые 5 не отмечены важными, а какие-то дальние.
При обучении по 100 ошибка отдельных деревьев и леса ниже - очевидно за счет переобучения и придачи важности 30-100 барам. Но очевидно что они не важны ни по обычной логике, но по тому, что лес на 5 барах выдает лучшие результаты.

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

elibrarius:
После беглого просмотра кода, увидел генетический подбор фичей для построения дерева из пакета rpart. Т.е. каждому дереву предлагался для обучения свой набор фичей. За счет генетики такой подбор быстрее полного перебора.
Но дерево не волшебное, а то которое предлагает rpart. Думаю - оно там стандартное.

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

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