Группировка листьев - требуются мысли и идеи

 

Всех приветствую!

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

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

Ниже представлена таблица, которая показывает активацию листьев на выборке

На данной таблице:

1 - активировался лист и выдал вероятность на благополучный исход от совершения сделки;

0 - активировался лист и выдал вероятность на неблагополучный исход от совершения сделки;

n/a - лист не активировался и прогноза нет.

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


Далее я исхожу из того, что похожесть правильных активаций важней, чем похожесть ложных, и что "шумом" от ложных активаций можно пренебречь.

На данной таблице уже единица означает правильную активацию, а ноль либо отсутствие активации, либо ложную активацию.

Теперь необходимо определить, на сколько каждый лист похож на другой. Похожесть я определяю путем сопоставления сравниваемого листа с каждым, при этом учитывается только правильная активация, т.е. если List_0==1 и List_N==1, то активации совпали, о чем делается пометка, выглядит это так на примере List_0.



В строке "Итого" суммируем совпадение и в строке "%" находим процент совпадений относительно листа "0".

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

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

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

И тут у меня возникла сложность, как собрать эти листья в группы, ведь лист оказавшийся похожим на текущий может быть более похож на другой лист. К примеру в таблице видно, что листы 2, 6 и 7 похожи на лист 8, но в то же время лист 8 похож на лист 0, а лист 0 на лист 1, а вот лист 1 на лист 0, в то же время листы 3 и 5 похожи на лист 2, лист 4 на лист 0, в итоге все эти листья схлопнулись как бы между собой, понятно, что лист 8 самый информативный, а лист 9 оказался уникален по информации. В итоге, тут в примере получается две группы.

Прошу помощи в следующих вопросах:

1. В оценке правильности подхода к группировке - быть может нужно использовать другой метод/алгоритм/логику - высказываете мысли и идеи;

2. В написании алгоритма, который бы схлопывал похожие листья и выделял ведущий в группе, как в примере - под номером 8.

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
Файлы:
Group.zip  20 kb
 
Aleksey Vyazmikin:

...

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

...

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

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

2. Участие в группах "аватаров", т.е. если лист похож на несколько групп, то он и участвует в нескольких, тогда можно играть планкой похожести и/или делить голос листа между группами.

Только я не понял конечно почему вы берёте похожим лист только на одного-первого, ведь 8-ой лист похож одинаково и на 0 и на 6,7,2. Это хитрость и так нужно ? или может в этом и есть противоречие?

 
Aleksey Mavrin:

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

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

2. Участие в группах "аватаров", т.е. если лист похож на несколько групп, то он и участвует в нескольких, тогда можно играть планкой похожести и/или делить голос листа между группами.

Только я не понял конечно почему вы берёте похожим лист только на одного-первого, ведь 8-ой лист похож одинаково и на 0 и на 6,7,2. Это хитрость и так нужно ? или может в этом и есть противоречие?

1. Взвешивание уже лучше применять внутри группы, при этом, возможно есть смысл учитывать полноту и точность активаций каждого листа, давая каждому листу в группе не равный голос. Сейчас я смотрю по среднему для порога активации просто, т.е. в группе может быть 10 листов, но при правильной активации учитывается 3 и более - этот порог и ставлю. Просто, но есть прирост точности классификации.

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

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

Файлы:
 
Aleksey Vyazmikin:

1. Взвешивание уже лучше применять внутри группы, при этом, возможно есть смысл учитывать полноту и точность активаций каждого листа, давая каждому листу в группе не равный голос. Сейчас я смотрю по среднему для порога активации просто, т.е. в группе может быть 10 листов, но при правильной активации учитывается 3 и более - этот порог и ставлю. Просто, но есть прирост точности классификации.

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

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

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

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

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

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

 
Aleksey Mavrin:

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

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


Aleksey Mavrin:

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

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

Aleksey Mavrin:

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

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

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


Aleksey Mavrin:

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

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

 
Вот я и не пойму, как это закодировать. Есть вариант группировки, когда сделали первый отбор похожих и уже сравниваем группы из 2 х и менее листьев и так далее, но опять же пока не закодировал - не знаю, как это сделать оптимально.
У Вас уже проект работающий немалый, зависит от уже существующей архитектуры, т.е. как всё закодировано. Если говорить про граф, то он кодируется с помощью видоизмененного паттерна компоновщик, изменение в том, что каждый узел может ссылаться на любой узел, и на своих предков т.е. Поскольку в вашем случае будут листья, не связанные ни с одним, то для обхода все узлы надо еще хранить отдельным сквозным списком/динамич.массивом. Если Ваш проект на MQL (мало ли) ) рассмотрите в стандартной библиотеке CArrayObj (класс многомерного динамического массива объектов), он позволяет выполнить задачу максимально изящно. Если Ваш проект не привязан к стандартной бибилиотеке и нет такого желания, то всё равно вы можете воспользоваться (скопипастить код для своей иерархии классов). Код продуман, расширяем, и работает надёжно. Но остаётся вопрос что есть группа с т.зрения каждого листа , например лист состоит в 10 группах по 3 листа в каждой, т.е. он связан с 20 листами, каждый из которых связан с ним же, но не все между собой. Что тогда? Если нужно не просто граф хранить, а важно разделение именно на группы, тогда можно для каждой группы создавать свой контейнер (CArrayObj опять подходит), и добавлять в него ссылки на листья при условии, что добавляемый похож на все, уже добавленные в контейнер.
Да, группы могут иметь порог похожести, между собой - согласен, но если они будут состоять из разных листьев, хоть в совокупности и похожих, то это так же, я думаю, диверсификация, т.е. как раз тот вариант, когда одинаковое явление, активирующее листья, описано разными признаками.
Да, классно, я тоже задумывался об этом когда изучал нейро-сети. Хотя не уверен что это не один фиг если создать еще один обобщающий слой, не?
Предполагается, что группы будут единовременно активироваться не так часто, что бы делить между ними голоса, идея в другом - дать каждой группе возможность принимать торговое решение, т.е. если 3 группы склоняются к покупке, то открываем позицию на 3 лота, а если 2, то на два.
тогда не делить, пусть аватар голосует в каждой.
Если я правильно понял, то на каждой активации модели в целом Вы предлагаете просто оценить число активировавшихся всех листьев и учесть в процентном соотношении их голоса? Или как Вы предлагаете взвесить - покажите на примере, пожалуйста.
если очень грубо - например число активировавшихся 13, тогда у каждого листа максимум 13 голосов, 1 всегда, и по одному за каждый лист, не похожий на него. Потом можно нормировать. можно 1 всегда не давать.
 
Aleksey Mavrin:
У Вас уже проект работающий немалый, зависит от уже существующей архитектуры, т.е. как всё закодировано.

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

Aleksey Mavrin:
Если говорить про граф, то он кодируется с помощью видоизмененного паттерна компоновщик, изменение в том, что каждый узел может ссылаться на любой узел, и на своих предков т.е. Поскольку в вашем случае будут листья, не связанные ни с одним, то для обхода все узлы надо еще хранить отдельным сквозным списком/динамич.массивом. Если Ваш проект на MQL (мало ли) ) рассмотрите в стандартной библиотеке CArrayObj (класс многомерного динамического массива объектов), он позволяет выполнить задачу максимально изящно. Если Ваш проект не привязан к стандартной бибилиотеке и нет такого желания, то всё равно вы можете воспользоваться (скопипастить код для своей иерархии классов). Код продуман, расширяем, и работает надёжно. 

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

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

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

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

Aleksey Mavrin:
Но остаётся вопрос что есть группа с т.зрения каждого листа , например лист состоит в 10 группах по 3 листа в каждой, т.е. он связан с 20 листами, каждый из которых связан с ним же, но не все между собой. Что тогда? Если нужно не просто граф хранить, а важно разделение именно на группы, тогда можно для каждой группы создавать свой контейнер (CArrayObj опять подходит), и добавлять в него ссылки на листья при условии, что добавляемый похож на все, уже добавленные в контейнер. 

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


Aleksey Mavrin:
Да, классно, я тоже задумывался об этом когда изучал нейро-сети. Хотя не уверен что это не один фиг если создать еще один обобщающий слой, не?

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


Aleksey Mavrin:
если очень грубо - например число активировавшихся 13, тогда у каждого листа максимум 13 голосов, 1 всегда, и по одному за каждый лист, не похожий на него. Потом можно нормировать. можно 1 всегда не давать.

Число групп 13 активировалось, в каждой группе n листов у которых 13+1 голосов у каждого?

 
Aleksey Vyazmikin:

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

Число групп 13 активировалось, в каждой группе n листов у которых 13+1 голосов у каждого?

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

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

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

Выглядит мега-мощно и страшно сложно, но я почти вначале пути и вижу как это довести до ума. Жаль это не даст гарантии доходности, но жутко интересно))

 
Мера похожести есть? Дальше выбираем алгоритм кластеризации...
 
Aleksey Vyazmikin:


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

Теперь я занимаюсь с внучкой, интересуясь исключительно тем, как она будет решать задачу; результат не контролирую - на то есть учитель. 

Ребенку это нравится, результат меня вполне удовлетворяет. От 5 вниз только из-за невнимательности, или неаккуратности. 

Я не считаю себя специалистом по искусственному интеллекту, но на лекциях Гермогена и Дмитрия Поспеловых бывал. 

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

К чему клоню: в первом посте Вы привели таблицу, в которой уже все есть: исходы и их соответствие желаемому результату; нет только дерева. Просто приподнимитесь на один уровень вверх после полной декомпозиции,- оцените, какие именно ветви дерева приводят к желаемому исходу. Далее попробуйте выявить их "скрытые" родительские ветви, которые Вы не могли обнаружить при декомпозиции, поскольку не знали конечного результата. Ну и так далее, вверх по дереву. 

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

На правах имхенько... 

 
Aleksey Mavrin:

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

Ну не совсем понимаю, в чем тут преимущества над группой - если я правильно понял, то суть та ж, только представление иное. Впрочем в МО всё решают эксперименты. Нужно закодить и проверить :) Можете?


Aleksey Mavrin:

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

Код группировки листьев я могу дать (но группировка не полноценная), но там применяется класс для работы с данными, который я дать не могу - я не автор, а проект закрытый. Надо?


Aleksey Mavrin:

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

Выглядит мега-мощно и страшно сложно, но я почти вначале пути и вижу как это довести до ума. Жаль это не даст гарантии доходности, но жутко интересно))

Тут самое главное самому не запутаться - я часть кода оформляю в exel, а потом копирую через блокнот в ME, так вот пропустил строку одну при копировании, всё компилировалось, но результат резко упал - я 3 месяца не мог понять в чем дело :(

Причина обращения: