Русский
Русский
English
Статистика
Реклама

Дерево решений

Перевод Напишем и поймем Decision Tree на Python с нуля! Часть 4. Структуры данных

04.11.2020 14:09:33 | Автор: admin
Данная статья четвертая в серии. Ссылки на предыдущие статьи: первая, вторая, третья

4.1 Структуры данных


Структура данных это представление того, как организованы отдельные данные.

Массив


image

Отдельные данные представлены одним рядом. Чтобы идентифицировать один фрагмент данных, например, каким по порядку является этот отдельный фрагмент массива, необходим его идентификатор.

#Пример реализации массива в Pythona = [2,6,4,5,1,8]


Таблица, двумерный массив


image

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

#Пример реализации таблицы в Pythona = [   [2,6,4,5,1,8],   [4,4,1,3,4,2],   [5,3,6,6,5,3],   [7,8,0,9,5,3],]


Tree, древовидная структура




Это структура данных, где отдельные данные как будто связаны линией.
Эти линии являются маршрутом, напрямую соединяющим одни данные с другими. И один такой маршрут, например, и будет являтся древовидной структурой данных.
Часто такую структуру изображают как схему, напоминающую растущее сверху вниз дерево. Линии называются ребрами или ветвями, данные узлами (node), данные, после которых линия не продолжается, называются листьями(leaf), а данные, располагающиеся на самом верху корневым узлом или просто корнем.

# Пример реализации Tree в Python, содержащий список дочерних узлов.# Записывается в формате [Значение,список дочерних массивов]. Например, дерево с картинки выше будет записываться в порядке сверху вниз, слева направо.# Помимо подобной записи, существуют варианты с использованием классов, родительских нодов и другие.tree = \[2,[     [6,[]],     [4,[          [5,[               [6,[]],          ]],          [8,[]],          [1,[]],     ]],]]# Функция для преобразования древовидной структуры в символьнуюdef tstr(node,indent=""):      s = indent+str(node[0])+"\n"      for c in node[1]: # Цикл на дочернем ноде           s += tstr(c,indent+"+-")           pass      return sprint(tstr(tree))# Вывод# 2# +-6# +-4# +-+-5# +-+-+-6# +-+-8# +-+-1# Можно не создавать все дерево сразу, а создать несколько переменных для нодов# Создаем все ноды-листья. Цифра в переменной указывает на строку нода и его порядковый номер в этой строке слева направо.n10 = [6,[]]n21 = [8,[]]n22 = [1,[]]n40 = [6,[]]# Создаем родительские ноды для уже созданных дочерних.n20 = [5,[n40]]n11 = [4,[n20,n21,n22]]n00 = [2,[n10,n11]]# Выводим получившееся Древо, указав нод, который необходимо считать корневым.print(tstr(n11))# Вывод# 4# +-5# +-+-6# +-8# +-1


Network или графы


image

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

# Реализация графа на Pythonimport pandas as pd# В нашем случае имя узла и его значение совпадают.# Если имя нода и его значение не совпадают, необходимо будет достать значение нода.nodes = [2,6,4,5,8,1]# Указываем связи между нодами в виде матрицы. Если от нода 2 (первая строка)к ноду 6 (вторая строка) исходит ребро, # Значение 1-ой строки 2-ого столбца матрицы будет 1, а если ребро не проходит, то - 0. Такая матрица называется матрица смежности.df = pd.DataFrame([  # 2,6,4,5,8,1   [ 0,1,1,0,0,0], # от нода 2  [ 1,0,0,1,0,0], # от нода 6  [ 1,0,0,1,1,1], # от нода 4  [ 0,1,1,0,0,0], # от нода 5  [ 0,0,1,0,0,0], # от нода 8  [ 0,0,1,0,0,0], # от нода 1],columns=nodes,index=nodes)print(df)# Вывод#     2  6  4  5  8  1# 2  0  1  1  0  0  0# 6  1  0  0  1  0  0# 4  1  0  0  1  1  1# 5  0  1  1  0  0  0# 8  0  0  1  0  0  0# 1  0  0  1  0  0  0# С помощью библиотек matplotlib и networkx рисуем граф.import matplotlib.pyplot as pltimport networkx as nxplt.figure(figsize=(4,4))plt.axis("off")nx.draw_networkx(nx.from_pandas_adjacency(df))plt.show()


Вывод:
image

4.2 Пример реализации Decision Tree в Python


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

Как показано ниже, корневой узел соединяет все данные. Числовое значение [...], прикрепленное к узлу, представляет собой номер исходных данных, из которых создается это дерево решений. Из корневого узла спускаются вниз только те данные, которые удовлетворяют условиям дочерних узлов. Например, это видно, если посмотреть на узлы иду на гольф и не иду на гольф в первом дереве решений.

image

image

Реализация в python-е происходит, например, следующим образом. Делаем один узел ассоциативным массивом, name это символьное представление состояния этого узла, df это данные, связанные с этим узлом, а ребра это список дочерних узлов.

# Данные древовидной структурыtree = {      # name: название этого узла      "name":"decision tree "+df0.columns[-1]+" "+str(cstr(df0.iloc[:,-1])),      # df: данные, связанные с данным узлом      "df":df0,# edges: список ребер (ветвей), выходящих из данного узла. Если узел листовой, то есть если ребер у него нет, массив остается пустым.    "edges":[],}

Функция tstr, текстифицирующая данную древовидную структуру, будет выглядеть следующим образом.

# Лямбда-выражение для распределения значений, аргумент - pandas.Series,  возвращаемое значение - массив с количеством каждого из значений# Из вводных данных s с помощью value_counts() находим частоту каждого из значений, и пока в нашем словаре есть элементы, будет работать цикл, запускаемый items().# Чтобы выходные данные не менялись с каждым запуском цикла, мы используем sorted,  который меняет порядок от большего к меньшему# В итоге, генерируется массив, содержащий строку из следующих компонентов: ключ (k) и значение (v).cstr = lambda s:[k+":"+str(v) for k,v in sorted(s.value_counts().items())]# Метод текстификации дерева: аргумент - tree (структура данных дерева), indent (отступ дочерних узлов),# А возвращаемое значение будет текстовым отображением tree. Данный метод вызывается рекурсивно для преобразования всего в дереве в символы.def tstr(tree,indent=""):    # Создаем символьное представление этого узла.# Если этот узел является листовым узлом (количество элементов в массиве ребер равно 0),# Частотное распределение последнего столбца данных df, связанных с деревом, преобразуется в символы.s = indent+tree["name"]+str(cstr(tree["df"].iloc[:,-1]) if len(tree["edges"])==0 else "")+"\n"      # Зацикливаем все ветви этого узла.for e in tree["edges"]:# Добавляем символьное представление дочернего узла к символьному представлению родительского узла.# Добавляем еще больше символов к indent этого узла.s += tstr(e,indent+"  ")passreturn s

Decision Tree, текстифицированное функцией tstr, будет выглядеть следующим образом. В корневом узле отображается текст (decision tree Гольф), который мы задали в самом начале при создании переменной tree, а также частотное распределение иду / не иду на гольф со всех данных. Каждый узел представленный ниже, отображает правила ветвления, и в случае, если узел оказывается листовым, отображается частотное распределение иду / не иду на гольф на основе данных, связанных с этим узлом.

decision tree Гольф [':5', ':9']  Погода=Ясно    Влажность=Нормальная[':2']    Влажность=Высокая[':3'] Погода=Облачно[':4'] Погода=Дождь    Ветер=Есть[':2']    Ветер=Нет[':3']


Спасибо за прочтение!

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

Перевод HDTree настраиваемое дерево решений на Python

16.09.2020 18:22:11 | Автор: admin

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

TL;DR

  • Репозиторий HDTree
  • Дополняющий Notebook внутри examples. Каталог репозитория здесь (каждая иллюстрация, которую вы видите здесь, будет сгенерирована в блокноте). Вы сможете создавать иллюстрации самостоятельно.

О чём пост?


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

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

Мотивация и предыстория


Для диссертации я начал работать с деревьями решений. Моя цель сейчас реализовать ориентированную на человека ML-модель, где HDTree (Human Decision Tree, если на то пошло) это дополнительный ингредиент, который применяется как часть реального пользовательского интерфейса для этой модели. Хотя эта история посвящена исключительно HDTree, я мог бы написать продолжение, подробно описав другие компоненты.

Особенности HDTree и сравнение с деревьями решений scikit learn


Естественно, я наткнулся на реализацию деревьев решений scikit-learn [4]. Реализация sckit-learn имеет множество плюсов:

  • Она быстра и оптимизирована;
  • Написана на диалекте Cython. Cython компилируется в C-код (который, в свою очередь, компилируется в двоичный код), сохраняя при этом возможность взаимодействия с интерпретатором Python;
  • Простая и удобная;
  • Многие люди в ML знают, как работать с моделями scikit-learn. Вам помогут везде благодаря его пользовательской базе;
  • Она испытана в боевых условиях (её используют многие);
  • Она просто работает;
  • Она поддерживает множество методов предварительной и последующей обрезки [6] и предоставляет множество функций (например, обрезка с минимальными затратами и весами выборки);
  • Поддерживает базовую визуализацию [7].

Тем не менее, у нее, безусловно, есть некоторые недостатки:

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

Особенности HDTree


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

  • Взаимодействует с обучающим поведением;
  • Основные компоненты имеют модульную структуру и их довольно легко расширить (реализовать интерфейс);
  • Написана на чистом Python (более доступна);
  • Имеет богатую визуализацию;
  • Поддерживает категориальные данные;
  • Поддерживает отсутствующих значений;
  • Поддерживает многовариантные разделения;
  • Имеет удобный интерфейс навигации по структуре дерева;
  • Поддерживает n-арное разбиение (больше 2 дочерних узлов);
  • Текстовые представления путей решения;
  • Поощряет объясняемость за счет печати удобочитаемого текста.

Минусы:

  • Медленная;
  • Не проверена в боях;
  • Качество ПО посредственно;
  • Не так много вариантов обрезки. Хотя реализация поддерживает некоторые основные параметры.

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

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

Структура деревьев решений


Хотя в этой работе не будут подробно рассмотрены деревья решений, мы резюмируем их основные строительные блоки. Это обеспечит основу для понимания примеров позже, а также подчеркнет некоторые особенности HDTree. На следующем рисунке показан фактический результат работы HDTree (за исключением маркеров).



Узлы

  • ai: текстовое описание правила проверки и разделения, которое использовалось на этом узле для разделения данных на его дочерние элементы. Отображает соответствующий атрибуты и словесное описание операции. Эти тесты *легко настраиваются* и могут включать любую логику разделения данных. Разработка собственных пользовательских правил поддерживается за счет реализации интерфейса. Подробнее об этом в разделе 3.
  • aii: оценка узла измеряет его чистоту, то есть то, насколько хорошо данные, проходящие через узел, разделены. Чем выше оценка, тем лучше. Записи также представлены цветом фона узлов. Чем больше зеленоватого оттенка, тем выше оценка (белый цвет означает нечистые, т.е. равномерно распределенные классы). Эти оценки направляют построение дерева и являются модульным и заменяемым компонентом HDTree.
  • aiii: рамка узлов указывает на то, сколько точек данных проходит через этот узел. Чем толще граница, тем больше данных проходит через узел.
  • aiv: список целей прогнозирования и меток, которые имеют точки данных, проходящие через этот узел. Самый распространенный класс отмечен .
  • av: опционально визуализация может отмечать путь, по которому следуют отдельные точки данных (иллюстрируя решение, которое принимается, когда точка данных проходит дерево). Это отмечено линией в углу дерева решений.

Ребра

  • bi: стрелка соединяет каждый возможный результат разделения (ai) с его дочерними узлами. Чем больше данных относительно родителя перетекает по краю, тем толще они отображаются.
  • bii: каждое ребро имеет удобочитаемое текстовое представление соответствующего результата разбиения.

Откуда разные разделения наборов и тесты?


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



Вы видите очень простой набор данных, состоящий из двух измерений (признаков/атрибутов) и двух классов. Сгенерированные точки данных были нормально распределены в центре. Улица, которая является просто линейной функциейf(x) = y разделяет эти два класса: Class 1 (правая нижняя) и Class 2 (левая верхняя) части. Также был добавлен некоторый случайный шум (синие точки данных в оранжевой области и наоборот), чтобы проиллюстрировать эффекты переобучения в дальнейшем. Задача алгоритма классификации, такого как HDTree (хотя он также может использоваться для задач регрессии), состоит в том, чтобы узнать, к какому классу принадлежит каждая точка данных. Другими словами, задана пара координат (x, y) вроде (6, 2). Цель в том, чтобы узнать, принадлежит ли эта координата оранжевому классу 1 или синему классу 2. Дискриминантная модель попытается разделить пространство объектов (здесь это оси (x, y)) на синюю и оранжевую территории соответственно.
Учитывая эти данные, решение (правила) о том, как данные будут классифицированы, кажется очень простым. Разумный человек сказал бы о таком подумайте сначала самостоятельно.
Это класс 1, если x > y, иначе класс 2. Идеальное разделение создаст функция y=x, показанная пунктиром. В самом деле, классификатор максимальной маржи, такой как метод опорных векторов [8], предложил бы подобное решение. Но давайте посмотрим, какие деревья решений решают вопрос иначе:



На изображении показаны области, в которых стандартное дерево решений с увеличивающейся глубиной классифицирует точку данных как класс 1 (оранжевый) или класс 2 (синий).
Дерево решений аппроксимирует линейную функцию с помощью ступенчатой функции.
Это связано с типом правила проверки и разделения, которое используют деревья решений. Они все работают по схемеattribute <threshold, что приведет к к гиперплоскостям, которые параллельны осям. В 2D-пространстве вырезаются прямоугольники. В 3D это были бы кубоиды и так далее. Кроме того, дерево решений начинает моделировать шум в данных, когда уже имеется 8 уровней, то есть происходит переобучение. При этом оно никогда не находит хорошего приближения к реальной линейной функции. Чтобы убедиться в этом, я использовал типичное разделение тренировочных и тестовых данных 2 к 1 и вычислил точность деревьев. Она составляет 93,84%, 93,03%, 90,81% для тестового набора и 94,54%, 96,57%, 98,81% для тренировочного набора (упорядочены по глубине деревьев 4, 8, 16). Тогда как точность в тесте уменьшается, точность обучения увеличивается.
Повышение эффективности тренировок и снижение результатов тестов признак переобучения.
Полученные деревья решений довольно сложны для такой простой функции. Самое простое из них (глубина 4), визуализированное с помощью scikit learn, уже выглядит так:



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

Применение пакета HDTree


Этот раздел познакомит вас с основами HDTree. Я постараюсь коснуться некоторых частей его API. Пожалуйста, не стесняйтесь спрашивать в комментариях или свяжитесь со мной, если у вас есть какие-либо вопросы по этому поводу. С радостью отвечу и при необходимости дополню статью. Установка HDTree немного сложнее, чем pip install hdtree. Извините. Для начала нужен Python 3.5 или новее.

  • Создайте пустой каталог и внутри него папку с именем hdtree (your_folder/hdtree)
  • Клонируйте репозиторий в каталог hdtree (не в другой подкаталог).
  • Установите необходимые зависимости: numpy, pandas, graphviz, sklearn.
  • Добавьте your_folder в PYTHONPATH. Это включит директорию в механизм импорта Python. Вы сможете использовать его как обычный пакет Python.

В качестве альтернативы добавьте hdtree в папку site-packages вашей установки python. Я могу добавить установочный файл позже. На момент написания код недоступен в репозитории pip. Весь код, который генерируют графику и выходные данные ниже (а также ранее показанные), находятся в репозитории, а непосредственно размещены здесь. Решение линейной проблемы с помощью одноуровневого дерева

Давайте сразу начнем с кода:

from hdtree import HDTreeClassifier, SmallerThanSplit, EntropyMeasurehdtree_linear = HDTreeClassifier(allowed_splits=[SmallerThanSplit.build()], # Split rule in form a < b    information_measure=EntropyMeasure(), # Use Information Gain for the scores attribute_names=['x', 'y' ]) # give the    attributes some interpretable names # standard sklearn-like interface hdtree_linear.fit(X_street_train,    y_street_train) # create tree graph hdtree_linear.generate_dot_graph() 




Да, результирующее дерево имеет высоту только в один уровень и предлагает идеальное решение этой проблемы. Это искусственный пример, чтобы показать эффект. Тем не менее, я надеюсь, что он проясняет мысль: иметь интуитивное представление о данных или просто предоставлять дерево решений с различными вариантами разделения пространства признаков, которое может предложить более простое, а иногда даже более точное решение. Представьте, что вам нужно интерпретировать правила из представленных здесь деревьев, чтобы найти полезную информацию. Какую интерпретацию вы сможете понять первой, а какой больше доверяете? Сложная интерпретация, использующая многошаговые функции, или небольшое точное дерево? Думаю, ответ довольно прост. Но давайте немного углубимся в сам код. При инициализации HDTreeClassifier самое важное, что вы должны предоставить, это allowed_splits. Здесь вы предоставляете список, содержащий возможные правила разделения, которые алгоритм пробует во время обучения для каждого узла, чтобы найти хорошее локальное разделение данных. В этом случае мы предоставили исключительноSmallerThanSplit. Это разделение делает именно то, что вы видите: оно принимает два атрибута (пробует любую комбинацию) и разделяет данные по схеме a_i < a_j. Что (не слишком случайно) соответствует нашим данным настолько хорошо, насколько это возможно.

Этот тип разделения обозначается как многовариантное разделение Оно означает, что разделение использует более одного признака для принятия решения. Это не похоже на одновариантное разделение, которое используются в большинстве других деревьев, таких как scikit-tree (подробнее см. выше), которые принимают во внимание ровно один атрибут. Конечно, у HDTree также есть опции для достижения нормального разделения, как те, что есть в scikit-деревьях семейство QuantileSplit. Я покажу больше по ходу статьи. Другая незнакомая вещь, которую вы можете увидеть в коде гиперпараметр information_measure. Параметр представляет измерение, которое используется для оценки значения одного узла или полного разделения (родительского узла с его дочерними узлами). Выбранный вариант основан на энтропии [10]. Возможно, вы также слышали о коэффициенте Джини, который был бы еще одним допустимым вариантом. Конечно же, вы можете предоставить своё собственное измерение, просто реализовав соответствующий интерфейс. Если хотите, реализуйте gini-Index, который вы можете использовать в дереве, не реализовывая заново ничего другого. Просто скопируйте EntropyMeasure() и адаптируйте для себя. Давайте копнем глубже, в катастрофу Титаника. Я люблю учиться на собственных примерах. Сейчас вы увидите ещё несколько функций HDTree с конкретным примером, а не на сгенерированных данных.

Набор данных


Мы будем работать со знаменитым набором данных машинного обучения для курса молодого бойца: набором данных о катастрофе Титаника. Это довольно простой набор, который не слишком велик, но содержит несколько различных типов данных и пропущенных значений, хотя и не является полностью тривиальным. Кроме того, он понятен человеку, и многие люди уже работали с ним. Данные выглядят так:



Вы можете заметить, что там все виды атрибутов. Числовые, категориальные, целочисленные типы и даже пропущенные значения (посмотрите на столбец Cabin). Задача в том, чтобы спрогнозировать, выжил ли пассажир после катастрофы Титаника, по доступной информации о пассажире. Описание атрибутов-значений вы найдёте здесь. Изучая ML-учебники и применяя этот набор данных, вы выполняете все виды предварительной обработки, чтобы иметь возможность работать с обычными моделями машинного обучения, например, удаляя отсутствующие значения NaN путём замещения значений [12], отбрасывания строк/столбцов, унитарным кодированием [13] категориальных данных (например, Embarked и Sex или группировки данных, чтобы получить валидный набор данных, который принимает ML-модель. Такая очистка технически не требуется HDTree. Вы можете подавать данные как есть, и модель с радостью примет их. Измените данные только в том случае, когда проектируете реальные объекты. Я упростил всё для начала.

Тренировка первого HDTree на данных Титаника


Просто возьмём данные как есть и скормим их модели. Базовый код похож на код выше, однако в этом примере будет разрешено гораздо больше разделений данных.

    hdtree_titanic = HDTreeClassifier(allowed_splits=[FixedValueSplit.build(), # e.g., Embarked = 'C'    SingleCategorySplit.build(), # e.g., Embarked -> ['C', 'Q', 'S']    TwentyQuantileRangeSplit.build(), # e.g., IN Quantile 3-5    TwentyQuantileSplit.build()], # e.g., BELOW Quantile 7    information_measure=EntropyMeasure(),    attribute_names=col_names,    max_levels=3) # restrict to grow to a max of 3 levels    hdtree_titanic.fit(X_titanic_train.values, y_titanic_train.values)    hdtree_titanic.generate_dot_graph()    



Присмотримся к происходящему. Мы создали дерево решений, имеющее три уровня, которые выбрали для использования 3 из 4 возможных правил разделения SplitRules. Они помечены буквами S1, S2, S3. Я вкратце объясню, что они делают.

  • S1: FixedValueSplit. Это разделение работает с категориальными данными и выбирает одно из возможных значений. Затем данные разделяются на одну часть, имеющую это значение, и другую часть, для которой значение не установлено. Например, PClass = 1 и Pclass 1.
  • S2: (Двадцать) QuantileRangeSplit. Они работают с числовыми данными. Правила разделят соответствующий диапазон значений оцениваемого атрибута на фиксированное количество квантилей и интервалов, находящихся в пределах последовательных подмножеств. От квантиля 1 до квантиля 5 каждый включает одинаковое количество точек данных. Начальный квантиль и конечный квантиль (размер интервала) ищутся для оптимизации измерения информации (measure_information). Данные делятся на (i) имеющие значение в пределах этого интервала или (ii) вне его. Доступны разделения различного количества квантилей.
  • S3: (Двадцать) QuantileSplit. Подобно разделению диапазона (S2), но разделяет данные по пороговому значению. Это в основном то, что делают обычные деревья решений, за исключением того, что они обычно пробуют все возможные пороги вместо их фиксированного числа.

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

  • S4: SingleCategorySplit будет работать аналогично FixedValueSplit, но создаст дочерний узел для каждого возможного значения, например: для атрибута PClass это будет 3 дочерних узла (каждый для Class 1, Class 2 и Class 3). Обратите внимание, что FixedValueSplit идентичен SingleValueSplit, если есть только две возможные категории.

Индивидуальные разделения несколько умны по отношению к типам/значениям данных, которые принимают. До некоторого расширения они знают, при каких обстоятельствах они применяются и не применяются. Дерево также обучалось с разделением тренировочных и тестовых данных 2 к 1. Производительность 80,37% точности на тренировочных данных и 81,69 на тестовых. Не так уж и плохо.

Ограничение разделений


Предположим, что вы по какой-то причине не слишком довольны найденными решениями. Может быть, вы решите, что самое первое разделение на вершине дерева слишком тривиально (разделение по атрибуту sex). HDTree решает проблему. Самым простым решением было бы запретить FixedValueSplit (и, если уж на то пошло, эквивалентному SingleCategorySplit) появляться на вершине. Это довольно просто. Измените инициализацию разбиений вот так:

    - SNIP -    ...allowed_splits=[FixedValueSplit.build_with_restrictions(min_level=1),    SingleCategorySplit.build_with_restrictions(min_level=1),...],    - SNIP -

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



Запрещая разделению по признаку sex появляться в корне благодаря параметруmin_level=1 (подсказка: конечно же, вы также можете предоставить max_level), мы полностью реструктурировали дерево. Его производительность сейчас составляет 80,37% и 81,69% (тренировочные/тестовые). Она не менялась вообще, даже если мы взяли предположительно лучшее разделение в корневом узле.

Из-за того, что деревья решений строятся в жадной форме, они найдут только локальное _наилучшее разбиение для каждого узла, что не обязательно является _ лучшим _ вариантом вообще. На самом деле нахождение идеального решения проблемы дерева решений NP-полная задача, это доказано в [15].
Так что лучшее, чего мы можем желать, это эвристики. Вернёмся к примеру: обратите внимание, что мы уже получили нетривиальное представление данных? Хотя это тривиально. сказать, что мужчины будут иметь только низкие шансы на выживание, в меньшей степени может иметь место вывод, что, будучи человеком в первом или втором классе PClass вылет из Шербура (Embarked=C) Может увеличить ваши шансы на выживание. Или что если вы мужчина изPClass3 и вам меньше 33 лет, ваши шансы тоже увеличиваются? Помните: прежде всего женщина и дети. Хорошее упражнение сделать эти выводы самостоятельно, интерпретируя визуализацию. Эти выводы были возможны только благодаря ограничению дерева. Кто знает, что еще можно раскрыть, применив другие ограничения? Попробуйте!

Как последний пример такого рода я хочу показать вам, как ограничить разбиение конкретными атрибутами. Это применимо не только для предотвращения обучения дерева на нежелательных корреляциях или принудительных альтернативных решений, но также сужает пространство поиска. Подход может резко сократить время выполнения, особенно при использовании многовариантного разделения. Если вы вернётесь к предыдущему примеру, то можете обнаружить узел, который проверяет наличие атрибута PassengerId. Возможно, мы не хотим его моделировать, поскольку он, по крайней мере, не должен вносить вклад в информацию о выживании. Проверка на идентификатор пассажира может быть признаком переобучения. Давайте изменим ситуацию с помощью параметра blacklist_attribute_indices.

    - SNIP -    ...allowed_splits=[TwentyQuantileRangeSplit.build_with_restrictions(blacklist_attribute_indices=['PassengerId']),    FixedValueSplit.build_with_restrictions(blacklist_attribute_indices=['Name Length']),    ...],    - SNIP -    



Вы можете спросить, почемуname length вообще появляется. Нужно учитывать, что длинные имена (двойные имена или [благородные] титулы) могут указывать на богатое прошлое, увеличивая ваши шансы на выживание.
Дополнительная подсказка: вы всегда можете добавить то жеSplitRule дважды. Если вы хотите внести в черный список атрибут только для определенных уровней HDTree, просто добавьте SplitRule без ограничения уровня.

Прогнозирование точек данных


Как вы, возможно, уже заметили, для прогнозирования можно использовать общий интерфейс scikit-learn. Это predict(), predict_proba(), а такжеscore(). Но можно пойти дальше. Есть explain_decision(), которая выведет текстовое представление решения.

print(hdtree_titanic_3.explain_decision(X_titanic_train[42]))

Предполагается, что это последнее изменение в дереве. Код выведет это:

Query:Query:  {'PassengerId': 273, 'Pclass': 2, 'Sex': 'female', 'Age': 41.0, 'SibSp': 0, 'Parch': 1, 'Fare': 19.5, 'Cabin': nan, 'Embarked': 'S', 'Name Length': 41}Predicted sample as "Survived" because of: Explanation 1:Step 1: Sex doesn't match value maleStep 2: Pclass doesn't match value 3Step 3: Fare is OUTSIDE range [134.61, ..., 152.31[(19.50 is below range)Step 4: Leaf. Vote for {'Survived'}    

Это работает даже для отсутствующих данных. Давайте установим индекс атрибута 2 (Sex) на отсутствующий (None):

    passenger_42 = X_titanic_train[42].copy()    passenger_42[2] = None    print(hdtree_titanic_3.explain_decision(passenger_42))    

Query:  {'PassengerId': 273, 'Pclass': 2, 'Sex': None, 'Age': 41.0, 'SibSp': 0, 'Parch': 1, 'Fare': 19.5, 'Cabin': nan, 'Embarked': 'S', 'Name Length': 41}Predicted sample as "Death" because of: Explanation 1:Step 1: Sex has no value availableStep 2: Age is OUTSIDE range [28.00, ..., 31.00[(41.00 is above range)Step 3: Age is OUTSIDE range [18.00, ..., 25.00[(41.00 is above range)Step 4: Leaf. Vote for {'Death'}---------------------------------Explanation 2:Step 1: Sex has no value availableStep 2: Pclass doesn't match value 3Step 3: Fare is OUTSIDE range [134.61, ..., 152.31[(19.50 is below range)Step 4: Leaf. Vote for {'Survived'}---------------------------------    

Это напечатает все пути решения (их больше одного, потому что на некоторых узлах решение не может быть принято!). Конечным результатом будет самый распространенный класс среди всех листьев.

другие полезные вещи


Вы можете продолжить и получить представление дерева в виде текста:

    Level 0, ROOT: Node having 596 samples and 2 children with split rule "Split on Sex equals male" (Split Score:    0.251)    -Level 1, Child #1: Node having 390 samples and 2 children with split rule "Age is within range [28.00, ..., 31.00["    (Split Score: 0.342)    --Level 2, Child #1: Node having 117 samples and 2 children with split rule "Name Length is within range [18.80,    ..., 20.00[" (Split Score: 0.543)    ---Level 3, Child #1: Node having 14 samples and no children with    - SNIP -    

Или получить доступ ко всем чистым узлам (с высоким баллом):

    [str(node) for node in hdtree_titanic_3.get_clean_nodes(min_score=0.5)]    

    ['Node having 117 samples and 2 children with split rule "Name Length is within range [18.80, ..., 20.00[" (Split    Score: 0.543)',    'Node having 14 samples and no children with split rule "no split rule" (Node Score: 1)',    'Node having 15 samples and no children with split rule "no split rule" (Node Score: 0.647)',    'Node having 107 samples and 2 children with split rule "Fare is within range [134.61, ..., 152.31[" (Split Score:    0.822)',    'Node having 102 samples and no children with split rule "no split rule" (Node Score: 0.861)']    

Расширение HDTree


Самое значимое, что вы, возможно, захотите добавить в систему это ваше собственноеSplitRule. Правило разделения действительно может делать для разделения все, что хочет Реализуйте SplitRule через реализацию AbstractSplitRule. Это довольно сложно, поскольку вам придется самостоятельно обрабатывать прием данных, оценку производительности и все такое. По этим причинам в пакете есть миксины, которые вы можете добавить в реализацию в зависимости от типа разделения. Миксины делают большую часть трудной части за вас.


image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя онлайн-курсы SkillFactory:



Подробнее..

Что такое дерево решений и где его используют?

12.10.2020 12:10:07 | Автор: admin

Ребята, привет! Сегодня команда ProductStar подготовила для вас статью, в которой мы рассмотрели общие принципы работы и области применения дерева решений.

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

Дерево решений эффективный инструмент интеллектуального анализа данных и предсказательной аналитики. Он помогает в решении задач по классификации и регрессии.

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

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

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

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

  • дерево классификации когда целевая переменная дискретная;

  • дерево регрессии когда целевая переменная непрерывная.

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

Дальнейшее развитие деревьев решений как самообучающихся моделей для анализа данных связано с Джоном Р. Куинленом (автором алгоритма ID3 и последующих модификаций С4.5 и С5.0) и Лео Брейманом, предложившим алгоритм CART и метод случайного леса.

Структура дерева решений

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

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

  • первое те, которые удовлетворяют установленное правило;

  • второе те, которые не удовлетворяют установленное правило.

Далее к каждому подмножеству снова применяется правило, процедура повторяется. Это продолжается, пока не будет достигнуто условие остановки алгоритма. Последний узел, когда не осуществляется проверка и разбиение, становится листом.

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

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

Терминология

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

Какие задачи решает дерево решений?

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

  • Классификация. Отнесение объектов к одному из заранее известных классов. Целевая переменная должна иметь дискретные задачи.

  • Регрессия (численное предсказание). Предсказание числового значения независимой переменной для заданного входного вектора.

  • Описание объектов. Набор правил в дереве решений позволяет компактно описывать объекты. Поэтому вместо сложных структур, используемых для описания объектов, можно хранить деревья решений.

Процесс построения дерева решений

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

Узел становится листом в двух случаях:

  • естественным образом когда он содержит единственный объект или объект только одного класса;

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

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

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

  • n примеров, для каждого из которых задана метка класса Ci(i = 1..k);

  • m атрибутов Aj(j = 1..m), которые определяют принадлежность объекта к тому или иному классу.

Тогда возможно три случая:

  1. Примеры множества S имеют одинаковую метку Ci, следовательно, все обучающие примеры относятся к одному классу. В таком случае обучение не имеет смысла, потому что все примеры в модели будут одного класса, который и научится распознавать модель. Само дерево будет похоже на один большой лист, ассоциированный с классом Ci. Тогда его использование не будет иметь смысла, потому что все новые объекты будут относиться к одному классу.

  2. Множество S пустое множество без примеров. Для него сформируется лист, класс которого выберется из другого множества. Например, самый распространенный из родительского множества класс.

  3. Множество S состоит из обучающих примеров всех классов Ck. В таком случае множество разбивается на подмножества в соответствии с классами. Для этого выбирают один из атрибутов Aj множества S, состоящий из двух и более уникальных значений: a1, a2, , ap), где p число уникальных значений признака. Множество S разбивают на p подмножеств (S1, S2, , Sp), состоящих из примеров с соответствующим значением атрибута. Процесс разбиения продолжается, но уже со следующим атрибутом. Он будет повторяться, пока все примеры в результирующих подмножества не окажутся одного класса.

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

Сегодня существует много алгоритмов обучения: ID3, CART, C4.5, C5.0, NewId, ITrule, CHAID, CN2 и другие. Самыми популярными считаются:

  • ID3 (Iterative Dichotomizer 3). Алгоритм позволяет работать только с дискретной целевой переменной. Деревья решений, построенные на основе ID3, получаются квалифицирующими. Число потомков в узле неограниченно. Алгоритм не работает с пропущенными данными.

  • C4.5. Продвинутая версия ID3, дополненная возможностью работы с пропущенными значениями атрибутов. В 2008 году издание Spring Science провело исследование и выявило, что C4.5 самый популярный алгоритм Data Mining.

  • CART (Classification and Regression Tree). Алгоритм решает задачи классификации и регрессии, так как позволяет использовать дискретную и непрерывную целевые переменные. CART строит деревья, в каждом узле которых только два потомка.

Основные этапы построения дерева решений

Построение осуществляется в 4 этапа:

  1. Выбрать атрибут для осуществления разбиения в данном узле.

  2. Определить критерий остановки обучения.

  3. Выбрать метод отсечения ветвей.

  4. Оценить точность построенного дерева.

Далее рассмотрим каждый подробнее.

Выбор атрибута разбиения

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

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

Теоретико-информационный критерий

В основе критерия лежит информационная энтропия:

где n число классов в исходном подмножестве, Ni число примеров i-го класса, N общее число примеров в подмножестве.

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

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

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

где Info(S) информация, связанная с подмножеством S до разбиения, Info(Sa) информация, связанная с подмножеством, полученным при разбиении атрибута A.

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

Статистический подход

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

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

Индекс Джини рассчитывается по формуле:

где Q результирующее множество, n число классов в нем, pi вероятность i-го класса (выраженная как относительная частота примеров соответствующего класса).

Значение показателя меняется от 0 до 1. Если индекс равен 0, значит, все примеры результирующего множества относятся к одному классу. Если равен 1, значит, классы представлены в равных пропорциях и равновероятны. Оптимальным считают то разбиение, для которого значение индекса Джини минимально.

Критерий остановки алгоритма

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

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

Специалисты решили принудительно останавливать строительство дерева, чтобы оно не становилось переобученным.

Для этого используют несколько подходов:

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

  • Ограничение глубины дерева. Алгоритм останавливается после достижения установленного числа разбиений в ветвях. Этот подход также негативно сказывается на точности дерева.

  • Задание минимально допустимого числа примеров в узле. Устанавливается ограничение на создание узлов с числом примером меньше заданного (например, 7). В таком случае не будут создаваться тривиальные разбиения и малозначимые правила.

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

Отсечение ветвей

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

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

Но и тут есть проблема: такая задача относится к классу NP-полных задач, а они, как известно, эффективных решений не имеют. Поэтому прибегают к методу отсечения ветвей, который реализуется в 3 шага:

  1. Строительство полного дерева, в котором листья содержат примеры одного класса.

  2. Определение двух показателей: относительную точность модели (отношение числа правильно распознанных примеров к общему числу примеров) и абсолютную ошибку (число неправильно классифицированных примеров).

  3. Удаление листов и узлов, потеря которых минимально скажется на точности модели и увеличении ошибки.

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

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

Извлечение правил

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

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

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

Преимущества и недостатки дерева решений

Преимущества:

  • Формируют четкие и понятные правила классификации. Например, если возраст < 40 и нет имущества для залога, то отказать в кредите. То есть деревья решений хорошо и быстро интерпретируются.

  • Способны генерировать правила в областях, где специалисту трудно формализовать свои знания.

  • Легко визуализируются, то есть могут интерпретироваться не только как модель в целом, но и как прогноз для отдельного тестового субъекта (путь в дереве).

  • Быстро обучаются и прогнозируют.

  • Не требуется много параметров модели.

  • Поддерживают как числовые, так и категориальные признаки.

Недостатки:

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

  • Разделяющая граница имеет определенные ограничения, из-за чего дерево решений по качеству классификации уступает другим методам.

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

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

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

Где применяют деревья решения?

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

Успешнее всего деревья применяют в следующих областях:

  • Банковское дело. Оценка кредитоспособности клиентов банка при выдаче кредитов.

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

  • Медицина. Диагностика заболеваний разной сложности.

  • Молекулярная биология. Анализ строения аминокислот.

  • Торговля. Классификация клиентов и товар.

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

Надеемся, наша статья оказалась для вас полезной. Больше интересного контента от ProductStar вы найдёте в нашем блоге на vc и в аналитическом тг-канале.

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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru