Понимание внутренней работы алгоритма случайного леса

О чем эта статья

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

👉 Примечание: мы не рассматриваем этапы предварительной обработки или создания функций, связанные с моделированием, а только смотрим, что происходит внутри алгоритма когда мы вызываем методы .fit() и .transform() для RandomForestClassifier package sklearn.

Случайный лес одним абзацем

Случайный лес (RF) - это древовидный алгоритм. Это ансамбль из нескольких случайных деревьев разных типов. Окончательное значение модели - это среднее значение всех прогнозов / оценок, созданных каждым отдельным деревом.

Пакет

Мы будем основывать нашу статью на модуле Sklearn RandomForestClassifier

sklearn.ensemble.RandomForestClassifier

Данные

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

👉 Примечание: age ,glucose_level, weight, gender, smoking .. … f98, f99 - это все независимые переменные или функции.

Diabetic - переменная y / зависимая переменная, которую мы должны прогнозировать.

Эта проблема

Прогнозируйте пациентов, которые могут быть диабетиками.

Что на самом деле происходит внутри

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

Шаг 1 - начальная загрузка

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

👉 Примечание 1: количество выбираемых строк можно указать с помощью r в гиперпараметре- (max_samples), как это в вашем коде

import sklearn.ensemble.RandomForestClassifier
my_rf = RandomForestClassifier(max_samples=100)

👉 Примечание 2: Это применимо только в том случае, если вы включили самозагрузку в гиперпараметре (bootstrap = True). bootstrap по умолчанию - True.

👉 Примечание 3: одна строка может быть выбрана более одного раза.

Шаг 2 - Выбор объектов для поддеревьев

Теперь RF случайным образом выбирает подмножество функций / столбцов. Здесь для простоты и для примера мы выбираем 3 случайные функции.

Примечание 👉 Вы можете управлять этим числом в гиперпараметре - max_features аналогично приведенному ниже коду.

import sklearn.ensemble.RandomForestClassifier
my_rf = RandomForestClassifier(max_features=3)

Шаг 3 - Выбор корневого узла

После выбора 3 случайных характеристик (в нашем примере) алгоритм выполняет разделение записи m (с шага 1) и быстро вычисляет до и после значения метрики.

Эта метрика может быть либо примесью Джини, либо энтропией. Он основан на критериях - gini или entropy , которые вы указали в своем гиперпараметре.

import sklearn.ensemble.RandomForestClassifier
my_rf = RandomForestClassifier(max_features=8 , criteria = 'gini')

criterion = 'gini' ( or 'entropy' )

По умолчанию установлено значение criteria = 'gini’.

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

Записи разделяются в этом узле на основе наилучшей точки разделения.

Шаг 4 - Выбор дочерних узлов

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

Основываясь на критериях (gini / entropy ), он выбирает, какая функция будет включена в следующий узел / дочерний узел, и здесь происходит дальнейшее разделение записей.

Шаг 5. Дальнейшее разделение и создание дочерних узлов.

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

  • a) у вас закончилось количество строк для разделения или вы достигли порога - минимальное количество строк, которое должно присутствовать в каждом дочернем узле - вы можете указать это в гиперпараметре - min_samples_leaf
  • б) джини / энтропия после разделения не снижается сверх установленного минимального предела
  • в) вы достигли указанного вами количества сплитов (max_depth)

Теперь у вас есть первое «дерево мини-решений».

Шаг 6. Создайте еще несколько деревьев мини-решений.

Алгоритм возвращается к вашим данным и выполняет шаги 1–5 для создания второго «мини-дерева».

Шаг 7. Постройте лес из деревьев

Когда достигается значение по умолчанию, равное 100 деревьям (теперь у вас есть 100 мини-деревьев решений), считается, что модель завершила свой fit() процесс.

👉 Примечание. Вы можете указать количество деревьев, которые хотите сгенерировать, в своем гиперпараметре ( n_estimators)

import sklearn.ensemble.RandomForestClassifier
my_rf = RandomForestClassifier(n_estimators=300)

Теперь у вас есть лес случайно созданных мини-деревьев (отсюда и название Случайный лес)

Шаг 7. Вывод

Теперь давайте предскажем значения в невидимом наборе данных (тестовом наборе данных).

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

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

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

Окончательное значение прогноза для этой записи рассчитывается путем простого голосования этих 100 мини-деревьев.

Теперь у нас есть прогноз для одной записи.

Алгоритм перебирает все записи набора тестов, следуя одному и тому же процессу, и вычисляет общую точность!

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

[1] документация sklearn для RandomForestClassifier (версия: 3.2.4.3.1)

Https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html