Дерево решений, деревья в мешках, случайные леса, дополнительные рандомизированные деревья (ExtraTrees), поиск по сетке, настройка гиперпараметров, начальная загрузка, важность признаков, кривые ROC

Эта статья является частью серии книг Наука о данных с нуля — Могу ли я, чтобы я смог. (Нажмите здесь, чтобы получить копию сегодня!)

Нажмите здесь, чтобы просмотреть предыдущую статью/лекцию на тему «A39: Дерево решений и случайные леса — теория»

💐Нажмите здесь, чтобы ПОДПИСАТЬСЯ на меня, чтобы получать новые материалы💐

⚠️ В этом проекте мы будем использовать набор данных рака молочной железы.

✅ Предложение: Откройте новый блокнот Jupyter и введите код, читая эту статью, это обучение, и да, «ПОЖАЛУЙСТА, прочитайте комментарий, он очень полезен…..!»

🧘🏻‍♂️ 👉🎯 ›› Сохраняйте спокойствие и сосредоточенность! ›› 🧘🏻‍♂️ 👉🎯

С возвращением, ребята, пришло время учиться на практике.

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

1. Набор данных

2. Исследовательский анализ данных
›› Попробуйте сами

3. Раздел машинного обучения
››3.1) Единое дерево решений
››3.2) Пакетированные деревья решений
››3.3) Случайные леса
››3.4) (НЕОБЯЗАТЕЛЬНО) Чрезвычайно рандомизированный деревья (ExtraTrees)

4. Важность функции
››4.1) Важность функции — единое дерево решений
››4.2) Важность функции — деревья в пакетах
››4.3) Важность функции — Random Forests
›› 4.4) Сравнение важности функций
››4.5) Чтения и задачи

5. Гиперпараметры и их настройка
››5.1) Рандомизированный поиск
››››5.1.1) Несколько лучших моделей после настройки параметров
››››5.1.2) Сохранение лучших параметры
››5.2) Поиск по сетке и лучшая модель

6. ROC-кривая

7. Игра с отсечкой вероятности

8. Сохранение итоговой модели

1. Набор данных

Набор данных о сердечных заболеваниях — данные Кливленда

Давайте продолжим и поработаем с другим известным набором данных Болезни сердца в Кливленде. Этот исходный и полный набор данных является частью Репозитория машинного обучения UCI и содержит 4 базы данных: Кливленд, Венгрия, Швейцария и Лонг-Бич, штат Вирджиния. Этот набор данных был подарен в 1988 году для публики. Исходная база данных содержит 76 атрибутов, но все опубликованные эксперименты исследователей машинного обучения относятся к использованию подмножества из 14 из них.

В частности, база данных Кливленда — единственная, широко используемая исследователями машинного обучения. В исходной базе данных поле "goal" указывает на наличие болезни сердца у пациента. Это целочисленное значение от 0 (отсутствие присутствия) до 4. Эксперименты с базой данных Кливленда были сосредоточены на простой попытке отличить присутствие (значения 1, 2, 3, 4) от отсутствия (значение 0).

*******************************************************************

Информация о 14 атрибуте, который мы собираемся использовать, представлена ​​ниже:

👉 возраст — годы
👉 пол — (1 = мужчина; 0 = женщина)
👉 cp — боль в груди тип (1: typical angina, 2: atypical angina, 3: non-anginal, pain 4: asymptomatic)
👉 trestbps — артериальное давление в покое
👉 хол — холестерин сыворотки в мг/дл
👉 fbs — уровень сахара в крови натощак › 120 мг/дл) (1 = правда; 0 = ложь)
👉 рестекг — результаты ЭКГ (электрокардиографии) в покое
👉 талах — максимальная частота сердечных сокращений, достигнутая в ударах в минуту (уд/мин)
👉 экзанг — стенокардия, вызванная физической нагрузкой (1 = да; 0 = нет)
👉 oldpeak — депрессия ST, вызванная нагрузкой, по сравнению с состоянием покоя
👉 наклон — наклон пикового сегмента ST при нагрузке (1: up-sloping, 2: flat, 3: down-sloping)
👉 ca — количество крупных сосудов (0-3), окрашенных при рентгеноскопии
👉 thal3 = normal; 6 = fixed defect; 7 = reversible defect
Thal представляет собой 𝛽-талассемию, наследственное нарушение гемоглобина, приводящее к хронической гемолитической анемии который обычно требует жизни — длительная трансфузионная терапия
🎯 прогнозируемый атрибут (0, 1, 2, 3 4) — в обработанном наборе данных этот добавляется как новый столбец target с N для 0и Y для 1,2,3 и 4.

*******************************************************************

Давайте импортируем необходимые библиотеки и читаем данные в кадре данных!

Импорт необходимых библиотек.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
sns.set(font_scale=1.3) # setting font size for the whole notebook
sns.set_style(“white”) # setting the style
#Retina display to see better quality images.
%config InlineBackend.figure_format = ‘retina’
# Lines below are just to ignore warnings
import warnings
warnings.filterwarnings(‘ignore’)

Чтение файла данных в кадре данных "df"

url=”https://raw.githubusercontent.com/junaidqazi/DataSets_Practice_ScienceAcademy/master/HD_Cleveland_Data_Clean.csv"
df = pd.read_csv(url)

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

# Try yourself and see how the data look like!
#df.head(2)
#df.info()

Вспомните describe(), он вернет статистическую сводку, и мы сможем подумать о распределениях в функциях, от максимума, минимума, стандарта и т. д.!

Давайте посмотрим на статистическую сводку для некоторых выбранных столбцов.

# Try yourself and understand your data, it is important!
#df.describe()[[‘age’,’trestbps’,’thalach’,’oldpeak’]]

*******************************************************************

2. Исследовательский анализ данных

Мы получим только несколько участков, вы должны хорошо понимать свои данные!

Какова базовая точность?

Вы заметили, у большинства мужчин диагностировано заболевание сердца!

Из приведенного выше графика видно, что в большинстве случаев thal (𝛽-талассемия) была нормальной.

Теперь мы можем захотеть изучить, как возраст связан с холестерином, хол. Вспомните Seaborn, мы можем попробовать совместный сюжет ()!

Из приведенного выше jointplot мы можем видеть некоторые тенденции в повышении уровня холестерина с возрастом.

Что касается возраста и талаха (достигнутой максимальной частоты сердечных сокращений), давайте попробуем другой совместный график!

Есть ли связь между максимальной частотой сердечных сокращений и возрастом? Уменьшается ли значение с возрастом?…..и множество других вопросов, которые необходимо изучить в EDA (To do).

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

**************************************************************************************************************************************

Напомню из раздела Seaborn, JointGrid — полезный модуль для изменения типа графиков в совместном графике.

Полезно знать: совместный график — это модуль уровня фигуры, однако мы можем объединить два из них stakeoverflow link, используя seabornfig2grid.py. Попробуйте код ниже, вам может понадобиться скачать seabornfig2grig.py и импортировать для этой цели.

**************************************************************************************************************************************

🧘🏻‍♂️››Попробуй себя‹‹🧘🏻‍♂️

Вспомните лекцию dummy variables. Возможно, вы захотите узнать, есть ли в ваших данных какая-либо переменная qualitative/categorical, которая равна ordinal (например, масштаб 0/poor, 1/fair, 2/good, 3/excellent).

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

Подсказка. Посмотрите на эту переменную, cp, restecg, slop, ca, thal, что вы думаете?

#Try yourself
#df.cp.value_counts()
#df.restecg.value_counts()
#df.slop.value_counts()
#df.ca.value_counts()
#df.thal.value_counts()

*******************************************************************

3. Раздел машинного обучения

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

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

3.1: Единое дерево решений

Мы начнем с обучения единого дерева решений!

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

#Creating instance “dtree” of the classifier 
dtree = DecisionTreeClassifier(criterion=’entropy’)

подгоняя экземпляр дерева к обучающим данным, параметры по умолчанию на данный момент в порядке!

Обратите внимание, мы оставляем все по умолчанию, кроме критерия. Мы вернемся к этому через некоторое время.

🧘🏻‍♂️››Прогноз и оценка‹‹🧘🏻‍♂️

Оценка важна, чтобы увидеть, как работает модель!

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

3.2: Деревья решений в пакетах

Мы узнали о бэггинге (агрегация Bootstrap) как о процедуре общего назначения для уменьшения высокой дисперсии. Таким образом, если мы решим использовать деревья решений в пакетах, ожидается, что они продемонстрируют лучшую производительность по сравнению с одним деревом решений, однако они по-прежнему сильно коррелируют в своих прогнозах друг с другом из-за своей структуры. сходства. Что ж, Random Forests всегда предпочтительнее и рекомендуется, чем одиночные деревья и даже деревья в мешках.

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

==>(Scikit-learn поставляется с модулем BaggingClassifier, который реализует процедуру мешков. Более подробная информация представлена ​​здесь. Классификатором по умолчанию в этом модуле является дерево решений, однако мы можем использовать другие алгоритмы, такие как хорошо.

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

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

Что ж, всегда приятно видеть название столбца вместо его порядкового номера. Для этого мы можем написать небольшой фрагмент кода!

Если мы посмотрим на имена столбцов, то увидим, что их имена повторяются (как bootstrap_features=True) в каждом дереве, начальная загрузка -- подвыборка с заменой. Мы также прошли bootstrap=True, наблюдения (точки данных) также будут повторно выбраны с заменой (дублированы!).

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

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

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

При этом Random Forest всегда предпочтительнее одиночных деревьев и деревьев в мешках, давайте работать с ними!

3.3: Случайные леса

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

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

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

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

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

Теперь возникает вопрос, насколько большим должно быть подмножество функций?

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

  • sqrt(𝑝)(округлено в меньшую сторону) признаков в каждом разделении для классификационной задачи.
  • 𝑝/3 (округлено в меньшую сторону) с минимальным размером узла 5 по умолчанию для проблемы регрессии.

==>Чем меньше объектов в выборке, тем выше эффект декорреляции.

Давайте попробуем модель случайных лесов на тех же данных и сравним наши результаты с моделью дерева решений. Random Forests находится в классе ансамбля в sklearn.

Мы можем установить n_estimators = 100 (количество деревьев в нашем лесу), как и для деревьев в мешках, и обучить модель на тех же данных.

==> Вы всегда можете попробовать разные n_estimators.

👉 Очень важное примечание к number of estimators/trees:

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

Примечание. Перейдите по этой ссылке, если хотите узнать больше о параметре в RandomForestClassifier. n_estimatores — тот, который мы часто используем.

Производительность Random Forest лучше, чем у одного дерева решений в пакетах. Точность, отзыв и оценка f1, все они улучшены, и меньшее количество точек данных неправильно помечено.

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

3.4: (НЕОБЯЗАТЕЛЬНО) Чрезвычайно рандомизированные деревья (ExtraTrees)

Двигаясь вперед, было бы неплохо узнать немного о чрезвычайно рандомизированных деревьях. Это еще один ансамблевый метод на основе деревьев для задач классификации и регрессии с учителем, который был представлен Пьером Гертсом, Дэмиеном Эрнстом и Луи Вехенкелем в их статье 2006 года Чрезвычайно рандомизированные деревья. Алгоритм выращивания Чрезвычайно рандомизированных деревьев аналогичен Случайным деревьям/лесу, но есть два отличия:

  • Чрезвычайно рандомизированные деревья не применяют процедуру мешков для создания набора обучающих выборок для каждого дерева. Один и тот же входной обучающий набор используется для обучения всех деревьев. ==> Примечание. При желании мы можем добавить слой упаковки!
  • Чрезвычайно рандомизированные деревья выбирают разбиение узла очень экстремально (и индекс переменной, и значение разбиения переменной выбираются случайным образом), тогда как случайный лес находит наилучшее разбиение (оптимальное по индексу переменной и значению разбиения переменной) среди случайного подмножества переменных.

==> Добавление еще одного шага рандомизации (и, следовательно, декорреляции) приводит к чрезвычайно рандомизированным деревьям или ExtraTrees. Их можно обучить, используя бэггинг (выборка наблюдений) и метод случайных подпространств (выборка признаков), а также дополнительный уровень случайности.

Вместо вычисления локально оптимальной комбинации признак/разделение (на основе, например, прироста информации или примеси Джини) для каждого рассматриваемого признака для разделения выбирается случайное значение. Это значение выбирается из эмпирического диапазона функции. ==>Это еще больше снижает дисперсию, но приводит к увеличению систематической ошибки. Если вы рассматриваете возможность использования ExtraTrees, вы можете подумать, что это гиперпараметр, который вы можете настроить.

scikit-learn предоставляет удобный способ реализации чрезвычайно рандомизированных деревьев с помощью своего модуля ExtraTreesClassifier. Этот класс реализует мета-оценщик (оценщик, который принимает другой оценщик в качестве параметра, например, GridSearchCV), который соответствует ряду рандомизированных деревьев решений (также называемых дополнительными деревьями) для различных подвыборок набора данных. и использует усреднение для повышения точности прогнозирования и управления подгонкой. - bootstrap=False по умолчанию

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

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

*******************************************************************

4. Важность функции

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

4.1: Важность функции — единое дерево решений

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

Хотите узнать больше, нажмите здесь, пожалуйста

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

Написание функции feature_plot для указанной цели. Изучите код самостоятельно и разберитесь построчно.

4.2: Важность функции — деревья в мешках

Давайте вычислим важность признаков для деревьев в мешках (средняя важность). Вот как этот процесс реализован под капотом и для случайных лесов!

4.3: Важность функции — случайные леса

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

Что ж, вместо того, чтобы получать три вышеупомянутых отдельных графика, мы можем получить все-в-одном для прямого сравнения! Мы также можем добавить важность функции из ExtraTrees на наш график!

4.4: Сравнение важности функций

(НЕОБЯЗАТЕЛЬНО) — Давайте создадим фрейм данных с важностью функций из наших обученных моделей D-Tree, B-Tree, R-Forests и E-Trees. Мы можем получить гистограмму для сравнения и обсуждения.

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

4.5: Чтения и дела

Понять, как рассчитывается важность функции

Дополнительное чтение о важности функций в свободное время!

To do:

  • Что вы узнали из приведенных выше графиков важности признаков? Видите ли вы какие-либо изменения (декорреляцию) в функциях случайных лесов?
  • В дереве решений мы использовали entropy, переобучите свою модель, используя gini (по умолчанию). В Random Forests мы использовали gini (по умолчанию), переобучите свою модель, используя entropy. Вы видите разницу?

*******************************************************************

5. Гиперпараметры и их настройка

🧘🏻‍♂️Поиск лучшей модели/оценщика/классификатора!🧘🏻‍♂️

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

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

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

Scikit-learn предоставляет два широко используемых подхода для поиска значений hyper-parameters:

  • GridSearchCV, которые учитывают все комбинации предоставленных значений.
  • RandomisedSearchCV, который может выбирать заданное количество значений-кандидатов из пространства параметров с заданным распределением.

==> Важно отметить, что и Randomized-Search, и Grid-Search исследуют одно и то же пространство параметров. Однако по сравнению с Grid-Search, Randomized-Search имеют значительно меньший пробег. С точки зрения производительности, она может быть немного ниже, скорее всего, из-за шумового эффекта, который не будет перенесен на протянутый тестовый набор данных.

==> Еще одна очень важная вещь, которую нужно помнить: на практике рекомендуется не искать много разных параметров одновременно с помощью Grid-Search, выбирать те, которые вы считаете наиболее важными.

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

Комментарии:

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

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

5.1: 🧘🏻‍♂️Случайный поиск🧘🏻‍♂️

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

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

Ну, у нас есть все в random_search_rfc, и большую часть времени нам интересно узнать настройки для нескольких лучших моделей, например. 3 или может 5!

Посмотрим, сколько информации мы сможем получить от random_search_rfc.

random_search_rfc.cv_results_ — это словарь, который содержит все результаты. Мы можем сохранить их как файл .csv или .txt, в зависимости от того, нужны ли они нам!

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

Итак, у нас есть информация о кросс-валидации в random_search_rfc.cv_results_.

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

5.1.1: Несколько лучших моделей после настройки параметров

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

Давайте вызовем вышеуказанную функцию и получим три лучшие модели из случайного поиска!

5.1.2. Сохранение лучших параметров

НЕОБЯЗАТЕЛЬНО: В случае, если мы хотим сохранить лучшие параметры в виде текстового файла:

››Прогнозы и оценки‹‹

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

5.2: 🧘🏻‍♂️Поиск по сетке🧘🏻‍♂️

Теперь выполним настройку с помощью модуля GridSearchCV. Мы можем создать новый экземпляр rfc_GS для RandomForestClassifier с тем же количеством деревьев и random_state, что и в случайном поиске.

Что ж, как и ожидалось, GridSearch займет больше времени, чем RandomSearch, сравните время!

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

*******************************************************************

6. ROC-кривая

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

  • Модель: rfc и предсказанные классы для тестовых данных в: rfc_pred
  • Модель: random_search_rfc и предсказанные классы для тестовых данных в: random_search_rfc_pred
  • Модель: grid_search_rfc и предсказанные классы для тестовых данных в: grid_search_rfc_pred

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

🧘🏻‍♂️››Прогнозируемые вероятности‹‹🧘🏻‍♂️

Чтобы получить ROC-кривую, нам нужны предсказанные вероятности для наблюдений из каждой модели.

Итак, наши цели в "y_test" находятся в Y/N, нам нужно преобразовать их 0/1. Это очень просто, мы можем использовать одну строку кода, приведенную ниже!

если вы хотите, вы можете использовать if/else для присвоения кодов в цикле, однако это утомительно — вспомните из раздела python.

Теперь у нас все готово для компьютерной кривой ROC.

Из приведенных выше цифр в Area Under ROC (AUC) мы начали видеть разницу, настройка гиперпараметров помогла получить лучшую модель!

Давайте получим ROC прямо сейчас!

Рекомендуется подумать о повторном использовании кода, написав функцию для построения более красивых кривых ROC!

Давайте используем подграфики, чтобы расположить ROC рядом для удобства сравнения. Нам нужно передать y_test_01 (это то, что мы конвертируем из N/Y в 0/1), вероятности и площадь ROC под кривой.

  • Что вы узнали из приведенных выше ROC-кривых?
  • Какую модель вы в итоге выберете?

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

*******************************************************************

7. Игра с отсечкой вероятности

Будем считать, что мы довольны моделью после настройки с модулем grid-search. Теперь возникает вопрос, должны ли мы оставаться с порогом вероятности 0,5 для предсказания класса?

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

Давайте еще раз посмотрим на прогноз нашей выбранной модели grid_search_rfc_pred!

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

Что, если мы изменим отсечку вероятности…..скажем, 0.3 и посмотрим, сможем ли мы уменьшить количество ложноотрицательных случаев, верно? Ложноположительные результаты могут увеличиться, однако это не опасны, так как они будут проверены на любой потенциальный риск.

==>Помните, что дополнительные данные всегда будут полезны для повышения производительности модели, однако в большинстве случаев это непросто!

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

==>Посмотрите на изменяющиеся числа в отчете о классификации и сравните с моделью с отсечкой вероятности по умолчанию. Попробуйте изменить пороговое значение на другое число, например 0,25 или 0,2...., и посмотрите, как меняются числа в матрице путаницы и в отчете о классификации. Будет полезно понять важность индивидуальной матрицы. Помните, точность — это не то, что мы всегда ищем! (см. ниже, оценка теперь ниже с отсечкой = 0,3)

Видите ли вы изменения в показателе точности при различных пороговых значениях вероятности? Если да, то почему?

*******************************************************************

8. Сохранение итоговой модели

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

Мы можем сериализовать окончательную модель pickle или joblib, и в любое время мы можем десериализовать сохраненную модель и получить прогнозы для новых данных. Ниже приведена копия кода из предыдущих лекций… Всегда проверяйте, что вы сохраняете правильную модель!

import pickle 
filename = 'final_model.sav' # save the model to disk

# As decided, rfc trained on complete dataset will be our model!
# file will be stored on the disk, see the working directory
# our best model is in grid_search, lets store that one
pickle.dump(rfc, open(filename, 'wb')) # wb stands for reading only in binary format

# load the model from disk
loaded_model = pickle.load(open(filename, 'rb')) # rb stands for reading only in binary format
# making predictions
predictions = loaded_model.predict(unseen_data)

Итак, до сих пор это было все об обучении дерева решений!

*******************************************************************

💐Нажмите здесь, чтобы ПОДПИСАТЬСЯ на меня, чтобы получать новые материалы💐

🌹Продолжайте практиковаться, чтобы освежить навыки и добавить новые навыки🌹

✅🌹💐💐💐🌹✅ Похлопайте и поделитесь ››вы можете помочь нам связаться с тем, кто изо всех сил пытается изучить эти понятия.✅🌹💐💐💐🌹✅

Удачи!

Увидимся на следующей лекции на тему "A41: XXXXXXXXXXX".

Примечание. Полный курс, включая видеолекции и блокноты Jupyter, доступен по следующим ссылкам:

**************************************************************************************************************************************

О докторе Джунаиде Кази:

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

**************************************************************************************************************************************