Понимая фундаментальные концепции и математику, лежащую в основе деревьев решений, научитесь строить деревья решений классификации и регрессии!

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

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

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

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

В этом руководстве мы обсудим, как построить модель дерева решений с помощью библиотеки Python scikit-learn. Мы покроем:

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

Давайте начнем!

Это руководство адаптировано из серии Машинное обучение Python от Next Tech, в которой вы познакомитесь с алгоритмами машинного обучения и глубокого обучения с Python от 0 до 100. Оно включает в себя изолированную среду в браузере со всем необходимым программным обеспечением и библиотеками. предустановленные, и проекты, использующие общедоступные наборы данных. Начать можно здесь!

Основы деревьев решений

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

Например, если посмотреть на изображение выше, корневой узел Work to do? и разделяется на дочерние узлы Stay in и Outlook в зависимости от того, есть ли над чем поработать. Узел Outlook далее разделяется на три дочерних узла.

Итак, как мы узнаем, какова оптимальная точка разделения на каждом узле?

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

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

Максимальное получение информации

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

Здесь f - это функция для выполнения разделения, Dp, Dleft и Dright - это наборы данных родительский и дочерний узлы, I - мера примеси, Np - общее количество выборок в родительском узле, а Nleft и Nright - количество выборок в дочерних узлах.

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

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

Деревья классификации

Мы начнем с обсуждения деревьев решений классификации (также известных как деревья классификации). В этом примере мы будем использовать набор данных Iris, классический в области машинного обучения. Он содержит размеры 150 цветов Ирис трех разных видов - Setosa, Versicolor и Virginica. Это будут наши цели. Наша цель - предсказать, к какой категории принадлежит цветок ирис. Длина и ширина лепестка в сантиметрах хранятся в виде столбцов, которые мы также называем функциями набора данных.

Давайте сначала импортируем набор данных и назначим функциям как X, а целевому объекту как y:

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

Обратите внимание, что мы установили criterion как «энтропия». Этот критерий известен как мера примеси (упоминалась в предыдущем разделе). В классификации энтропия является наиболее распространенной мерой примеси или критерием расщепления. Это определяется:

Здесь p (i | t) - это доля выборок, принадлежащих классу c для определенного узла t. Следовательно, энтропия равна 0, если все выборки в узле принадлежат к одному классу, и энтропия максимальна, если у нас есть равномерное распределение классов.

Для более наглядного понимания энтропии, давайте изобразим индекс примеси для диапазона вероятности [0, 1] для класса 1. Код выглядит следующим образом:

Как видите, энтропия равна 0, если p (i = 1 | t) = 1. Если классы распределены равномерно с p (i = 1 | t) = 0,5, энтропия равна 1.

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

Приятной особенностью scikit-learn является то, что он позволяет нам экспортировать дерево решений в виде .dot файла после обучения, которое мы можем визуализировать, например, с помощью GraphViz. В дополнение к GraphViz мы будем использовать библиотеку Python под названием pydotplus, которая имеет возможности, аналогичные GraphViz, и позволяет нам преобразовывать .dot файлы данных в файл изображения дерева решений.

Вы можете установить pydotplus и graphviz, выполнив следующие команды в вашем Терминале:

pip3 install pydotplus
apt install graphviz

Следующий код создаст изображение нашего дерева решений в формате PNG:

Глядя на получившуюся фигуру дерева решений, сохраненную в файле изображения tree.png, мы теперь можем легко отследить расщепления, которые дерево решений определило из нашего обучающего набора данных. Мы начали со 150 образцов в корне и разделили их на два дочерних узла по 50 и 100 образцов, используя отсечку ширины лепестка ≤ 1,75 см. После первого разделения мы видим, что левый дочерний узел уже чистый и содержит только образцы из класса setosa (энтропия = 0). Дальнейшие разделения справа затем используются для отделения образцов от классов versicolor и virginica.

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

Деревья регрессии

Мы будем использовать набор данных Boston Housing для нашего примера регрессии. Это еще один очень популярный набор данных, который содержит информацию о домах в пригородах Бостона. Всего 506 образцов и 14 атрибутов. Для простоты и наглядности мы будем использовать только два - MEDV (среднее значение домов, занимаемых владельцем в 1000 долларов) в качестве цели и LSTAT (процент населения с более низким статусом) в качестве характеристики.

Давайте сначала импортируем необходимые атрибуты из scikit-learn в pandas DataFrame.

Давайте воспользуемся DecisionTreeRegressor, реализованным в scikit-learn, для обучения дерева регрессии:

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

Здесь Nt - это количество обучающих выборок в узле t, Dt - обучающее подмножество в узле t, y (i) - истинное целевое значение, а ŷt - прогнозируемое целевое значение (выборочное среднее):

Теперь давайте смоделируем взаимосвязь между MEDV и LSTAT, чтобы увидеть, как выглядит соответствие линии дерева регрессии:

Как видно из полученного графика, дерево решений глубины 3 отражает общую тенденцию в данных.

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

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

Мы рассматриваем эти методы в серии Машинное обучение Python, а также углубляемся в другие модели машинного обучения, такие как персептроны, Adaline, линейная и полиномиальная регрессия, логистическая регрессия, SVM, SVM ядра и т. д. -nearest-соседи, модели для анализа настроений, кластеризация k-средних, DBSCAN, сверточные нейронные сети и рекуррентные нейронные сети.

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

Начать можно здесь!