случайный лес машинное обучение история

🤖 Машинное обучение для начинающих: алгоритм случайного леса (Random Forest)

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

В каких задачах используется?

Благодаря своей гибкости Random Forest применяется для решения практически любых проблем в области машинного обучения. Сюда относятся классификации (RandomForestClassifier) и регрессии (RandomForestRegressor), а также более сложные задачи, вроде отбора признаков, поиска выбросов/аномалий и кластеризации.

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

Здесь мы на основе классификации просто добавляем метод для отбора признаков.

Порядок действий в алгоритме

Теоретическая составляющая алгоритма случайного дерева

По сравнению с другими методами машинного обучения, теоретическая часть алгоритма Random Forest проста. У нас нет большого объема теории, необходима только формула итогового классификатора a(x) :

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

Реализация алгоритма Random Forest

Реализуем алгоритм на простом примере для задачи классификации, используя библиотеку scikit-learn:

Работаем с алгоритмом по стандартному порядку действий, принятому в scikit-learn. Вычисляем AUC-ROC (площадь под кривой ошибок) для тренировочной и тестовой частей модели, чтобы определить ее качество:

Необходимые параметры алгоритма

Число деревьев – n_estimators

Критерий расщепления – criterion

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

Число признаков для выбора расщепления – max_features

Минимальное число объектов для расщепления – min_samples_split

Второстепенный по своему значению параметр, его можно оставить в состоянии по умолчанию.

Ограничение числа объектов в листьях – min_samples_leaf

Максимальная глубина деревьев – max_depth

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

Неглубокие деревья рекомендуется использовать в задачах со значительным количеством шумовых объектов (выбросов).

Преимущества алгоритма

Недостатки алгоритма

Заключение

Метод случайного дерева (Random Forest) – это универсальный алгоритм машинного обучения с учителем. Его можно использовать во множестве задач, но в основном он применяется в проблемах классификации и регрессии.

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

Источник

Анализ малых данных

КвазиНаучный блог Александра Дьяконова

Случайный лес (Random Forest)

Случайный лес — один из самых потрясающих алгоритмов машинного обучения, придуманные Лео Брейманом и Адель Катлер ещё в прошлом веке. Он дошёл до нас в «первозданном виде» (никакие эвристики не смогли его существенно улучшить) и является одним из немногих универсальных алгоритмов. Универсальность заключается, во-первых, в том, что он хорош во многих задачах (по моим оценкам, 70% из встречающихся на практике, если не учитывать задачи с изображениями), во-вторых, в том, что есть случайные леса для решения задач классификации, регрессии, кластеризации, поиска аномалий, селекции признаков и т.д.

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Этот пост — краткое практическое руководство для новичков — путеводитель по основным параметрам алгоритма с картинками (которые, кстати, построены на данных последнего конкурса Сбербанка и одной модельной задачи). Под тестом здесь понимается результат на скользящем контроле (для построения графиков использовано 5 фолдов), хотя для отложенного контроля (hold out) выводы будут такими же. Графики лежат в коридорах: дисперсионном и (если есть второй коридор) макс-минном. Все выводы и рекомендации — общие — не для конкретной задачи.

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

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

В библиотеке scikit-learn есть такая реализация RF (привожу только для задачи классификации):

С алгоритмом работают по стандартной схеме, принятой в scikit-learn:

Опишем, что означают основные параметры:

Число деревьев — n_estimators

Чем больше деревьев, тем лучше качество, но время настройки и работы RF также пропорционально увеличиваются. Обратите внимание, что часто при увеличении n_estimators качество на обучающей выборке повышается (может даже доходить до 100%), а качество на тесте выходит на асимптоту (можно прикинуть, скольких деревьев Вам достаточно).

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Число признаков для выбора расщепления — max_features

График качества на тесте от значения этого праметра унимодальный, на обучении он строго возрастает. При увеличении max_features увеличивается время построения леса, а деревья становятся «более однообразными». По умолчанию он равен sqrt(n) в задачах классификации и n/3 в задачах регрессии. Это самый важный параметр! Его настраивают в первую очередь (при достаточном числе деревьев в лесе).

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Минимальное число объектов, при котором выполняется расщепление — min_samples_split

Этот параметр, как правило, не очень важный и можно оставить значение по умолчанию (2). График качества на контроле может быть похожим на «расчёску» (нет явного оптимума). При увеличении параметра качество на обучении падает, а время построения RF сокращается.

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Ограничение на число объектов в листьях — min_samples_leaf

Всё, что было описано про min_samples_split, годится и для описания этого параметра. Часто можно оставить значение по умолчанию (1). Кстати, по классике, в задачах регрессии рекомендуется использовать значение 5 (в библиотеке randomForest для R так и реализовано, в sklearn — 1).

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Максимальная глубина деревьев — max_depth

Ясно, что чем меньше глубина, тем быстрее строится и работает RF. При увеличении глубины резко возрастает качество на обучении, но и на контроле оно, как правило, увеличивается. Рекомендуется использовать максимальную глубину (кроме случаев, когда объектов слишком много и получаются очень глубокие деревья, построение которых занимает значительное время). При использовании неглубоких деревьев изменение параметров, связанных с ограничением числа объектов в листе и для деления, не приводит к значимому эффекту (листья и так получаются «большими»). Неглубокие деревья рекомендуют использовать в задачах с большим числом шумовых объектов (выбросов).

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Критерий расщепления — criterion

По смыслу это очень важный параметр, но по факту здесь нет вариантов выбора. В библиотеке sklearn для регрессии реализованы два критерия: “mse” и “mae”, соответствуют функциям ошибки, которые они минимизируют. В большинстве задач используется mse. Сравнить их пока не берусь, т.к. mae появился совсем недавно — в версии 0.18 (и по-моему, реализован с ошибкой). Для классификации реализованы критерии “gini” и “entropy”, которые соответствуют классическим критериям расщепления: Джини и энтропийному. Простой перебор поможет Вам выбрать, что использовать в конкретной задаче (в авторской реализации алгоритма использовался Джини). Подробнее о критериях надо писать отдельный пост;)

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

В sklearn-реализации случайного леса нет параметра samplesize, который регламентирует, из скольких объектов делать подвыборку для построения каждого дерева. Такой параметр есть в R-реализации, но, по сути, часто оптимально выбирать из всей выборки. Также рекомендуется выбирать подвыборку с возвращением: bootstrap=True (это и есть бэггинг — bootstrap aggregating).

Совет

По умолчанию в sklearn-овских методах n_jobs=1, т.е. случайный лес строится на одном процессоре. Если Вы хотите существенно ускорить построение, используйте n_jobs=-1 (строить на максимально возможном числе процессоров). Для построения воспроизводимых экспериментов используйте предустановку генератора псевдослучайных чисел: random_state.

П.С. Метод RF хорош ещё тем, что при построении леса параллельно может вычисляться т.н. oob-оценка качества алгоритма (которая очень точная и получается не в ущерб разделения на обучение/тест), oob-ответы алгоритмы (ответы, которые выдавал бы алгоритм на обучающей выборке, если бы «обучался не на ней»), оцениваются важности признаков (но об этом, опять же, надо писать в отдельном посте). Ну, и не стоит забывать про полный перебор значений параметров (если объектов в задаче не очень много).

Источник

Как работает случайный лес?

Как и почему работает случайный лес? Разбираемся

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Jan 9, 2020 · 7 min read

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

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

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

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

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

Цвет кажется довольно очевидным признаком для разделения, поскольку все нули, кроме одного, синие. Поэтому мы можем использовать вопрос: “это красный?”, чтобы разделить наш первый узел. Вы можете представить себе узел в дереве как точку, в которой путь разделяется на два: значения, соответствующие критериям, идут вниз по ветке Yes, а не соответствующие критерию идут по ветке No.

У ветви No теперь все 0, но ветвь Yes все еще можно разделить. Теперь мы можем использовать вторую функцию и спросить: “это подчеркнуто?” для второго разделения.

Две подчёркнутые единицы идут вниз по стороне Yes, а неподчёркнутый 0 идет по правой стороне — и это всё. Наше дерево решений использовало эти два признака, чтобы идеально разделить данные.

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

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

Классификатор случайного леса

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

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

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

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

Почему это работает?

Эффект многих некоррелированных моделей так важен, что я хочу показать вам пример, который поможет понять это. Представьте себе, что мы играем в такую игру: у меня есть равномерно распределенный генератор случайных чисел для получения числа. Если число, которое я генерирую, больше или равно 40, вы выигрываете, то есть у вас 60% шанс на победу, и я плачу вам деньги. Если число меньше 40, я выигрываю — вы платите мне ту же сумму. Я предлагаю варианты. Мы играем так:

Что бы вы выбрали? Ожидаемая ценность каждой игры одинакова:

А как насчет распределений? Визуализируем результаты с помощью моделирования Монте-Карло: запустим 10 000 симуляций каждого типа игры. Например, имитируем 100 игр по первым условиям 10 000 раз. Взгляните на график ниже. Каков ваш выбор теперь?

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Первый вариант, где мы играем 100 раз, предлагает лучший шанс заработать немного денег. На 10 000 симуляций вы зарабатываете деньги в 97% случаев! Во второй игре, где мы играем 10 раз, вы зарабатываете деньги в 63% симуляций. В третьей вы зарабатываете в 60% случаев, как и ожидалось.

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

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

Разнообразие моделей

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

Обратите внимание, что при разбиении на пакеты мы не разбиваем обучающие данные на более мелкие фрагменты и не обучаем каждое дерево на другом фрагменте. Скорее, если у нас есть выборка размера N, мы подаём на вход каждого дерева обучающий набор размера N, если не указано иное.

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Разбиение узлов в модели основано на случайном подмножестве объектов для каждого дерева.

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

Посмотрим на два дерева леса из примера. Когда мы проверяем первое дерево, то обнаруживаем, что оно может рассматривать только признаки 2 и 3, выбранные случайным образом. Мы знаем из нашего традиционного дерева решений, что признак 1 лучший для разбиения, но дерево 1 не может видеть его, поэтому оно вынуждено работать с признаком 2. Второе дерево, с другой стороны, может видеть только признаки 1 и 3, поэтому может выбрать признак 1.

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

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

Вывод

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

Что нам нужно, чтобы случайный лес прогнозировал точнее?

Источник

Реализация и разбор алгоритма «случайный лес» на Python

Авторизуйтесь

Реализация и разбор алгоритма «случайный лес» на Python

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Использование готовых библиотек, таких как Scikit-Learn, позволяет легко реализовать на Python сотни алгоритмов машинного обучения.

В этой статье мы научимся создать и использовать алгоритм «случайный лес» (Random Forest) на Python. Помимо непосредственного изучения кода, мы постараемся понять принципы работы модели. Этот алгоритм составлен из множества деревьев решений, поэтому сначала мы разберёмся, как одно такое дерево решает проблему классификации. После этого с помощью алгоритма решим проблему, используя набор реальных научных данных. Весь код, используемый в этой статье, доступен на GitHub в Jupyter Notebook.

Как работает дерево решений

Дерево решений — интуитивно понятная базовая единица алгоритма случайный лес. Мы можем рассматривать его как серию вопросов да/нет о входных данных. В конечном итоге вопросы приводят к предсказанию определённого класса (или величины в случае регрессии). Это интерпретируемая модель, так как решения принимаются так же, как и человеком: мы задаём вопросы о доступных данных до тех пор, пока не приходим к определённому решению (в идеальном мире).

Базовая идея дерева решений заключается в формировании запросов, с которыми алгоритм обращается к данным. При использовании алгоритма CART вопросы (также называемые разделением узлов) определяются таким образом, чтобы ответы вели к уменьшению загрязнения Джини (Gini Impurity). Это означает, что дерево решений формирует узлы, содержащие большое количество образцов (из набора исходных данных), принадлежащих к одному классу. Алгоритм старается обнаружить параметры со сходными значениями.

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

Дерево решений для простой задачи

Начнём с проблемы простой бинарной классификации, изображённой на диаграмме.

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

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

Мы используем Scikit-Learn, чтобы создать дерево решений и обучить ( fit ) его, используя наши данные.

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

Можно проверить точность предсказаний нашей модели:

Разумеется, мы получим точность 100 %, так как сообщили модели правильные ответы ( y ) и не ограничивали глубину дерева. Но следует помнить, что подобная подгонка дерева решений под тренировочные данные может спровоцировать переобучение модели.

Визуализация дерева решений

Что же на самом деле происходит при обучении дерева решений? Хороший способ понять это — визуализация модели при помощи соответствующей функции Scikit-Learn (подробнее функция рассматривается в данной статье).

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Во всех узлах, кроме листьев (цветные узлы без исходящих связей), содержится 5 частей:

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

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

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

Загрязнение Джини

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

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Загрязнение Джини узла n равно 1 минус сумма отношений класса к общему количеству образцов pi, возведённых в квадрат, для каждого из множества классов J (в нашем случае это всего 2 класса). Звучит сложно, поэтому покажем, как вычисляется загрязнение Джини для корневого узла:

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

Затем процесс разделения повторяется с использованием «жадной», рекурсивной процедуры, пока дерево не достигнет максимальной глубины или в каждом узле не останутся только образцы одного класса. Общевзвешенное загрязнение Джини должно уменьшаться с каждым уровнем. В нашем случае на втором уровне оно составит 0.333:

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

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

Переобучение, или почему лес лучше одного дерева

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

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

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

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

Поиск баланса между излишней и недостаточной гибкостью модели является ключевой концепцией машинного обучения и называется компромиссом между вариативностью и погрешностью (bias-variance tradeoff).

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

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

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

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

Случайная выборка тренировочных образцов

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

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

Случайные наборы параметров для разделения узлов

Вторая базовая концепция случайного леса заключается в использовании определённой выборки параметров образца для разделения каждого узла в каждом отдельном дереве. Обычно размер выборки равен квадратному корню из общего числа параметров. То есть, если каждый образец набора данных содержит 16 параметров, то в каждом отдельном узле будет использовано 4. Хотя обучение случайного леса можно провести и с полным набором параметров, как это обычно делается при регрессии. Этот параметр можно настроить в реализации случайного леса в Scikit-Learn.

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

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

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

Поэтому нужно не опираться на решение какого-то одного аналитика, а собрать вместе их прогнозы. Более того, как и при использовании случайного леса, нужно разрешить каждому аналитику доступ только к определённым новостным источникам, в надежде на то, что эффекты шумов будут нейтрализованы выборкой. В реальной жизни мы полагаемся на множество источников (никогда не доверяйте единственному обзору на Amazon). Интуитивно нам близка не только идея дерева решений, но и комбинирование их в случайный лес.

Алгоритм Random Forest на практике

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

Набор данных

Мы попробуем рассчитать состояние здоровья пациентов в бинарной системе координат. В качестве параметров мы используем социально-экономические и персональные характеристики субъектов. В качестве меток мы используем 0 для плохого здоровья и 1 для хорошего. Этот набор данных был собран Центром по Контролю и Предотвращению Заболеваний и размещён в свободном доступе.

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

В данном примере мы сталкиваемся с задачей несбалансированной классификации, поэтому простой параметр точности модели не отобразит истинной её производительности. Вместо этого мы используем площадь под кривой операционных характеристик приёмника (ROC AUC), измерив от 0 (в худшем случае) до 1 (в лучшем случае) со случайным прогнозом на уровне 0,5. Мы также можем построить указанную кривую, чтобы проанализировать модель.

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

После нескольких минут обучения модель будет готова выдавать прогнозы для тестовых данных:

Мы рассчитаем прогнозы классификации ( predict ) наряду с прогностической вероятностью ( predict_proba ), чтобы вычислить ROC AUC.

Результаты

Итоговое тестирование ROC AUC для случайного леса составило 0.87, в то время как для единичного дерева с неограниченной глубиной — 0.67. Если вернуться к результатам обработки тренировочных данных, обе модели покажут эффективность, равную 1.00 на ROC AUC. Этого и следовало ожидать, ведь мы предоставили готовые ответы и не ограничивали максимальную глубину каждого дерева.

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

Мы можем визуализовать кривую ROC для одиночного дерева (верхняя диаграмма) и для случайного леса в целом (нижняя диаграмма). Кривая лучшей модели стремится вверх и влево:

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Случайный лес значительно превосходит по точности одиночное дерево.

Ещё один способ оценить эффективность построенной модели — матрица погрешностей для тестовых прогнозов.

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

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

Значимость параметра

Значимость параметра в случайном лесу — это суммарное уменьшение загрязнения Джини во всех узлах, использующих этот параметр для разделения. Мы можем использовать это значение для определения опытным путём, какие переменные более всего принимаются во внимание нашей моделью. Мы можем рассчитать значимость параметров в уже обученной модели и экспортировать результаты этих вычислений в Pandas DataFrame следующим образом:

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

Визуализация единичного дерева леса

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

случайный лес машинное обучение история. Смотреть фото случайный лес машинное обучение история. Смотреть картинку случайный лес машинное обучение история. Картинка про случайный лес машинное обучение история. Фото случайный лес машинное обучение история

Следующие шаги

Следующим шагом будет оптимизация случайного леса, которую можно выполнить через случайный поиск, используя RandomizedSearchCV в Scikit-Learn. Оптимизация подразумевает поиск лучших гиперпараметров для модели на текущем наборе данных. Лучшие гиперпараметры будут зависеть от набора данных, поэтому нам придётся проделывать оптимизацию (настройку модели) отдельно для каждого набора.

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

Реализацию случайного поиска для оптимизации модели можно изучить в Jupyter Notebook.

Полностью рабочий образец кода

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

Заключение и выводы

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

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

В этой статье мы разобрали следующие ключевые концепции:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *