Понимание внутренней работы алгоритма случайного леса
О чем эта статья
В этой статье мы увидим, как алгоритм случайного леса работает внутри. Чтобы по-настоящему оценить это, было бы полезно немного разобраться в классификаторах дерева решений. Но это не совсем обязательно.
👉 Примечание: мы не рассматриваем этапы предварительной обработки или создания функций, связанные с моделированием, а только смотрим, что происходит внутри алгоритма когда мы вызываем методы .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
.RandomForestClassifiermy_rf = RandomForestClassifier
(max_samples
=100)
👉 Примечание 2: Это применимо только в том случае, если вы включили самозагрузку в гиперпараметре (bootstrap = True
). bootstrap
по умолчанию - True.
👉 Примечание 3: одна строка может быть выбрана более одного раза.
Шаг 2 - Выбор объектов для поддеревьев
Теперь RF случайным образом выбирает подмножество функций / столбцов. Здесь для простоты и для примера мы выбираем 3 случайные функции.
Примечание 👉 Вы можете управлять этим числом в гиперпараметре - max_features
аналогично приведенному ниже коду.
import sklearn.ensemble
.RandomForestClassifiermy_rf = RandomForestClassifier
(max_features=3)
Шаг 3 - Выбор корневого узла
После выбора 3 случайных характеристик (в нашем примере) алгоритм выполняет разделение записи m (с шага 1) и быстро вычисляет до и после значения метрики.
Эта метрика может быть либо примесью Джини, либо энтропией. Он основан на критериях - gini
или entropy
, которые вы указали в своем гиперпараметре.
import sklearn.ensemble
.RandomForestClassifiermy_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
.RandomForestClassifiermy_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