Машинное обучение в трейдинге: теория, модели, практика и алготорговля - страница 1276
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Дело в том, что если даже из всех взяли 50%, то дальше уже идет четкий отбор из этих 50% на первый корневой сплит (или в Alglib это не так?). У CatBoost есть не только случайный отбор предикторов, но и случайный сплит (добавляются случайным образом веса к вычислениям) на первых деревьях.
У меня получается результат разный, да и цель у меня не оценка всей модели, а получения листьев, которые с высокой вероятностью описывают большую часть выборки. Потом такие листья проверяются на истории по годам и из них составляется композиция, которая может описывать рынок не целиком, но я считаю, что лучше иметь более точные ответы на то, что знаешь, чем гадать с вероятностью 50% в большей части времени.
Предикторов, сейчас будет в районе 600, поэтому полный перебор уже не реален.
В принципе случайное разделение не сложно приделать.
Отдельных деревьев в хорошими результатами на тесте не видел (45-50%), а вот лес из них уже интереснее)
в пакетах xgboost, lightGBM были встроенные методы оценки важности фичей (feature importance) для «деревянных моделей»:
Эта мера показывает относительный вклад каждой фичи в модель. для расчета мы идем по каждому дереву, смотрим в каждом узле дерева какая фича приводит к разбиению узла и насколько снижаетcя неопределенность модели согласно метрике (Gini impurity, information gain).
Для каждой фичи суммируется её вклад по всем деревьям.
Показывает количество наблюдений для каждой фичи. Например, у вас 4 фичи, 3 дерева. Предположим, фича 1 в узлах дерева содержит 10, 5 и 2 наблюдения в деревьях 1, 2 и 3 соответственно Тогда для данной фичи важность будет равна 17 (10 + 5 + 2).
Показывает, как часто данная фича встречается в узлах дерева, то есть считается суммарное количество разбиений дерева на узлы для каждой фичи в каждом дереве.
У меня лес обученый по 5 барам результат на тесте дает лучше, чем по 100. Но когда по 100 учишь первые 5 не отмечены важными, а какие-то дальние.
При обучении по 100 ошибка отдельных деревьев и леса ниже - очевидно за счет переобучения и придачи важности 30-100 барам. Но очевидно что они не важны ни по обычной логике, но по тому, что лес на 5 барах выдает лучшие результаты.
Там скрипт на R с генетическим алгоритмом по созданию дерева, отбираются поколения по улучшению энтропии. Потом идет какой то финальный отбор. Я забираю все деревья для финального отбора и вытаскиваю из них листья для отдельных дальнейших измерений в MT5. Скрипт публично не выкладывался, поэтому и подробных описаний нет. Видимо это как из леса выбирать лучшее дерево, но тут есть ограничение по глубине для избегания переобучения, ну и процесс занимает на всех ядрах примерно 2 дня на последней выборке, где не все бары, а только сигналы на вход, а если все бары за 3 года, то там расчет идет 1,5 месяца. После окончания расчета я делаю расщепление дерева, т.е. убираю столбец с корневым предиктором лучшего дерева популяции и запускаю все по новой, оказалось что и на 40 такой процедуре бывают создаются очень хорошие листья, таким образом я пришел к выводу, что лучший математический расклад дерева не всегда является самым эффективным, и одна информация мешает проявлению другой, что оказалось уже позже используют в том же CatBoost, когда рандомно выбирают предикторы из всей выборки для построения одного дерева.
Но дерево не волшебное, а то которое предлагает rpart. Думаю - оно там стандартное.
сначала обучаете модель на всех фичах, сохраняете ошибки
затем, последовательно, рандомизируете каждый из предикторов, допустим нормальным распределением, и чекаете ошибку опять на всех фичах, включая этот рандомизированный (измененный), сравниваете с исходной. Переобучать модель при этом не нужно. И так проверить каждый из предикторов. Если предиктор был хороший, ошибка на всей выборке (включая все остальные исходные предикторы) резко увеличится по сравнению с исходной. Сохранить разницы ошибок, отсеять по ним наилучшие фичи. Затем, в конце, обучиться только на лучших и модель в продакшн. Плохие предикторы это шум для модели, нафиг они нужны со своим 1%. Хороших обычно остается штук 5-10, важность остальных убывает по экспоненте (закон Ципфа)
пробовал фильры обучать, но немного, не вижу большого смысла, лучше сразу в одну модель все закладывать
если осилите, как раз про отбор предикторов ОЧЕНЬ грамотно (уже кидал ранее)
Интересный вариант. Надо попробовать.
Хотя боюсь, что если применить его к модели на 100 барах, и попытаться удалить 95 баров и оставить первые 5, то результат будет 50%. Ведь эти первые 5 почти не участвовали в разделениях (в среднем лишь 5% узлов построено на них).
Нашел ваш пост о permutation.
Интересный вариант. Надо попробовать.
Хотя боюсь, что если применить его к модели на 100 барах, и попытаться удалить 95 баров и оставить первые 5, то результат будет 50%. Ведь эти первые 5 почти не участвовали в разделениях (в среднем лишь 5% узлов построено на них).
Это я уже не знаю что вы там делаете со 100 барами, наверное надо по нормальному применять и все будет
Это я уже не знаю что вы там делаете со 100 барами, наверное надо по нормальному применять и все будет
хочется автоматизировать процесс отсева неважных предикторов)
сначала обучаете модель на всех фичах, сохраняете ошибки
затем, последовательно, рандомизируете каждый из предикторов, допустим нормальным распределением, и чекаете ошибку опять на всех фичах, включая этот рандомизированный (измененный), сравниваете с исходной. Переобучать модель при этом не нужно. И так проверить каждый из предикторов. Если предиктор был хороший, ошибка на всей выборке (включая все остальные исходные предикторы) резко увеличится по сравнению с исходной. Сохранить разницы ошибок, отсеять по ним наилучшие фичи. Затем, в конце, обучиться только на лучших и модель в продакшн. Плохие предикторы это шум для модели, нафиг они нужны со своим 1%. Хороших обычно остается штук 5-10, важность остальных убывает по экспоненте (закон Ципфа)
пробовал фильры обучать, но немного, не вижу большого смысла, лучше сразу в одну модель все закладывать
если осилите, как раз про отбор предикторов ОЧЕНЬ грамотно (уже кидал ранее)
Я этот метод по другому понял.
А вообще - результаты из статьи впечатляют. Надо попробовать на практике.Для изучаемого предиктора надо не рандомные значения с нормальным распределением подавать, а просто перемешать строки в этом столбце.
Я этот метод по другому понял.
А вообще - результаты из статьи впечатляют. Надо попробовать на практике.Для изучаемого предиктора надо не рандомные значения с нормальным распределением подавать, а просто перемешать строки в этом столбце.
перемешайте, какая разница
В Alglib из 50% предикторов перебираются все оставшиеся, каждый делится на 4 части по квартилям, и из всех вариантов выбирается разделение с лучшей ошибкой.
В принципе случайное разделение не сложно приделать.
Отдельных деревьев в хорошими результатами на тесте не видел (45-50%), а вот лес из них уже интереснее)
Понял, я так и думал, значит велика вероятность что корневой сплит у большей части деревьев будет одинаков, что само собо отбрасывает другие варианты.
Я исхожу из того, что любые листья - это лишь попытка описать какую то закономерность\примету, и с зарания мы не можем знать, будет ли описание корректным или это случайное совпадение на выборке. Поэтому я набираю листья разные и уникальные (не повторяющиеся) и проверяю их отдельно, а не все дерево целиком.
У Alglib ветвление излишнее, поэтому там не обучение, а запоминание происходит. Я думаю, что леса идея хорошая, но они будут корректно работать, если каждое дерево содержит уникальные правила (листья) и число сплитов не очень большое - 4-10.
По важности предикторов смотрел на:
в пакетах xgboost, lightGBM были встроенные методы оценки важности фичей (feature importance) для «деревянных моделей»:
Эта мера показывает относительный вклад каждой фичи в модель. для расчета мы идем по каждому дереву, смотрим в каждом узле дерева какая фича приводит к разбиению узла и насколько снижаетcя неопределенность модели согласно метрике (Gini impurity, information gain).
Для каждой фичи суммируется её вклад по всем деревьям.
Показывает количество наблюдений для каждой фичи. Например, у вас 4 фичи, 3 дерева. Предположим, фича 1 в узлах дерева содержит 10, 5 и 2 наблюдения в деревьях 1, 2 и 3 соответственно Тогда для данной фичи важность будет равна 17 (10 + 5 + 2).
Показывает, как часто данная фича встречается в узлах дерева, то есть считается суммарное количество разбиений дерева на узлы для каждой фичи в каждом дереве.
У меня лес обученый по 5 барам результат на тесте дает лучше, чем по 100. Но когда по 100 учишь первые 5 не отмечены важными, а какие-то дальние.
При обучении по 100 ошибка отдельных деревьев и леса ниже - очевидно за счет переобучения и придачи важности 30-100 барам. Но очевидно что они не важны ни по обычной логике, но по тому, что лес на 5 барах выдает лучшие результаты.
Да, с оценкой важности стандартные подходы не очень эффективны. Я хочу попробовать в качестве оценки некий показатель уникальности, т.е. когда есть уже готовые листья, и мы пытаемся каждый предиктор поменять поочередно на любой другой (с учетом сетки разбиение), собираем статистику, и сопоставляем лучший вариант замены с вариантом по умолчанию, учитываем точность или другой показатель (важна концепция), и таким образом собираем баллы для каждого предиктора по всей модели.
После беглого просмотра кода, увидел генетический подбор фичей для построения дерева из пакета rpart. Т.е. каждому дереву предлагался для обучения свой набор фичей. За счет генетики такой подбор быстрее полного перебора.
Но дерево не волшебное, а то которое предлагает rpart. Думаю - оно там стандартное.
Само дерево абсолютно стандартное, изначальная идея скрипта в поиске наиболее значимых предикторов, и генетика вроде должна этому способствовать.
Я вот не пойму, как там можно поменять энтропию на какой либо иной показатель(точность или полноту или ещё что свое) для создания нового поколения.