Подробное объяснение с теорией и примерами с кодом

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

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

Это дерево решений для классификации животных. Первый разделение зависит от размера животного. Хотя вопрос, кажется, «Насколько велико животное?», Его задают в форме «Разве животное больше 1 метра?» потому что мы хотим разделить точки данных на две группы на каждом этапе. Вопросы становятся более конкретными по мере того, как дерево становится глубже.

То, что вы спрашиваете на каждом этапе, является наиболее важной частью и сильно влияет на производительность деревьев решений. Например, предположим, что в вашем наборе данных есть «характеристика A» в диапазоне от 0 до 100, но большинство значений выше 90. В этом случае первый вопрос, который нужно задать, - «Является ли характеристика A более 90?». Нет смысла спрашивать: «А больше 50?» потому что он не даст нам много информации о наборе данных.

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

Есть два способа измерить качество разделения: примесь Джини и энтропия. По сути, они измеряют примеси и дают аналогичные результаты. Scikit-learn по умолчанию использует индекс gini, но вы можете изменить его на энтропию с помощью параметра критерия.

Примесь Джини

Как сказано в Википедии, примесь Джини - это мера того, как часто случайно выбранный элемент из набора будет неправильно помечен, если он был случайно помечен в соответствии с распределением ярлыков в подмножестве. По сути, это означает, что примесь увеличивается со случайностью. Например, у нас есть коробка с десятью шарами. Если все шары одного цвета, у нас нет случайности и примеси равна нулю. Однако, если у нас есть 5 синих шаров и 5 красных шаров, примесь равна 1.

Энтропия и получение информации

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

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

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

  • Больше предсказуемости
  • Меньше примесей
  • Более низкая энтропия

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

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

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

Очень важно контролировать или ограничивать глубину дерева, чтобы предотвратить переоснащение. Scikit-learn предоставляет гиперпараметры для управления структурой деревьев решений:

max_depth: максимальная глубина дерева. Глубина дерева начинается с 0 (т.е. глубина корневого узла равна нулю). Если не указано иное, модель продолжает расщепление до тех пор, пока все листья не станут чистыми или пока все листья не будут содержать менее min_samples_split выборок.

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

min_impurity_decrease: Целью разделения является уменьшение примесей (или неопределенности), но не все разделения достигают этого в равной степени. Этот параметр устанавливает порог для разделения. Узел будет разделен, если это разделение приведет к уменьшению примеси, превышающему или равному пороговому значению.

Вы можете увидеть список всех гиперпараметров DecisionTreeClassifier () здесь.

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

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

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

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

  • Bootsrapping - это случайный выбор образцов из обучающих данных с заменой. Их называют бутстрап-образцами. Следующий рисунок ясно объясняет этот процесс:

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

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

Для случайных лесов добавлен дополнительный параметр:

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

Плюсы и минусы

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

Плюсы:

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

Минусы:

  • Склонен к переобучению и должен быть объединен, чтобы хорошо обобщать

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

Плюсы:

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

Минусы:

  • Не лучший выбор для многомерных наборов данных (например, классификации текста) по сравнению с быстрыми линейными моделями (например, наивным байесовским)

Пример использования Scikit-Learn

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

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

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

Простая модель случайного регрессора леса достигла точности примерно 90% как на обучающем, так и на тестовом наборе данных:

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

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

Другие мои сообщения

Ссылки