Мой любимый вопрос на собеседовании - «Что такое случайное в случайном лесу?». Я задаю этот вопрос всем, кто утверждает, что использовал Random Forest (RF) в своей работе. Самый распространенный ответ, который я получаю, - это то, что случайный лес называется так, потому что каждое дерево в лесу строится путем случайного выбора выборки данных. Хотя этот ответ частично верен, есть и другие более важные причины для добавления слова random перед словом Forest.

Возникновение случайного леса - это основополагающая статья, которую Лео Бриман написал в 2001 году. В этой статье Лео ввел термин случайный лес для обозначения нового класса алгоритмов (обратите внимание на множественное число), основанных на нескольких идеи машинного обучения набирали популярность в то время. Все эти идеи имели две точки сходства; во-первых, они имели некоторый элемент случайности, а во-вторых, они были основаны на деревьях решений. В своей статье Лео упоминает две предыдущие работы как свои источники вдохновения. Один из них принадлежит Амиту и Джеману (Квантование формы и распознавание с помощью случайных деревьев), о котором Лео говорит: Эта более поздняя статья оказала влияние на мое мышление. Другой важный документ, на который ссылается Лео, называется Тин Кан Хо Метод случайного подпространства для построения леса решений.

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

Реализация с кодом

Мы можем дополнительно получить интуитивное представление об этих идеях, опробовав эти идеи на Python. Исходя из основной идеи случайности, мы попытаемся реализовать дерево в мешках. Реализация упакованных деревьев в Sklearn осуществляется через общий API sklearn.ensemble.BaggingClassifier. Для этой демонстрации я использовал набор данных по раку груди из Висконсина. Более подробная информация об этом наборе данных доступна здесь.

Полный код доступен на GitHub. В этом блоге я добавил скриншоты.

Сгруппированные деревья решений

После некоторой базовой очистки данных (подробности см. В GitHub), я пытаюсь смоделировать данные, используя деревья решений в мешках. К обсуждению этого поста относятся три параметра. Max_samples - это процент данных, используемых для каждого дерева в ансамбле. В приведенном ниже примере мы используем только 30% данных для каждого дерева и подбираем 10 деревьев (n_estimator = 10). Второй параметр max_features - это количество функций, используемых в каждом дереве. В этом случае нам нужны все функции, и поэтому это значение равно 1.0. Последний параметр, bootstrap, обозначает нашу стратегию выборки. Bootstrap = True обозначает выборку с заменой.

Здесь у нас есть ошибка 7,2% для данных Out of Bag (OOB) с использованием упакованных деревьев решений.

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

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

sklearn имеет прямой API для случайного леса, и приведенный ниже код описывает использование RF (полный код на GitHub). Обратите внимание, что нет эквивалента параметра max_samples из упакованных деревьев. То есть реализация RF sklearn даже не позволяет обучение на подвыборках. Сильный намек на то, что случайная функция является основной причиной, по которой RF так называются.

Реализация RF позволяет нам управлять двумя наборами параметров, первый набор используется для создания леса, а второй набор специфичен для отдельного дерева в лесу. «N_estimators» - это количество деревьев, которые будут в нашем лесу. «Max_features», как и раньше, - это процент функций, которые нам нужны в каждом дереве. Установка max_features = auto выбирает функции sqrt (p) (где p - количество функций в исходных данных) из данных и увеличивает дерево, используя эти данные. Последний интересующий параметр - bootstrap; хотя RF не разрешает выборку данных для построения деревьев, он разрешает самозагрузку. Загрузочные данные будут иметь тот же размер, что и исходные данные, но каждое дерево будет обучаться на другом наборе данных.

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