[ЗАСТАВКА] Привет! В этом видео мы займемся построением модели «случайный лес» с помощью модуля sklearn.ensemble. Анализировать случайный лес мы будем на очень интересном наборе данных — это данные задачи bioresponse на kaggle. По данным характеристикам молекулы нам требуется предсказать, будет ли дан биологический ответ. Всего нам доступно 1776 характеристик молекулы, при этом матрица признаков нормализована. Для работы мы будем использовать обучающую выборку с сайта kaggle — она также доступна, называется train_csv. Для начала давайте загрузим файл и проанализируем данные. Анализировать данные будем в виде дейтафрейма, загружаем данные в виде... с помощью функции read_csv. Теперь давайте посмотрим, как они выглядят. Получили такую таблицу. В первом столбце мы видим нашу целевую переменную — она принимает значение 1 или 0, в зависимости от того, был ли дан биологический ответ. Все остальные столбцы соответствуют признакам. Давайте посмотрим размер нашей матрицы. Да, мы видим, что нам доступны данные о 3751 молекуле. Итак, давайте выведем названия колонок. Да, видим, что все данные называются большой буквой D и дальше индексом — номером признака. Так, теперь давайте отдельно отрежем целевую переменную — нам так удобней будет анализировать данные, и заодно сразу же посчитаем распределение наших объектов по классам. Ну вот видим, что задача почти сбалансирована. Теперь давайте отдельно отрежем данные, и вся подготовительная работа закончена. Теперь можно переходить непосредственно к построению модели. Построить модель RandomForest с помощью sklearn очень просто — для этого достаточно создать объект класса RandomForestClassifier с нужными параметрами. А также несложно применить и обучить эту модель — для этого нужно воспользоваться уже известными вам методами fit и predict. С другой стороны, анализировать качество модели, а то и параметров, вы тоже уже умеете. Это можно делать с помощью поиска по сетке или случайного поиска. Давайте мы не будем этого делать, а вместо этого решим другую задачу — проанализируем, как зависит качество модели от количества обучающих объектов выборки. Для этого давайте создадим нашу модель. Для начала будем строить случайный лес над 50 деревьями, каждый из которых будет иметь глубину не больше 2. Создаем такой объект. И теперь давайте построим следующий график — нам будет интересно посмотреть, как меняется качество на обучающей и тестовой выборке, в зависимости от того, на скольких объектах мы обучаемся. Для того чтобы получить такие графики, у sklearn есть специальная функция под названием learning_curve. Она позволяет нам сделать следующее — ей можно передать на вход нужный нам алгоритм, передать данные и целевую функцию, а также сказать, в каких пропорциях мы хотим обучаться, то есть на каких долях обучающей выборки мы хотим строить модель. После этого с помощью этого метода будут построены несколько моделей, мы получим оценку качества на каждом объеме обучающей выборки, и нам будут возвращены размер обучающей выборки, оценки качества на «трейне» и оценка качества на тесте. Имея такие данные, мы легко сможем проанализировать, как качество на обучении и тесте меняется от объема обучающей выборки. Вот давайте сделаем такую вещь. Мы передаем в функцию наш классификатор, который мы создали ранее. Далее передаем туда данные, которые мы также подготовили на предварительном шаге. И говорим, что мы будем обучать модель на следующих данных: сначала мы возьмем 0,1 от обучающей выборки и далее будем двигаться с шагом 0,2 до 1. Оценивать качество будем с помощью уже знакомой нам метрики accuracy и будем делать кросс-валидацию на 3 фолда. Давайте запустим. Процесс занимает некоторое время, потому что обучаются довольно много моделей. И теперь давайте посмотрим, как выглядит вывод нашей функции. Ну для начала мы видим, что train_sizes — размер обучающей выборки — был преобразован из долей в конкретное количество объектов, на которых мы обучались. То есть мы видим, что минимальное количество обучающих объектов в рамках нашего эксперимента составляет 250, максимальное — 2250. Также нам доступны оценки качества на обучении и оценки качества на тесте. Так как у нас проводилась кросс-валидация, я сразу же сделала усреднение по всем фолдам — это делается с помощью команды mean. Аргумент axis = 1 означает, что мы будем усреднять по строчкам. Вот в данном случае каждая строка — это результат измерения кросс-валидации, поэтому нам это подходит. Теперь давайте построим график. Сразу добавим на график сетку и будем строить две кривые — качество обучения на обучающей выборке и на тестовой выборке. Давайте посмотрим. Так, мы видим, что в начале качество на обучающей выборке падает — приблизительно до отметки 1250 деревьев, и дальше качество меняется очень медленно. С другой стороны, на тестовой выборке качество продолжает расти приблизительно до этой же точки, и дальше оно также перестает меняться. Какой вывод мы можем сделать из этого? Дальнейший рост обучающей выборки вряд ли скажется на качестве нашей модели. Это говорит о том, что модель данной сложности не может многое выиграть за счет того, что мы обогатим данные. Что же делать в такой ситуации? Давайте попробуем увеличить сложность модели — возможно, это приведет к улучшению ее качества. Так как мы с вами обучали модель на деревьях глубины 2, давайте увеличим глубину деревьев — это даст нам дополнительные возможности. Снова создаем классификатор RandomForestClassifier, но в этот раз указываем ему параметр max_depth = 10 — это максимально возможная глубина деревьев. Теперь давайте еще раз запустим команду learning_curve и построим кривую обучения на тесте и на обучении, при этом мы будем делать это по тем же самым точкам, по тем же самым долям обучающей выборки. [ЗВУК НАЖАТИЯ КЛАВИШИ] Итак, наши данные готовы, теперь строим график. Здесь мы видим в некоторой степени противоположную ситуацию — мы видим, что с ростом обучающей выборки, качество на тесте продолжает расти. В конце оно начинает расти несколько медленнее, но тем не менее тренд заметен. То же самое можно сказать про обучение — качество на обучающей выборке продолжает падать не очень быстро. Отсюда мы можем сделать вывод, что модель данной сложности действительно получает некоторые преимущества от того, что мы добавляем объекты в обучение. Таким образом, в данном случае имеет смысл увеличивать объем обучающей выборки. Объем обучающей выборки и сложность модели значительно сказываются на времени построения модели. С этой точки зрения строить кривые обучения очень полезно — вы можете проанализировать, имеет ли смысл добавлять больше данных в обучение. А мы на этом заканчиваем. На этом уроке мы познакомились с RandomForest, научились строить его в sklearn, а также проанализировали кривые обучения для деревьев различной глубины. На этом мы заканчиваем изучение RandomForest, а в следующем модуле вы познакомитесь с алгоритмом градиентного бустинга.