В прошлой части ноутбука мы реализовали бэггинг над решающими деревьями, а также попробовали помимо выбора случайных объектов выбирать еще и случайные признаки для каждого решающего дерева, и это не показало хороший результат. Давайте попробуем выбирать случайный признак не для каждого отдельного дерева, а выбирать случайный признак при построении дерева в каждой его вершине. Тогда, если в какой-то вершине вы выбрали только неинформативные признаки, то в другую вершину попадут, возможно, и информативные признаки, и наше дерево получится не таким плохим. То есть при бэггинге таких деревьев (при усреднении таких деревьев) у нас не будет сильно плохих деревьев и при усреднении качества мы, возможно, получим неплохой результат. При этом каждое наше дерево будет слабо скоррелировано со всеми остальными деревьями, то есть ответы каждого дерева будут слабо скоррелированы с ответами остальных деревьев. Эта идея и реализована в алгоритме случайный лес, random forest. Давайте импортируем из библиотеки scikit-learn класс "RandomForestRegressor", обучим этот алгоритм и посмотрим на качества этого алгоритма. Создадим объект класса "RandomForestRegressor" c гиперпараметром "n_estimators" (это число деревьев) равным 100 (так как в бэггинге мы тоже обучали 100 деревьев) и передадим гиперпараметр "max_features" равный 0.2. То есть мы будем в каждой вершине выбирать лишь 20 процентов признаков (при выборе лучшего разбиения в каждой вершине будем выбирать лишь 20 процентов признаков). Обучим random forest на обучающей выборке и посчитаем качество предсказания по метрике MSE. Давайте теперь сравним это качество с полученным качеством в бэггинге. Видно, что результат получился уже значительно лучше. Давайте теперь посмотрим, как изменяется качество алгоритма random forest при выборе различных гиперпараметров. Посмотрим, как зависит качество алгоритма от выбора числа деревьев. Для этого мы построим график. Для построения графика импортируем matplotlib. Качества по метрике MSE для каждого выбора гиперпараметра будем добавлять в список. Возьмем мы "Q"; инициализируем "Q" просто пустым списком. Далее пройдемся циклом по различному числу деревьев, которые будем перебирать, а именно мы будем перебирать число деревьев от одного до 200 с шагом два. Будем создавать объект класса "RandomForestRegressor" с выбранным гиперпараметром, и с выбранным гиперпараметром "max_features" равным 0.2. Обучим "RandomForestRegressor" на обучающей выборке и в список "Q" добавим качество (предсказание) по метрике MSE. И теперь визуализируем результат. Подпишем оси и посмотрим, что получилось. Видно, что с увеличением числа деревьев качество растет, ошибка падает; при этом уже при выборе 25 или 50 деревьев качество примерно выходит на асимптоту и практически не изменяется; есть какие-то мелкие колебания, которые происходят из-за выбора случайных подвыборок и выбора случайных признаков в каждой вершине, то есть результат "RandomForestRegressor" немножко отличается при каждом запуске. Теперь давайте посмотрим, как изменяется качество при выборе различного параметра "max_features". Напомню, что параметр "max_features" отвечает за то, какое количество признаков мы будем перебирать для выбора лучшего разбиения в каждой вершине. Мы точно так же будем качества сохранять в список "Q"; пройдемся циклом по различному выбору параметров "max_features"; и посчитаем качества на тестовой части (обучим на обучающей части, посчитаем качества на тестовой); "max_features" можно выбирать в диапазоне от одного до 10, так как у нас всего 10 признаков (мы поэтому здесь "11" поставим). Будем создавать объект класса "RandomForestRegressor" с числом деревьев 100 и с гиперпараметром "max_features" — с тем, который мы выбираем в цикле. Далее обучим на обучающей части и добавим качество предсказаний в список "Q". Теперь визуализируем результат. Видно, что при выборе различного параметра "max_features" качество сначала растет (и лучшее качество при выборе двух признаков), а дальше качество падает (при выборе большего числа признаков). В этой части ноутбука мы разобрались с алгоритмом random forest (или случайный лес), а также посмотрели, как зависит качество предсказания алгоритма случайный лес от выбора гиперпараметров "количество деревьев" и "максимальное число признаков".