Основное объяснение и пример использования за 7 минут

Несколько недель назад я написал статью, демонстрирующую модели классификации случайных лесов. В этой статье мы продемонстрируем случай регрессии случайного леса с использованием модели sklearn RandomForrestRegressor().

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

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

Здесь мы видим базовую диаграмму дерева решений, которая начинается с Var_1 и разбивается на основе определенных критериев. Когда «да», дерево решений следует представленному пути, когда «нет», дерево решений идет по другому пути. Этот процесс повторяется до тех пор, пока дерево решений не достигнет конечного узла и не будет определен результирующий результат. В приведенном выше примере значения a, b, c или d могут представлять любое числовое или категориальное значение.

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

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

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

В этой статье я продемонстрирую модель Random Forest, созданную на основе данных о жилье в США, размещенных в Kaggle Остином Ризом, расположенных здесь, эти данные находятся под лицензией CC0 — Public Domain. Этот набор данных содержит информацию и подробности о домах, сдаваемых в аренду. Набор данных состоит примерно из 380 тысяч наблюдений и более 20 переменных. Я провел довольно много EDA, но не буду включать все шаги, чтобы в этой статье было больше о реальной модели случайного леса.

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

  • n_estimators — количество деревьев решений, которые вы будете использовать в модели.
  • критерий — эта переменная позволяет выбрать критерий (функцию потерь), используемый для определения результатов модели. Мы можем выбирать из функций потерь, таких как среднеквадратическая ошибка (MSE) и средняя абсолютная ошибка (MAE). Значение по умолчанию — MSE.
  • max_depth — устанавливает максимально возможную глубину каждого дерева.
  • max_features — максимальное количество функций, которые модель будет учитывать при определении разделения.
  • bootstrap — значение по умолчанию для этого параметра равно True, что означает, что модель следует принципам начальной загрузки (определенным ранее).
  • max_samples — этот параметр предполагает, что для начальной загрузки установлено значение True, в противном случае этот параметр не применяется. В случае True это значение устанавливает наибольший размер каждой выборки для каждого дерева.
  • Другими важными параметрами являются min_samples_split, min_samples_leaf, n_jobs и другие, которые можно прочитать в документации RandomForestRegressor sklearn здесь.

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

rf = RandomForestRegressor(n_estimators = 300, max_features = 'sqrt', max_depth = 5, random_state = 18).fit(x_train, y_train)

Глядя на нашу базовую модель выше, мы используем 300 деревьев; max_features на дерево равно квадратному корню из числа параметров в нашем наборе обучающих данных. Максимальная глубина каждого дерева установлена ​​​​на 5. И, наконец, random_state было установлено на 18, чтобы все было стандартно.

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

В качестве краткого пояснения, среднеквадратическая ошибка (MSE) — это среднее значение суммы квадратов разницы между фактическим выходным значением и прогнозируемым выходным значением. Наша цель — максимально снизить MSE. Например, если у нас есть фактический выходной массив (3,5,7,9) и прогнозируемый результат (4,5,7,7), то мы могли бы вычислить среднеквадратичную ошибку как:
( (3-4)² + (5–5)² + (7–7)² +(9–7)²)/4 = (1+0+0+4)/4 = 5/4 = 1,25

Среднеквадратическая ошибка (RMSE) — это просто квадратный корень из MSE, поэтому в данном случае RMSE = 1,25^0,5 = 1,12.

Используя эти показатели производительности, мы можем запустить следующий код для вычисления MSE и RMSE нашей модели:

prediction = rf.predict(x_test)
mse = mean_squared_error(y_test, prediction)
rmse = mse**.5
print(mse)
print(rmse)

Наши результаты этой базовой модели случайного леса в целом были не такими уж хорошими. Значение RMSE 515 довольно высокое, учитывая, что большинство значений нашего набора данных находятся в диапазоне 1000–2000. Забегая вперед, мы увидим, поможет ли настройка создать более производительную модель.

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

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

## Define Grid 
grid = { 
    'n_estimators': [200,300,400,500],
    'max_features': ['sqrt','log2'],
    'max_depth' : [3,4,5,6,7],
    'random_state' : [18]
}
## show start time
print(datetime.now())
## Grid Search function
CV_rfr = GridSearchCV(estimator=RandomForestRegressor(), param_grid=grid1, cv= 5)
CV_frf.fit(x_train, y_train)
## show end time
print(datetime.now())

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

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

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

{'max_depth': 7,
 'max_features': 'sqrt',
 'n_estimators': 300,
 'random_state': 18}
# Create and train model
rf = RandomForestRegressor(n_estimators = 300, max_features = 'sqrt', max_depth = 7, random_state = 18)
rf.fit(x_train, y_train)
# Predict on test data
prediction = rf.predict(x_test)
# Compute mean squared error
mse = mean_squared_error(y_test, prediction)
# Print results
print(mse)
print(mse^.5)

Этот результат среднеквадратичной ошибки ниже, чем у нашей базовой модели, что приятно видеть, но в целом я бы по-прежнему считал эту производительность неадекватной. Среднеквадратическая ошибка 504 означает, что средняя ошибка оценки составляет 504 доллара от фактической арендной платы. Причин плохой работы может быть несколько:

  • Не использовать определенные переменные и/или использовать ненужные переменные
  • Плохая EDA и обработка данных
  • Неправильный учет категориальных или текстовых переменных

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

Заключение.
В этой статье мы продемонстрировали некоторые основы моделей случайного леса и, в частности, как применять алгоритм регрессора случайного леса sklearn. Мы указали на некоторые преимущества моделей случайного леса, а также на некоторые потенциальные недостатки.

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