Если у Вас достаточно много таких записей, то можно собрать все записи, для которых ожидается одинаковый айдишник (но по факту айдишники разные) — это будет обучающая выборка. Пусть записи с разными айдишниками будут принадлежать разным классам. Затем, на основе данной выборки, можно построить дерево принятия решений.
Если визуализировать дерево, и рассмотреть его ветки, то можно будет обнаружить условия, приводящие к разным айдишникам.
Если я правильно понял вопрос — Вас интересует как выбрать количество деревьев в ансамбле.
Как уже отмечали, для этого полезно использовать выборку данных, которая не принимает участия в построении дерева — на ней будем тестировать качество классификатора.
Количество деревьев можно определить эмпирически — постепенно увеличивая их количество, и проверяя качество классификации на тестовых данных. В большинстве случаев получается примерно такая зависимость (схематически):
То есть, после некоторого порогового значения, увеличение количества деревьев перестаёт значительно увеличивать качество классификации. На этом количестве деревьев можно и остановиться.
Хотя, по своему опыту, могу сказать, что используя дерево принятия решений в качестве бинарного классификатора для реальной задачи — интерпретировать результаты классификации было легко, и общая картина вырисовывалась довольно логично и последовательно.
Но действительно, как Вы и отметили, при увеличении количества классов, интерпретировать дерево принятия решений становится сложнее. Ну и «жадный» алгоритм построения, к сожалению, не всегда устойчивым к небольшим изменениям исходных данных.
В общем, я считаю, что многие подводные камни являются результатом специфики той или иной предметной области, в применении к которой используется классификатор.
Да, важно сколько еды сумеет собрать команда агентов.
Максимизация эффективности коллективного поведения отличается от максимизации поведения индивидума.
Вот простой пример: можно заметить, когда несколько агентов двигаются в направлении к частичке пищи, то один из них может развернуться и начать двигаться в другом направлении. А если б я оптимизировал поведение индивидума — то для каждого агента было бы эффективнее соревноваться с другими, чтоб первым схватит кусочек еды, но сумарная эффективность группы агентов от этого только уменьшается.
Так как, в тренировочной среде частицы еды регенерируются, то, соответственно, со временем будут выигрывать те нейронные сети, которые будут заставлять агентов двигаться быстрее (соответсвенно — собирать больше частиц еды в определённый промежуток времени). Но, поскольку, я всё-таки ограничиваю максимальную скорость и угол поворота — то да, возможно появление нейронной сети, с наилучшими возможными показателями, и эволюция остановится.
Вот типичная кривая обучения нейронной сети агентов:
(построено по результатам консольного вывода эмулятора)
Качество нейронной сети определяется следующим образом:
есть тренировочная среда
размеры среды 200 х 200, количество агентов — 10, количество частиц еды — 5.
затем, в этой тренировочной среде:
всем агентам присваивается нейронная сеть определенной конфигурации («мозг») и через некоторый промежуток времени фиксируется количество собранных частиц пищи.
Таким образом, считаем что эффективность каждой нейронной сети пропорциональна количеству собранных частиц еды
Выигрывают те нейронные сети, под управлением которых агенты смогли собрать больше еды — на их основе формируется новая популяция нейронных сетей и т.д.
Если я правильно понял — дискуссия о немного различных вещах: сети Хемминга и Хопфилда помогают запоминать конкретные шаблоны, а затем, подавая на вход данные, и прогоняя несколько итераций для схождения — на выходе получаем один из запомненных шаблонов (либо их комбинацию).
kosiakk предлагает запоминать значения, которые использовались для принятия решения на предыдущих шагах агента.
Также, следует учесть, что среда динамическая, поэтому сходимости в принятии решения, на протяжении нескольких шагов агента, вряд ли получится достичь.
Я попробую смоделировать такую сеть. Спасибо за идею
Спасибо Вам за идею. Уже пробовал :-) Если схематически изобразить, то я реализовывал такую схему:
Такая структура позволяет «запоминать» предыдущие входные значение. Агенты, действительно, начинают меньше «смотреть по сторонам»
Это сработает только в случае, если еда передвигается.
Хотя, если немного обобщить Ваше предложение, то следует упомянуть что в некоторых случаях, в недетерминированной среде — рандомизированная стратегия поведения позволяет достичь неплохих результатов.
Способность агента получать информацию о среде ограничивается «областью видимости» — грубо говоря, агент может видеть только впереди себя.
Спасибо за Вашу идею, но по этому поводу у меня немного иная точка зрения:
Такое поведение является эффективным, поскольку всегда есть вероятность, что, пока агент приближается к цели, то какой-нибудь другой агент может съесть эту частицу еды, или на пути к цели появится новый кусочек еды, который можно съесть быстрее.
Когда агенты «крутятся» туда-сюда, то они, соответственно, имеют больший угол обзора окружающей среды, и есть шанс заметить появившийся рядом кусочек еды (а значит — собрать больше пищи). Я ещё картинку приводил
Как я отмечал в начале статьи — у меня нету жёстко заданной топологии сети. Фиксированное только количество нейронов
Я экспериментировал, подавая на вход нейронной сети информацию как про одного так и про нескольких (2 и 3) ближайших агентов. Внешне — результаты довольно похожи.
На видео, можно заметить, когда агенты передвигаются стайками, то некоторые из них разворачиваются и начинают двигаться в противоположном направлении — вот так, косвенно, можно наблюдать взаимное влияние агентов
Провёл эксперимент по аппроксимации синуса, без использования тригонометрических функций (используя только операции складывания, вычитания, умножения, деления, возведения в степень и взятия корня)
Исходный файл с тренировочными данными
# allowed functions are: ADD SUB MUL DIV SQRT POW LN SIN COS
# set which functions to use:
ADD SUB MUL DIV SQRT POW
# looking for:
f(x) - ?
# define training set:
f(-5) = 0.958924275
f(-4.6) = 0.993691004
f(-4.2) = 0.871575772
f(-3.8) = 0.611857891
f(-3.4) = 0.255541102
f(-3) = -0.141120008
f(-2.6) = -0.515501372
f(-2.2) = -0.808496404
f(-1.8) = -0.973847631
f(-1.4) = -0.98544973
f(-1) = -0.841470985
f(-0.6) = -0.564642473
f(-0.2) = -0.198669331
f(0) = 0
f(0.2) = 0.198669331
f(0.6) = 0.564642473
f(1) = 0.841470985
f(1.4) = 0.98544973
f(1.8) = 0.973847631
f(2.2) = 0.808496404
f(2.6) = 0.515501372
f(3) = 0.141120008
f(3.4) = -0.255541102
f(3.8) = -0.611857891
f(4.2) = -0.871575772
f(4.6) = -0.993691004
threshold = 0.5
В результате — получил полином, который аппроксимирует функцию синуса на заданном промежутке:
Если визуализировать дерево, и рассмотреть его ветки, то можно будет обнаружить условия, приводящие к разным айдишникам.
Как уже отмечали, для этого полезно использовать выборку данных, которая не принимает участия в построении дерева — на ней будем тестировать качество классификатора.
Количество деревьев можно определить эмпирически — постепенно увеличивая их количество, и проверяя качество классификации на тестовых данных. В большинстве случаев получается примерно такая зависимость (схематически):
То есть, после некоторого порогового значения, увеличение количества деревьев перестаёт значительно увеличивать качество классификации. На этом количестве деревьев можно и остановиться.
В общем, я с Вами согласен.
Хотя, по своему опыту, могу сказать, что используя дерево принятия решений в качестве бинарного классификатора для реальной задачи — интерпретировать результаты классификации было легко, и общая картина вырисовывалась довольно логично и последовательно.
Но действительно, как Вы и отметили, при увеличении количества классов, интерпретировать дерево принятия решений становится сложнее. Ну и «жадный» алгоритм построения, к сожалению, не всегда устойчивым к небольшим изменениям исходных данных.
В общем, я считаю, что многие подводные камни являются результатом специфики той или иной предметной области, в применении к которой используется классификатор.
Максимизация эффективности коллективного поведения отличается от максимизации поведения индивидума.
Вот простой пример: можно заметить, когда несколько агентов двигаются в направлении к частичке пищи, то один из них может развернуться и начать двигаться в другом направлении. А если б я оптимизировал поведение индивидума — то для каждого агента было бы эффективнее соревноваться с другими, чтоб первым схватит кусочек еды, но сумарная эффективность группы агентов от этого только уменьшается.
Как более наглядный пример, можно упомянуть задачу о дилемме заключённого
Вот типичная кривая обучения нейронной сети агентов:
(построено по результатам консольного вывода эмулятора)
Качество нейронной сети определяется следующим образом:
есть тренировочная среда
затем, в этой тренировочной среде:
Таким образом, считаем что эффективность каждой нейронной сети пропорциональна количеству собранных частиц еды
kosiakk предлагает запоминать значения, которые использовались для принятия решения на предыдущих шагах агента.
Также, следует учесть, что среда динамическая, поэтому сходимости в принятии решения, на протяжении нескольких шагов агента, вряд ли получится достичь.
Я попробую смоделировать такую сеть. Спасибо за идею
Меня очень впечатлило вот такое видео:
На ютубе можно найти много интересных видео на эту тему.
Начинать можна с этой книги: Toby Segaran, Programming Collective Intelligence
Также, советую почитать: Sean Luke, Essentials of Metaheuristics
Такая структура позволяет «запоминать» предыдущие входные значение. Агенты, действительно, начинают меньше «смотреть по сторонам»
Хотя, если немного обобщить Ваше предложение, то следует упомянуть что в некоторых случаях, в недетерминированной среде — рандомизированная стратегия поведения позволяет достичь неплохих результатов.
(наверное, следовало по-другому нарисовать картинку со схематическим изображением нейронной сети)
Спасибо за Вашу идею, но по этому поводу у меня немного иная точка зрения:
Когда агенты «крутятся» туда-сюда, то они, соответственно, имеют больший угол обзора окружающей среды, и есть шанс заметить появившийся рядом кусочек еды (а значит — собрать больше пищи). Я ещё картинку приводил
Я экспериментировал, подавая на вход нейронной сети информацию как про одного так и про нескольких (2 и 3) ближайших агентов. Внешне — результаты довольно похожи.
На видео, можно заметить, когда агенты передвигаются стайками, то некоторые из них разворачиваются и начинают двигаться в противоположном направлении — вот так, косвенно, можно наблюдать взаимное влияние агентов
Обновите, пожалуйста, symbolic_regression_1.0.jar (отсюда)
В результате — получил полином, который аппроксимирует функцию синуса на заданном промежутке:
f(x) = ((x * (((-28.637448958589324) + (x * x)) / ((21.239955408627964 / (x + (-3.2072451559334034))) / (3.3336507016309875 + x)))) / 16.2284520613964)
Эксперименты, с различными ограничениями на максимальную глубину дерева ещё в процессе