Введение

Если вы похожи на меня — DS/MLE с практическим опытом — вас может удивить заголовок этого поста. Сначала я предположил, что ответ был однозначным «да». Однако, когда кто-то более опытный задал мне этот вопрос, я понял, что ответ может быть не таким очевидным, как я думал. И после некоторого поиска в гугле я нашел эти цитаты Лео Бреймана, создателя алгоритма Random Forest.

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

и

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

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

Для написания этого поста я использовал эту докторскую диссертацию Жиля Лупа (одного из создателей sklearn), этот пост в блоге, в котором изучается тот же вопрос, и оригинальную статью Лео Бреймана.

Математика

Определение модели

Давайте начнем с математического определения того, что мы подразумеваем под случайным лесом. Предположим, что мы уже знаем, как создавать отдельные деревья классификации. Назовем набор данных D, T деревом решений, а θ — гиперпараметрами дерева. Тогда модель, созданная этими частями, будет ψ_{D, θ} = T(D, θ), . Для простоты предположим, что все гиперпараметры фиксированы и что единственным свободным гиперпараметром является случайное начальное число, например: фиксированы значения max_depth , min_sample_split , min_sample_leaf и т. д.

Случайные леса представляют собой комбинацию деревьев, в которой каждое дерево зависит от значений случайного набора данных, отобранных независимо и с одинаковым распределением для всех деревьев в лесу. Следовательно, для набора M рандомизированных деревьев {ψ_{D, θi} | i = 1,…,M}, которые извлекают уроки из одного и того же набора данных D, мы определяем модель случайного леса как

Разложение смещения-дисперсии

Теперь, когда мы знаем, как построить случайный лес, давайте изучим его смещение и дисперсию, которые являются ключевыми составляющими переобучения. Для пары x и y, где x — вектор признаков, а y — целевое значение, определим для одного дерева ψ_{D, θi}

и

Кроме того, мы знаем, что ожидаемая ошибка обобщения модели разлагается как

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

потому что случайные величины θi независимы и подчиняются одному и тому же распределению. Поэтому

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

Теперь посмотрим, что происходит с дисперсией. После некоторых математических вычислений (стр. 66 этой статьи) можно показать, что дисперсия случайного леса из Mдеревьев равна

где ρ(x) — корреляция Пирсона между предсказаниями двух деревьев решений.

Таким образом, ошибка обобщения определяется выражением

Переоснащение

Теперь, когда мы знаем, как вычислить ошибку обобщения нашей модели, мы можем изучить, как она ведет себя при изменении гиперпараметров. Поскольку каждое дерево строится с использованием только начальной загрузки полного набора данных, мы имеем ρ(x)‹1, то есть: разные деревья в случайном лесу дают разные прогнозы для одних и тех же входных данных. Следовательно, если K›L имеем

Кроме того, когда M, мы имеем

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

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

Эксперимент

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

Чтобы изучить влияние количества деревьев на переоснащение, мы создадим синтетический набор данных, используя метод sklearn.datasets.make_regression.

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

X, y = make_regression(n_samples=10_000, 
                       n_features=50, 
                       n_informative=30, 
                       noise=10)
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.3,
                                                    random_state=42)

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

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error

rf = RandomForestRegressor()
n_estimators = []
train_mse = []
test_mse = []
for n in range(1, 50, 1):
  rf.n_estimators = n
  rf.fit(X_train, y_train)
  y_train_predicted = rf.predict(X_train)
  y_test_predicted = rf.predict(X_test)
  mse_train = mean_squared_error(y_train, y_train_predicted)
  mse_test = mean_squared_error(y_test, y_test_predicted)
  n_estimators.append(n)
  train_mse.append(mse_train)
  test_mse.append(mse_test)

И, наконец, мы можем построить MSE как для обучающих, так и для тестовых наборов данных.

Как видите, между поездной и тестовой MSE есть разрыв, что означает некоторое переоснащение. Однако по мере того, как мы добавляем больше деревьев, разрыв между обучающей и тестовой MSE не увеличивается, а это означает, что добавление большего количества деревьев не делает модель более склонной к переоснащению. На самом деле, когда мы добавляем в модель больше деревьев, разрыв между кривыми уменьшается. На следующем графике мы видим, как Gap = Test MSE - Train MSE уменьшается по мере увеличения n_estimators.

Обратите также внимание, что разрыв между кривой поезда и тестовой кривой — он же переобучение — можно изменить, настроив другие гиперпараметры, такие как max_depth . На следующем графике я показываю, как меняется зазор в зависимости от max_depth и n_estimators.

Выводы

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