[Перевод] Улучшаем модель RandomForestClassifier

Статья взята из источника Daily Dose of Data Science.

Оговорюсь сразу: Я новичок в Data Scince и в оформлении статей. Пишу лишь сюда для своих заметок ну и может быть будет кому-то полезно. Прошу сильно не судить!)

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

d7f1837e061029405a8f5f372d034c53.webp

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

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

И в этой статье делюсь одним из самых невероятных приемов, которые я недавно нашел для себя:

  • Повышаем точность модели случайного леса.

  • Уменьшаем размер модели RandomForestClassifier.

  • Коренным образом сокращаем время на предсказание.

    И все это без необходимости повторного обучения модели.

Логика

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

71674a8db834b5c027cee30fd0b25078.png

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

8ddcefccedc8c954ccc1a35d156fd7e0.png

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

Итак, что если мы сделаем следующее:

  • Мы найдем точность на тестовых данных для каждого дерева решений.

  • Мы отсортируем точности в порядке убывания.

  • Мы оставим только «k» наилучших деревьев решений и удалим остальные.

После этого в нашем случайном лесу останутся только деревья решений с лучшими результатами, оцененными на тестовом наборе данных. Круто, не так ли?

Теперь, как определить «к» наилучших деревьев?

Это просто.

Мы можем построить график кумулятивной точности.

Это будет линейный график, отображающий точность случайного леса:

  • Рассматривая только первые два дерева решений.

  • Рассматривая только первые три дерева принятия решений.

  • Рассматривая только первые четыре дерева принятия решений.

И так далее.

Ожидается, что точность сначала будет увеличиваться с увеличением числа деревьев решений, а затем уменьшаться.

Глядя на этот график, мы можем найти наиболее оптимальное «k» деревьев решений.

Реализация

Давайте посмотрим на его реализацию.

Сначала мы тренируем наш случайный лес, как обычно:

e77787dee0694845fba702f9ef2a9168.jpg

Далее мы должны вычислить точность каждой модели дерева решений.

В sklearn доступ к отдельным деревьям можно получить с помощью атрибута model.estimators_.

6b7a6b0f54c2c2edeb434a44bec5c0be.jpg

Таким образом, мы перебираем все деревья и вычисляем их точность тестирования:

Compute the accuracy of all trees

Compute the accuracy of all trees

model_accs — это массив NumPy, который хранит идентификатор дерева и его точность тестирования:

>>> model_accs
array([[ 0.   ,  0.815], # [tree id, test accuracy]
       [ 1.   ,  0.77 ],
       [ 2.   ,  0.795],
          ...

Теперь мы должны переставить модели дерева решений в списке model.estimators_ в порядке убывания точности тестирования:

# sort on second column in reverse order to obtain sorting order
>>> sorted_indices = np.argsort(model_accs[:, 1])[::-1]

# obtain list of model ids according to sorted model accuracies
>>> model_ids = model_accs[sorted_indices][:,0].astype(int)
array([65, 97, 18, 24, 38, 11,...

Этот список сообщает нам, что 65-я индексированная модель является самой производительной, за ней следует 97-я индексированная и так далее …

Теперь давайте переставим модели деревьев в списке model.estimators_ в порядке model_ids:

# create numpy array, rearrange the models and convert back to list
model.estimators_ = np.array(model.estimators_)[model_ids].tolist()

Сделано!

Наконец, мы создаем сюжет, о котором говорилось ранее.

Это будет линейный график, отображающий точность случайного леса:

  • Рассматривая только первые два дерева принятия решений.

  • Рассматривая только первые три дерева принятия решений.

  • Рассматривая только первые четыре дерева принятия решений.

и так далее.

Ниже показан код для вычисления совокупной точности:

Create the cumulative accuracy plot

Create the cumulative accuracy plot

В приведенном выше коде:

Мы создаем копию базовой модели с именем small_model.

На каждой итерации мы устанавливаем деревья small_model на первые «k» деревьев базовой модели.

Наконец, мы оцениваем small_model только с помощью «k» деревьев.

Построив график совокупного результата точности, мы получим следующий график:

Cumulative accuracy score

Cumulative accuracy score

На графике видно, что максимальная точность теста достигается при рассмотрении только 10 деревьев, что означает десятикратное сокращение количества деревьев.

Сравнивая их точность и время выполнения, мы получаем:

242d567b3ae47c1673d1bbf4e2becc07.jpg

  • Мы получаем повышение точности на 3%.

  • время выполнения на предсказание в 6,5 раза быстрее.

Обратите внимание что:

  • Мы не проводили повторное обучение и подбор гиперпараметров

  • Отобрав наилучшие деревья мы сократили время на обучение

И это круто!

Вы можете скачать этот блокнот здесь: Jupyter Notebook.

На этом все! Спасибо за прочтение! Статья взята из источника Daily Dose of Data Science.

А какие есть еще решения? Пишите комментарии!

© Habrahabr.ru