Поздравляем! На этой неделе у нас есть довольно продвинутые методы улучшения производительности нашей модели.

После введения Agile Data Science в нашей вводной статье здесь мы построили,

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

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

c) сложная модель с синтетическими функциями, основанная на разработке функций, с последующим сокращением функций на неделе 3

г) оптимизированная модель с использованием GridSearchCV для настройки гиперпараметров на неделе 4, которая на данный момент показала лучший результат F1.

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

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

В любом случае вернемся к машинному обучению. Давайте начнем!

Загрузка данных

Давайте загрузим очищенный набор данных со второй недели.

Обучение тестовому сплиту

Как и раньше, давайте разделим Train-Test после разделения функций и цели.

Создание экземпляров древовидных классификаторов

В sklearn доступно более 25 моделей классификаторов, подробнее о них можно узнать здесь и здесь. Для целей этой статьи я собираюсь сосредоточиться на 7 древовидных моделях из sklearn и других источников: дерево решений, классификатор пакетов, классификатор случайного леса, классификатор дополнительных деревьев, классификатор повышения градиента, CatBoost и LGBM. (Если вам интересно, где находится XGBoost, я приберегу его на последнюю неделю, когда буду строить многоуровневую модель). За исключением дерева решений, все остальные модели сами по себе являются ансамблями.

Приведенный ниже код импортирует и создает экземпляр каждого классификатора. Обратите внимание, что я включил перебалансировку классов во время создания экземпляра модели (за исключением GradientBoostingClassifier, который не имеет перебалансировки по умолчанию), потому что на прошлой неделе мы заметили, что это улучшило производительность RandomForestClassifier. Я создал переменную «rebalance_factor», потому что CatBoost требует от вас указать точное соотношение, в котором вы хотите исправить дисбаланс в классах.

Кривая обучения

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

Это занимает около 5 минут для работы на 8-ядерном процессоре с 30 ГБ ОЗУ без ускорения графического процессора, большую часть времени из-за CatBoost. Ниже приведены выходные графики при запуске приведенного выше фрагмента кода.

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

Настройка гиперпараметров

Теперь, когда у нас есть общее представление о том, как настраивать параметры, давайте определим пространство гиперпараметров, сосредоточившись на max_depth, min_samples_split и min_samples_leaf. которые являются наиболее интуитивно понятными элементами управления для уменьшения переобучения. Для CatBoost я решил настроить еще пару параметров (n_estimators и регуляризацию l2).

Уменьшение max_depth обрезает дерево до небольшой глубины. Увеличение min_samples_split приводит к аналогичному эффекту (по умолчанию используется 2 выборки, что означает, что алгоритм будет использовать всего 2 примера обучающих данных для разделения). Увеличение min_samples_leaf также уменьшает переоснащение (минимум – 1 образец на каждом листе, что означает, что алгоритм может создать конечный узел для каждой строки обучающих данных).

Подробное обсуждение того, как min_samples_split и min_samples_leaf уменьшают переобучение, см. в статьях здесь и здесь.

Страница документации для LightGBM содержит рекомендации по настройке гиперпараметров здесь.

Определить пространство гиперпараметров

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

Оптимизация гиперпараметров классификатора с помощью GridSearchCV

Как обсуждалось в нашей предыдущей статье, GridSearchCV, по сути, является методом проб и ошибок, перебирая все возможные комбинации предоставленных комбинаций гиперпараметров. Функция предыдущей недели была немного изменена и представлена ​​ниже для удобства.

Вышеупомянутая функция вызывается повторно для каждого из классификаторов в ансамбле.

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

Существует 270 возможных комбинаций гиперпараметров (как мы изначально определили). Умножение на 5-кратное CV даст в общей сложности 1350 уникальных комбинаций для тестирования. Впоследствии средние показатели CV (точность, точность, полнота, F1, AUC) лучшей модели будут отображаться, как показано выше.

Машинное обучение на настроенной модели

Подбор модели

Используя оптимизированную модель из шага GridSearchCV, мы можем подогнать ее ко всем данным Train. В следующем коде показано, как можно получить оптимизированную модель GridSearchCV с помощью ключа «best_estimator_» и впоследствии использовать ее как любую другую модель. Альтернативой является ручное извлечение самих лучших гиперпараметров и явное создание экземпляра каждого классификатора (как мы сделали на неделе 4 с RandomForestClassifier). Обратите внимание, что для CatBoost я вручную установил «verbose = 0», чтобы журналы не отображались.

Все подобранные модели хранятся в словаре tuned_classifier_dict.

Объединение вероятностей прогнозов

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

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

Вызов вышеуказанной функции с тестовыми данными дает следующий кадр данных:

У нас есть все необходимое для создания метрик классификации и оценки эффективности нашей модели.

Эффективность модели

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

Точность

Как видно, точность теста составляет 80%, что на 2% больше, чем на предыдущей неделе. Откуда это улучшение? Давайте узнаем, используя отчет о классификации

Отчет о классификации

Показатели F1 теперь выше (0,86, 0,64) по сравнению с предыдущей итерацией (0,85, 0,62), что указывает на то, что модель действительно научилась лучше выбирать как положительные, так и отрицательные классы. Это может быть дополнительно подтверждено оценкой ROC AUC, показанной ниже.

ROC AUC

Эта модель имеет AUC 0,85, что на 1% выше, чем у предыдущей итерации.

Матрица путаницы

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

При сравнении матрицы путаницы в ансамблевой модели этой недели становится очевидным, что количество правильно классифицированных выборок увеличилось (870/253 против 850/250 на предыдущей неделе).

Таким образом, мы успешно использовали методы Ensemble вместе с GridSearchCV для повышения производительности классификации по сравнению с базовой моделью.

На этом этапе вы можете заявить о своей победе и вернуться к делу, чтобы представить свои результаты. Если у вас есть больше времени или бизнес хочет, чтобы вы старались еще усерднее, вы можете попробовать стекирование, которое мы обсудим на неделе 6. Оставайтесь с нами!