Понимание деревьев решений и случайных лесов на практическом примере

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

Основными методами ансамблевого обучения являются бустинг и бэггинг. Случайный лес - это алгоритм мешков.

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

Эти модели, обученные на небольших подмножествах, называются «слабыми учениками», потому что обычно это модели, которые не могут соответствовать сложным данным. «Слабые модели», которые использует Random Forest, - это деревья решений.

Давайте разберемся с основами деревьев решений на примере использования Sklearn’s DecisionTreeClassifier, прежде чем переходить к тому, как вырастить лес.

Деревья решений

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

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

Давайте сгенерируем синтетические данные и построим дерево решений, чтобы понять, как оно работает.

В этом примере я создал 10 000 точек данных и добавил гауссовский шум со стандартным отклонением 0,4. Набор данных Sklearn’s make_moons - это игрушечный набор данных, который удобен для визуализации алгоритмов классификации. Я также импортировал все библиотеки и классы, которые буду использовать позже в этом посте.

Построив данные, мы можем увидеть, как класс make_moons генерирует два чередующихся полукруга. Это двухмерные двоичные данные, поэтому наши классы {0, 1}. Типичными проблемами двоичной классификации являются обнаружение мошенничества или обнаружение спама.

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

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

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

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

Итак, что мы подразумеваем под "получением информации"? Сначала нам нужно определить энтропию. Энтропия - это мера неопределенности случайной величины. Если все значения случайной величины имеют одинаковую вероятность, то у нас максимальная энтропия. Если случайная величина может принимать только одно значение, энтропия принимает минимальное значение.

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

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

Итак, возвращаясь к нашему дереву решений, выбранная функция - X1, а порог - 0,29. После первого разделения у нас есть два новых узла. 4252 экземпляра заняли левую ветвь (True) и 3748 экземпляров заняли правую ветвь (False).

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

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

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

Максимальную глубину дерева можно ограничить с помощью гиперпараметра max_depth DecisionTreeClassifier Sklearn. Мы также можем установить максимальное количество конечных узлов (max_leaf_nodes), минимальное количество выборок, необходимых для разделения внутреннего узла (min_samples_split) и т. Д.

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

После точной настройки гиперпараметров с помощью Sklearn’s GridSearchCV наше дерево имеет 18 листьев или узлов, поскольку максимальное количество узлов листьев было ограничено этим значением. Тонкая настройка гиперпараметров дерева решений похожа на установление ограничений для роста дерева.

Если мы посмотрим на лист в правом нижнем углу, то класс, предсказанный для 324 экземпляров в этом узле, равен 0. Признак X0 принимает значение больше 0,511.

Мы игнорируем термин «Джини», который появляется в каждом узле дерева. «Джини» означает примесь Джини, и это мера качества разделения в каждом узле принятия решения.

Узлы решения - это узлы, которые разделяются с помощью условий If / Else. Они также известны как внутренние узлы или разделенные узлы.

По умолчанию Sklearn’s DecisionTreeClassifier использует примесь Джини как функцию для измерения качества разделения. Примесь Джини - это частота, с которой случайно выбранный элемент в наборе данных неправильно классифицируется, если он был случайно помечен в соответствии с распределением классов в наборе данных.

Мы можем рассматривать примесь Джини как эквивалент получения информации. Я использовал полученную информацию в объяснении, поскольку оно кажется мне более интуитивным. В самом деле, мы можем установить критерий энтропия и DecisionTreeClassifier Sklearn будет вычислять получение информации для измерения качества разделения.

На практике нет реальной разницы между использованием примеси Джини или получения информации для 99% задач.

Давайте рассмотрим код, чтобы построить дерево решений с помощью Sklearn’s DecisionTreeClassifier:

Прежде всего, мы разбиваем набор данных на обучающий и тестовый набор с помощью Sklearn’s train_test_split.

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

Я выбрал некоторые из них и несколько раз запустил GridSearchCV, каждый раз настраивая параметры, пока не нашел оптимальную комбинацию. Например, если бы я начал с max_leaf_nodes: [20, 30, 40] и max_leaf_nodes был 20 в лучшей оценке, я бы вернулся, установил max_leaf_nodes = [15, 20, 25] и снова запустил GridSearchCV.

Теперь у нас есть оптимальное дерево решений, поэтому давайте проверим его на данных, которые модель никогда раньше не видела:

Точность на тестовом наборе составляет 86,10%, что немного выше, чем точность на обучающем наборе (85,97%). Это редко. В большинстве случаев вы обнаружите, что производительность на обучающем наборе выше, чем на тестовом наборе. Этот вывод может быть просто совпадением, и, вероятно, из-за разделения поездов и тестов. Если бы мы повторили этот процесс много раз, в большинстве тестов мы бы увидели, что точность обучения выше, чем точность тестирования.

Наконец, стоит упомянуть, что существует множество алгоритмов, которые могут построить дерево решений, некоторые из которых более мощные, чем другие. Sklearn использует оптимизированную версию алгоритма CART (Деревья классификации и регрессии). Вы можете узнать больше о КОРЗИНЕ здесь.

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

Случайные леса

Как упоминалось в начале поста, Random Forest использует методы ансамблевого обучения для обучения на основе данных.

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

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

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

Мы сказали, что каждый «слабый ученик» обучается на небольшом подмножестве данных. Для создания этих подмножеств мы используем случайную выборку с заменой. Обратите внимание, что здесь мы вводим первый уровень случайности.

Sklearn’s ShuffleSplit пригодится для этой задачи. Для нашего случайного леса мы собираемся сгенерировать 1000 подмножеств, содержащих 100 экземпляров обучающего набора. Код для выполнения этой задачи приведен ниже:

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

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

Мы можем проверить это, вычислив среднюю точность, как показано ниже:

Средняя точность «слабого дерева решений» составляет 81,39%, что ниже 86,10% точности дерева решений, обученного на 8000 выборках.

Давайте вырастим наш Лес и оценим его эффективность.

процесс заключается в следующем:

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

Точность тестирования, достигнутая методом случайного леса, составляет 86,85%, что немного выше 86,10% дерева решений.

Хорошо, мы немного улучшили наши прогнозы, но не намного .. Значит ли это, что случайные леса не намного лучше, чем одно дерево решений?

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

Вы можете обучить Sklearn’s RandomForestClassifier на этом наборе данных и посмотреть, превосходит ли он наш простой случайный лес. Поделитесь, пожалуйста, своими результатами !!

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

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

Я хотел бы поблагодарить Орелиена Жерона за предложение этого упражнения в его книге «Практическое машинное обучение с помощью Scikit-Learn, Keras и Tensorflow 2nd Edition». Я не могу больше порекомендовать эту книгу людям, которые хотят изучать науку о данных или хотят освежить некоторые базовые концепции.

использованная литература

  1. «Практическое машинное обучение с помощью Scikit-Learn, Keras и Tensorflow, 2-е издание» - Орельен Жерон
  2. «Сотостраничная книга по машинному обучению» - Андрей Бурков
  3. Модуль 2: Текстовые заметки. Магистр машинного обучения, глубокого обучения и искусственного интеллекта - Международный кампус больших данных и UCAM