Интерактивный классификатор дерева решений - PullRequest
6 голосов
/ 13 июля 2010

Кто-нибудь может порекомендовать реализацию классификатора дерева решений на Python или Java, которую можно использовать поэтапно?

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

Ответы [ 5 ]

3 голосов
/ 15 июля 2010

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

2 голосов
/ 16 июля 2010

Обычно такие пакеты (в частности, деревья J48 в Weka) позволяют указать отсутствующее значение вместо значения свойства, которое будет обрабатываться так же, как алгоритм C4.5:

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

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

0 голосов
/ 11 сентября 2013

Пакет дерева решений Python на https://pypi.python.org/pypi/DecisionTree имеет интерактивный режим для использования дерева решений. Он не является инкрементным в том смысле, в котором вы нуждаетесь. Однако может оказаться возможным легко изменить код в функции для интерактивного управления, чтобы вы могли постепенно видеть результаты.

0 голосов
/ 26 августа 2010

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

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

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

Disease Name  Head Ache   Fever  Back Pain  Leg Pain  Blurry Vision  Hearing Loss
Common Cold   Yes         Yes    No         No        No             No
Migraine      Yes         No     No         No        Yes            No
Herpes        No          Yes    No         No        No             No

В этом примере, Головная боль, Лихорадка, Боль в спине, Боль в ногах и т. д. являются влияющими факторами, а Имя болезни является целью.Каждый ряд будет представлять собой фактический диагноз отдельного пациента, поэтому заболевание может повторяться в данных более одного раза.

  1. Измените алгоритм обхода, чтобы начать с корня.
  2. ЕслиВы достигли листа, сообщающего пользователю потенциальные ответы.
  3. Возьмите фактор влияния, использованный для разделения этого узла, представьте его пользователю и задайте вопрос «Да / Нет» (У вас болит голова).
  4. Идите налево, если пользователь ответит Да.
  5. Идите вправо, если пользователь ответит №
  6. Перейти к шагу 2

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

Головная боль Мигрень отрубленная голова

Предписание:бла-бла-бла.

С 1 миллионом влияющих потребуется время, чтобы построить дерево.Если вы хотите понизить это, возможно, можно использовать многозначные факторы влияния вместо да / нет.Хотя действительно трудно придумать 1 миллион да / нет уникальных вопросов даже для каждого заболевания.Как только вы построите дерево, оно может предложить столько диагнозов, сколько вы захотите.

0 голосов
/ 25 августа 2010

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

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

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

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

...