Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Полное руководство по алгоритму случайного леса с Python и Scikit-Learn

Введение

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

Если вы не знакомы с ними – не беспокойтесь, мы рассмотрим все эти концепции.

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

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

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

Деревья решений

Как заполнить узлы дерева? Это где деревья решений попасть в фокус.

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

Ниже приведен пример описанного дерева:

На изображении дерева есть 7 квадратов, верхний из которых соответствует 100 женщинам, этот верхний квадрат соединен с двумя нижними квадратами, которые делят женщин на 78 небеременных и 22 беременных, и из обоих предыдущих квадратов получается четыре квадрата; два, соединенных с каждым квадратом выше, которые делят женщин в зависимости от их района, для небеременных, 45 живут в городской местности, 33 в сельской местности и для беременных, 14 живут в сельской местности и 8 в городской местности. Просто взглянув на дерево, легко понять эти подразделения и увидеть, как каждый «слой» происходит от предыдущих, эти слои и есть дерево. уровни, уровни описывают глубина дерева:

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Обратите внимание на изображение выше, что первый уровень дерева Уровень 0 где есть только один квадрат, за которым следует Уровень 1 где есть два квадрата и Уровень 2 где четыре квадрата. Это глубина 2 дерево.

На уровне 0 находится квадрат, из которого рождается дерево, первый из которых называется корневой узел, этот корень имеет два дочерние узлы на уровне 1, которые родительские узлы к четырем узлам на уровне 2. Обратите внимание, что «квадраты», которые мы упоминали до сих пор, на самом деле называются узлы; и что каждый предыдущий узел является родителем для следующих узлов, которые являются его дочерними элементами. Дочерние узлы каждого уровня, имеющие одного и того же родителя, называются братьев и сестер, как видно на следующем изображении:

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

На предыдущем изображении мы также отображаем уровень 1 как внутренние узлы, когда они находятся между корнем и последними узлами, которые являются листовые узлы. Узлы листьев — это последняя часть дерева. Если бы мы сказали из 100 первоначальных женщин, сколько из них беременны и живут в сельской местности, мы могли бы сделать это, взглянув на листья. Таким образом, число на листьях будет отвечать на первый исследовательский вопрос.

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

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

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

Примечание: В компьютерных науках существует несколько типов деревьев, таких как бинарные деревья, общие деревья, деревья AVL, расширенные деревья, красно-черные деревья, b-деревья и т. д. Здесь мы сосредоточимся на том, чтобы дать общее представление о том, что такое дерево решений. . Если это зависит от ответа Да or нет вопрос для каждого узла, и, таким образом, каждый узел имеет самое большее двое детей, при сортировке так, что «меньшие» узлы находятся слева, это классифицирует деревья решений как бинарные деревья.

В предыдущих примерах обратите внимание, как дерево может либо классифицировать новые данные в качестве участников или не участников, или вопросы также могут быть изменены на «сколько участников?», «сколько беременных?», «сколько проживает в сельской местности?», что приводит нас к поиску количество беременных участниц, проживающих в сельской местности.

Когда данные классифицированы, это означает, что дерево выполняет классификация задача, и когда количество данных найдено, дерево выполняет регресс задача. Это означает, что дерево решений можно использовать для обеих задач — классификации и регрессии.

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

Понимание случайных лесов

Что произойдет с решением, если какой-то участник проживает на границе городской и сельской местности? Будет ли дерево добавлять эту запись к сельской или городской? Кажется, трудно вписать эти данные в структуру, которая у нас есть в настоящее время, поскольку они довольно четкие.

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

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

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

Решение: Точно так же, как «две пары глаз видят лучше, чем одна», две модели обычно дают более точный ответ, чем одна. Принимая во внимание разнообразие представлений знаний (закодированных в древовидной структуре), жесткость слегка различающихся структур между несколькими похожими деревьями больше не является ограничивающей, поскольку недостатки одного дерева могут быть «компенсированы» другим. Объединив множество деревьям вместе мы получаем лес.

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

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

Ансамблевое обучение и модельные ансамбли

Этот метод известен как обучение ансамблю. При использовании ансамблевого обучения вы можете смешивать любые алгоритмы вместе, если вы можете гарантировать, что выходные данные могут быть проанализированы и объединены с другими выходными данными (либо вручную, либо с использованием существующих библиотек). Как правило, вы объединяете несколько моделей одного типа вместе, например, несколько деревьев решений, но вы не ограничены простым объединением ансамблей одного типа модели.

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

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

Учитывая широкое использование, такие библиотеки, как Scikit-Learn, реализовали оболочки для RandomForestRegressors и RandomForestClassifiers, построенные поверх их собственных реализаций дерева решений, чтобы позволить исследователям избежать создания собственных ансамблей.

Давайте погрузимся в случайные леса!

Как работает алгоритм случайного леса?

Ниже приведены основные шаги, выполняемые при выполнении алгоритма случайного леса:

  1. Выберите количество случайных записей, это может быть любое число, например 4, 20, 76, 150 или даже 2.000 из набора данных (называемое N записи). Число будет зависеть от ширины набора данных, чем шире, тем больше N может быть. Вот где случайный часть в названии алгоритма происходит от!
  2. Постройте дерево решений на основе этих N случайные записи;
  3. В соответствии с количеством деревьев, определенным для алгоритма, или количеством деревьев в лесу, повторите шаги 1 и 2. Это создаст больше деревьев из наборов случайных записей данных;
  4. После шага 3 следует последний шаг, который прогнозирует результаты:
    • В случае классификации: каждое дерево в лесу будет предсказывать категорию, к которой относится новая запись. После этого новый рекорд присваивается категории, набравшей большинство голосов.
    • В случае регрессии: каждое дерево в лесу предсказывает значение для новой записи, а окончательное значение предсказания будет рассчитываться путем получения среднего значения всех значений, предсказанных всеми деревьями в лесу.

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

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

Имея интуицию о том, как работают деревья, и понимание случайных лесов — остается только практиковаться в построении, обучении и настройке их на данных!

Создание и обучение моделей случайного леса с помощью Scikit-Learn

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

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

Затем собранные данные были организованы в файл с разделителями-запятыми (csv) и загружены в Репозиторий машинного обучения UCI.

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

Внимание: вы можете скачать набор данных здесь.

Использование случайного леса для классификации

Поскольку мы хотим знать, есть ли у женщины низкокачественными, средний or высокая риск смертности, это означает, что мы будем проводить классификацию с тремя классами. Когда задача имеет более двух классов, она называется мультикласс проблема, в отличие от двоичный проблема (где вы выбираете между двумя классами, обычно 0 и 1).

В этом первом примере мы реализуем мультиклассовую модель классификации с помощью классификатора Random Forest и Python Scikit-Learn.

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

Импорт библиотек

Мы будем использовать Pandas для чтения данных, Seaborn и Matplotlib для их визуализации и NumPy для отличных служебных методов:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
Импорт набора данных

Следующий код импортирует набор данных и загружает его в Python. DataFrame:

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")

Чтобы просмотреть первые пять строк данных, мы выполняем head() команда:

dataset.head()

Это выводит:

    Age SystolicBP  DiastolicBP BS      BodyTemp    HeartRate   RiskLevel
0   25  130         80          15.0    98.0        86          high risk
1   35  140         90          13.0    98.0        70          high risk
2   29  90          70          8.0     100.0       80          high risk
3   30  140         85          7.0     98.0        70          high risk
4   35  120         60          6.1     98.0        76          low risk

Здесь мы можем увидеть все атрибуты, собранные в ходе исследования.

  • Возраст: возраст в годах.
  • Систолическое АД: верхнее значение артериального давления в мм рт. ст., важный атрибут во время беременности.
  • Диастолическое АД: более низкое значение артериального давления в мм рт. ст., еще один важный атрибут во время беременности.
  • БС: уровень глюкозы в крови в пересчете на молярную концентрацию, ммоль/л.
  • HeartRate: частота сердечных сокращений в состоянии покоя в ударах в минуту.
  • RiskLevel: уровень риска во время беременности.
  • BodyTemp: температура тела.

Теперь, когда мы больше понимаем, что измеряется, мы можем рассмотреть типы данных с info():

dataset.info()

Это приводит к:


RangeIndex: 1014 entries, 0 to 1013
Data columns (total 7 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   Age          1014 non-null   int64  
 1   SystolicBP   1014 non-null   int64  
 2   DiastolicBP  1014 non-null   int64  
 3   BS           1014 non-null   float64
 4   BodyTemp     1014 non-null   float64
 5   HeartRate    1014 non-null   int64  
 6   RiskLevel    1014 non-null   object 
dtypes: float64(2), int64(4), object(1)
memory usage: 55.6+ KB

Глядя на RangeIndex строки мы видим, что записей 1014, а столбец Non-Null Count сообщает, что в данных нет пропущенных значений. Это означает, что нам не нужно будет обрабатывать отсутствующие данные!

В Dtype столбец, мы можем видеть тип каждой переменной. В настоящее время, float64 столбцы такие BS и BodyTemp имеют числовые значения, которые могут варьироваться в любом диапазоне, например 15.0, 15.51, 15.76, 17.28, что делает их численно непрерывный (вы всегда можете добавить 0 к числу с плавающей запятой, бесконечно). С другой стороны, такие переменные, как Age, SystolicBP, DiastolicBPи HeartRate относятся к типу int64, это означает, что числа меняются только на единицу, например 11, 12, 13, 14 — у нас не будет ЧСС 77.78, это либо 77, либо 78 — это те численно дискретный ценности. И у нас также есть RiskLevel с object тип, это обычно указывает на то, что переменная является текстом, и нам, вероятно, потребуется преобразовать его в число. Поскольку уровень риска растет от низкого к высокому, в категориях подразумевается порядок, это указывает на то, что это категорически порядковый Переменная.

Внимание: важно смотреть на тип каждых данных и видеть, имеют ли они смысл в соответствии с контекстом. Например, нет смысла иметь половину единицы частоты сердечных сокращений, поэтому это означает, что целочисленный тип подходит для дискретного значения. Если этого не происходит, вы можете изменить тип данных с помощью Pandas. astype() имущество – df['column_name'].astype('type').

Посмотрев на типы данных, мы можем использовать describe() чтобы взять пик в некоторых описательных статистических данных, таких как средние значения каждого столбца, стандартное отклонение, квантили, минимальные и максимальные значения данных:

dataset.describe().T 

Приведенный выше код отображает:

            count   mean        std         min     25%     50%     75%     max
Age         1014.0  29.871795   13.474386   10.0    19.0    26.0    39.0    70.0
SystolicBP  1014.0  113.198225  18.403913   70.0    100.0   120.0   120.0   160.0
DiastolicBP 1014.0  76.460552   13.885796   49.0    65.0    80.0    90.0    100.0
BS          1014.0  8.725986    3.293532    6.0     6.9     7.5     8.0     19.0
BodyTemp    1014.0  98.665089   1.371384    98.0    98.0    98.0    98.0    103.0
HeartRate   1014.0  74.301775   8.088702    7.0     70.0    76.0    80.0    90.0
RiskLevel   1014.0  0.867850    0.807353    0.0     0.0     1.0     2.0     2.0

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

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

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

Визуализация данных

Перед преобразованием RiskLevel, давайте также быстро визуализируем данные, рассмотрев комбинации точек для каждой пары объектов с помощью диаграммы рассеяния и распределения точек, визуализировав кривую гистограммы. Для этого мы будем использовать Seaborn pairplot() который объединяет оба сюжета. Он генерирует оба графика для каждой комбинации признаков и отображает точки, закодированные цветом в соответствии с их уровнем риска с помощью hue имущество:

g = sns.pairplot(dataset, hue='RiskLevel')
g.fig.suptitle("Scatterplot and histogram of pairs of variables color coded by risk level", 
               fontsize = 14, 
               y=1.05); 

Приведенный выше код генерирует:

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

Выполнив базовый исследовательский анализ данных, мы можем предварительно обработать данные. RiskLevel колонка.

Предварительная обработка данных для классификации

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

dataset['RiskLevel'].unique()

Это выводит:

array(['high risk', 'low risk', 'mid risk'], dtype=object)

Классы проверены, теперь следующий шаг — преобразовать каждое значение в число. Поскольку существует порядок между классификациями, мы можем использовать значения 0, 1 и 2 для обозначения низкокачественными, средний и высокая риски. Существует много способов изменить значения столбцов, следуя правилам Python. простое лучше сложного девиз, мы будем использовать .replace() метод и просто замените их их целочисленными представлениями:

dataset['RiskLevel'] = dataset['RiskLevel'].replace('low risk', 0).replace('mid risk', 1).replace('high risk', 2)

После замены значений мы можем разделить данные на то, что будет использоваться для обучения модели, на функции or X, и то, что мы хотим предсказать, этикетки or y:

y = dataset['RiskLevel']
X = dataset.drop(['RiskLevel'], axis=1)

Как только появится строка X и y наборы готовы, мы можем использовать Scikit-Learn's train_test_split() метод для дальнейшего разделения их на обучающие и тестовые наборы:

from sklearn.model_selection import train_test_split

SEED = 42
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)

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

Здесь мы используем 20% данных для тестирования и 80% для обучения.

Обучение RandomForestClassifier

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!

Scikit-Learn реализовал ансамбли под sklearn.ensemble модуль. Ансамбль деревьев решений, используемый для классификации, в котором принимается большинство голосов, реализуется как RandomForestClassifier.

Имея обучающий и тестовый наборы, мы можем импортировать RandomForestClassifier класс и создайте модель. Для начала создадим лес из трех деревьев, установив n_estimators параметр как 3, и с каждым деревом, имеющим три уровня, установив max_depthк 2:

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=3, 
                             max_depth=2,
                             random_state=SEED)

Примечание: Значение по умолчанию для n_estimators is 100. Это повышает прогностическую силу и обобщение ансамбля, но мы создаем меньший ансамбль, чтобы его было легче визуализировать и проверять. Всего 3 дерева — мы можем их визуализировать и осмотреть вручную для дальнейшего развития нашей интуиции как отдельных деревьев, так и их взаимозависимости. То же самое относится к max_depth, Которая является None, что означает, что деревья могут становиться все глубже и глубже, чтобы соответствовать данным по мере необходимости.

Чтобы подогнать модель под данные, мы называем fit() метод, вставляя в тренировочные функции и метки:


rfc.fit(X_train, y_train)

y_pred = rfc.predict(X_test)

Теперь мы можем сравнить предсказанные метки с реальными метками, чтобы оценить, насколько хороша модель! Прежде чем оценить модель, давайте заглянем в ансамбль.

Чтобы немного глубже изучить модель, мы можем визуализировать каждое из деревьев и то, как они делят данные. Это можно сделать с помощью tree модуль, встроенный в Scikit-Learn, а затем перебирает каждую из оценок в ансамбле:


from sklearn import tree

features = X.columns.values 
classes = ['0', '1', '2'] 



for estimator in rfc.estimators_:
    print(estimator)
    plt.figure(figsize=(12,6))
    tree.plot_tree(estimator,
                   feature_names=features,
                   class_names=classes,
                   fontsize=8, 
                   filled=True, 
                   rounded=True)
    plt.show()

Приведенный выше код отображает древовидные графики:

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.
Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.
Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Обратите внимание, как различаются три дерева. Первый начинается с BS особенность, вторая с DiastolicBP, а третий с BS опять таки. Хотя третий смотрит на другое количество семплов. На правой ветви первые два дерева также принимают решение об использовании Age на уровне листа, а третье дерево заканчивается BS особенность. Всего с тремя оценщиками становится ясно, как масштабирование дает богатое и разнообразное представление знаний, которые можно успешно объединить в высокоточную модель.

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

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

Оценка RandomForestClassifier

Scikit-Learn упрощает создание базовых показателей, предоставляя DummyClassifier, который выводит прогнозы без использования входных функций (полностью случайные выходы). Если ваша модель лучше, чем DummyClassifier, некоторые обучение происходит! Чтобы максимизировать обучение — вы можете автоматически тестировать различные гиперпараметры, используя RandomizedSearchCV or GridSearchCV. Помимо базового уровня, вы можете оценить производительность своей модели с точки зрения нескольких показателей.

Некоторыми традиционными показателями классификации, которые можно использовать для оценки алгоритма, являются точность, полнота, оценка f1, точность и матрица путаницы. Вот краткое объяснение каждого из них:

  1. Точность: когда наша цель состоит в том, чтобы понять, какие правильные значения прогноза были сочтены правильными нашим классификатором. Точность разделит эти истинные положительные значения на выборки, которые были предсказаны как положительные;

$$
точность = дробь{текст{истинные срабатывания}}{текст{истинные срабатывания} + текст{ложные срабатывания}}
$$

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

$$
отзыв = frac{текст{истинно положительные}}{текст{истинно положительные} + текст{ложноотрицательные}}
$$

  1. Счет F1: является сбалансированным или среднее гармоническое точности и отзыва. Наименьшее значение равно 0, а максимальное — 1. Когда f1-score равно 1, это означает, что все классы были предсказаны правильно — это очень сложно получить с реальными данными (почти всегда существуют исключения).

$$
текст{f1-оценка} = 2* дробь{текст{точность} * текст{отзыв}}{текст{точность} + текст{отзыв}}
$$

  1. Матрица путаницы: когда нам нужно знать, сколько образцов мы получили правильно или неправильно для каждый класс. Значения, которые были правильными и правильно предсказанными, называются настоящие позитивы, те, которые были предсказаны как положительные, но не были положительными, называются ложные срабатывания. Та же самая номенклатура настоящие негативы и ложные негативы используется для отрицательных значений;

  2. точность: описывает, сколько прогнозов наш классификатор дал правильно. Наименьшее значение точности равно 0, а максимальное — 1. Это значение обычно умножается на 100, чтобы получить процентное соотношение:

$$
точность = frac{текст{количество правильных прогнозов}}{текст{общее количество прогнозов}}
$$

Примечание: Практически невозможно получить 100% точность любых реальных данных, к которым вы хотите применить машинное обучение. Если вы видите классификатор со 100-процентной точностью или даже почти 100-процентный результат — отнеситесь скептически и проведите оценку. Распространенной причиной этих проблем является утечка данных (прямая или косвенная утечка части обучающего теста в тестовый набор). Нет единого мнения о том, что такое «хорошая точность», прежде всего потому, что она зависит от ваших данных — иногда точность 70% будет высокой! Иногда это будет очень низкая точность. Вообще говоря, более 70% достаточно для многих моделей, но это должен определить исследователь предметной области.

Вы можете выполнить следующий скрипт, чтобы импортировать необходимые библиотеки и посмотреть на результаты:

from sklearn.metrics import classification_report, confusion_matrix

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk)')

print(classification_report(y_test,y_pred))

Результат будет выглядеть примерно так:

                precision    recall  f1-score   support

           0       0.53      0.89      0.66        80
           1       0.57      0.17      0.26        76
           2       0.74      0.72      0.73        47

    accuracy                           0.58       203
   macro avg       0.61      0.59      0.55       203
weighted avg       0.59      0.58      0.53       203

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

В отчете о классификации обратите внимание, что полнота высокая, 0.89 для класса 0, и точность, и полнота высоки для класса 2, 0.74, 0.72, а для класса 1 они низкие, особенно полнота 0.17 и точность 0.57. . Отношения между отзывом и точностью для всех трех классов в отдельности отражены в F1 оценка, которая является гармоническим средним между отзывом и точностью — модель делает хорошо для класса 0, довольно плохо для класса 1 и неплохо для класса 2.

Модель очень тяжело идентифицирует случаи среднего риска.

Точность, достигнутая нашим классификатором случайного леса всего с 3 деревьями, составляет 0.58 (58%) — это означает, что чуть более половины результатов правильные. Это низкая точность, и, возможно, ее можно улучшить, добавив больше деревьев.

Глядя на матрицу путаницы, мы видим, что большинство ошибок происходит при классификации 52 записей среднего риска как низкого риска, что дает дополнительное понимание низкой полноты класса 1. Он смещен в сторону классификации пациентов среднего риска как низкого риска. пациентов риска.

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

Чтобы убедиться в этом, мы можем получить доступ к feature_importances_ свойство классификатора. Это даст нам список процентов, так что мы также можем получить доступ к feature_names_in_ свойство, чтобы получить имя каждой функции, упорядочить их в фрейме данных, отсортировать их от самого высокого к самому низкому и вывести результат на график:


features_df = pd.DataFrame({'features': rfc.feature_names_in_, 'importances': rfc.feature_importances_ })


features_df_sorted = features_df.sort_values(by='importances', ascending=False)


g = sns.barplot(data=features_df_sorted, x='importances', y ='features', palette="rocket")
sns.despine(bottom = True, left = True)
g.set_title('Feature importances')
g.set(xlabel=None)
g.set(ylabel=None)
g.set(xticks=[])
for value in g.containers:
    g.bar_label(value, padding=2)

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

Наконец пришло время сгенерировать новую модель с большим количеством деревьев, чтобы посмотреть, как это повлияет на результаты. Давайте создадим rfc_ лес с 900 деревьями, 8 уровней и одинаковым семенем. Улучшится ли результат?

rfc_ = RandomForestClassifier(n_estimators=900, 
                             max_depth=7,
                             random_state=SEED)
rfc_.fit(X_train, y_train)
y_pred = rfc_.predict(X_test)

Расчет и отображение метрик:

cm_ = confusion_matrix(y_test, y_pred)
sns.heatmap(cm_, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk) for 900 trees with 8 levels')

print(classification_report(y_test,y_pred))

Это выводит:

                precision    recall  f1-score   support

           0       0.68      0.86      0.76        80
           1       0.75      0.58      0.65        76
           2       0.90      0.81      0.85        47

    accuracy                           0.74       203
   macro avg       0.78      0.75      0.75       203
weighted avg       0.76      0.74      0.74       203

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

Это показывает, как добавление большего количества деревьев и более специализированных деревьев (более высоких уровней) улучшило наши показатели. У нас по-прежнему низкий отзыв для класса 1, но точность теперь составляет 74%. Показатель F1 при классификации случаев высокого риска составляет 0.85, что означает, что случаи высокого риска теперь легче идентифицировать по сравнению с 0.73 в предыдущей модели!

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

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

Использование случайных лесов для регрессии

В этом разделе мы изучим, как можно использовать алгоритм Random Forest для решения задач регрессии с помощью Scikit-Learn. Шаги, выполняемые для реализации этого алгоритма, почти идентичны шагам, выполняемым для классификации, за исключением типа модели и типа прогнозируемых данных — которые теперь будут непрерывными значениями — есть только одно отличие в подготовке данных.

Поскольку регрессия выполняется для числовые значения – давайте выберем числовое значение из набора данных. Мы видели, что уровень сахара в крови был важен в классификации, поэтому он должен быть предсказуем на основе других признаков (поскольку, если он коррелирует с каким-то признаком, этот признак также коррелирует с ним).

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

Импорт библиотек и данных
import pandas as pd
import numpy as np
import maplotlib.pyplot as plt
import seaborn as sns

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")
Предварительная обработка данных для регрессии

Это задача регрессии, поэтому вместо предсказания классов мы можем предсказать один из числовых столбцов набора данных. В этом примере BS столбец будет прогнозироваться. Это означает y данные будут содержать данные о сахаре в кровии X данные будут содержать все функции, кроме уровня сахара в крови. После отделения X и y данные, мы можем разделить обучающий и тестовый наборы:

from sklearn.model_selection import train_test_split

SEED = 42

y = dataset['BS']
X = dataset.drop(['BS'], axis=1) 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)
Обучение RandomForestRegressor

Теперь, когда мы масштабировали наш набор данных, пришло время обучить наш алгоритм решению этой проблемы регрессии, немного изменить его — мы создадим модель с 20 деревьями в лесу, каждое из которых имеет 4 уровня. Для этого вы можете выполнить следующий код:

from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(n_estimators=20, 
                            max_depth=3, 
                            random_state=SEED)

rfr.fit(X_train, y_train)
y_pred = rfr.predict(X_test)

Вы можете найти подробную информацию обо всех параметрах RandomForestRegressor в официальной документации.

Поскольку построение и просмотр 20 деревьев потребует некоторого времени и самоотверженности, мы можем построить только первое, чтобы посмотреть, чем оно отличается от дерева классификации:

from sklearn import tree

features = X.columns

first_tree = rfr.estimators_[0]

plt.figure(figsize=(15,6))
tree.plot_tree(first_tree,
               feature_names=features,
               fontsize=8, 
               filled=True, 
               rounded=True);

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

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

Оценка RandomForestRegressor

Для задач регрессии метриками, используемыми для оценки алгоритма, являются средняя абсолютная ошибка (MAE), среднеквадратическая ошибка (MSE) и среднеквадратическая ошибка (RMSE).

  1. Средняя абсолютная ошибка (MAE): когда мы вычитаем прогнозируемые значения из фактических значений, получаем ошибки, суммируем абсолютные значения этих ошибок и получаем их среднее значение. Эта метрика дает представление об общей ошибке для каждого прогноза модели, чем меньше (ближе к 0), тем лучше.

$$
mae = (frac{1}{n})sum_{i=1}^{n}left | Фактический – Прогнозируемый |
$$

Примечание: Вы также можете столкнуться с y и ŷ обозначения в уравнениях. y относится к фактическим значениям и ŷ к прогнозируемым значениям.

  1. Среднеквадратичная ошибка (MSE): похож на показатель MAE, но возводит в квадрат абсолютные значения ошибок. Кроме того, как и в случае с MAE, чем меньше или ближе к 0, тем лучше. Значение MSE возведено в квадрат, чтобы сделать большие ошибки еще больше. Одна вещь, на которую следует обратить пристальное внимание, это то, что обычно эту метрику трудно интерпретировать из-за размера ее значений и того факта, что они не находятся в одном и том же масштабе данных.

$$
mse = sum_{i=1}^{D}(фактическое - прогнозируемое)^2
$$

  1. Среднеквадратичная ошибка (RMSE): пытается решить проблему интерпретации, возникающую с MSE, путем получения квадратного корня из его конечного значения, чтобы масштабировать его обратно к тем же единицам данных. Это легче интерпретировать и хорошо, когда нам нужно отобразить или показать фактическое значение данных с ошибкой. Он показывает, насколько данные могут различаться, поэтому, если у нас есть среднеквадратичное отклонение 4.35, наша модель может допустить ошибку либо из-за того, что она добавила 4.35 к фактическому значению, либо из-за того, что для получения фактического значения требовалось 4.35. Чем ближе к 0, тем лучше.

$$
rmse = sqrt{sum_{i=1}^{D}(фактическое - прогнозируемое)^2}
$$

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

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

Вы можете использовать следующий код, чтобы найти эти значения:

from sklearn.metrics import mean_absolute_error, mean_squared_error

print('Mean Absolute Error:', mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(mean_squared_error(y_test, y_pred)))

Результат должен быть:

Mean Absolute Error: 1.127893702896059
Mean Squared Error: 3.0802988503933326
Root Mean Squared Error: 1.755078018320933

С 20 деревьями среднеквадратическая ошибка составляет 1.75, что мало, но даже в этом случае — увеличив количество деревьев и поэкспериментировав с другими параметрами, эта ошибка, вероятно, может стать еще меньше.

Преимущества использования случайного леса

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

  1. Алгоритм случайного леса не предвзят, поскольку существует несколько деревьев, и каждое дерево обучается на случайном подмножестве данных. По сути, алгоритм случайного леса опирается на силу «толпы»; поэтому общая степень смещения алгоритма снижается.
  2. Этот алгоритм очень стабилен. Даже если в набор данных вводится новая точка данных, общий алгоритм не сильно пострадает, поскольку новые данные могут повлиять на одно дерево, но им очень сложно повлиять на все деревья.
  3. Алгоритм случайного леса хорошо работает, когда у вас есть как категориальные, так и числовые признаки.
  4. Алгоритм случайного леса также хорошо работает, когда в данных отсутствуют значения или они не были масштабированы.

Недостатки использования случайного леса

  1. Главный недостаток случайных лесов заключается в их сложности. Они требуют гораздо больше вычислительных ресурсов из-за большого количества деревьев решений, объединенных вместе, при обучении больших ансамблей. Хотя на современном оборудовании обучение даже большого случайного леса не занимает много времени.

Двигаемся дальше — ручной комплексный проект

Ваша любознательная натура заставляет вас идти дальше? Рекомендуем ознакомиться с нашим Управляемый проект: «Практическое прогнозирование цен на жилье — машинное обучение на Python».

Полное руководство по алгоритму случайного леса с использованием Python и Scikit-Learn PlatoBlockchain Data Intelligence. Вертикальный поиск. Ай.

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

С помощью Keras, API глубокого обучения, построенного на основе Tensorflow, мы будем экспериментировать с архитектурами, создавать набор многоуровневых моделей и обучать мета-ученик нейронная сеть (модель уровня 1), чтобы выяснить цену дома.

Глубокое обучение удивительно, но прежде чем прибегать к нему, рекомендуется также попытаться решить проблему с помощью более простых методов, таких как поверхностное обучение алгоритмы. Наша базовая производительность будет основываться на Случайная лесная регрессия алгоритм. Кроме того, мы рассмотрим создание ансамблей моделей с помощью Scikit-Learn с помощью таких методов, как мешковина и голосование.

Это сквозной проект, и, как и все проекты машинного обучения, мы начнем с — с Исследовательский анализ данных, с последующим Предварительная обработка данных и, наконец, Мелководье и Модели глубокого обучения чтобы соответствовать данным, которые мы исследовали и очистили ранее.

Отметка времени:

Больше от Стекабьюс