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

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

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

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

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

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

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

Давайте начнем !

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

Давайте загрузим очищенный набор данных из недели 2, потому что шаги по разработке функций на неделе 3 не были эффективными.

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

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

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

Помните, что наша цель состоит в том, чтобы получить окончательный набор гиперпараметров, которые уменьшат переоснащение при одновременном увеличении оценки классификации F1. Как наш RandomForest() по умолчанию работает до сих пор, когда дело доходит до переобучения? Из результатов нашей предыдущей недели мы знаем, что существует разрыв между тренировочным набором и оценками проверки. Но будет ли иметь значение наличие большего количества данных за счет уменьшения этого разрыва или изменение гиперпараметра для уменьшения переобучения будет иметь значение? Давайте узнаем, создав кривые обучения.

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

У Sklearn есть отличная страница по использованию кривых обучения для сравнения производительности алгоритма здесь, которую я изменил ниже:

Я собираюсь построить кривую обучения с гиперпараметрами по умолчанию из нашего стандартного RandomForestClassifier() по сравнению с другой кривой обучения, где оценщик имеет гиперпараметр max_depth для штрафа за переобучение.

Обратите внимание, что оценка обучения остается близкой к 1,0 (подразумевая почти 100% точность, но оценки проверки остаются ниже 0,80). Этот большой разрыв указывает на то, что происходит переобучение с параметрами hsyperparams по умолчанию (параметры по умолчанию можно просмотреть, нажав Shift+Tab после помещения курсора внутрь скобки оценщика)

Напротив, давайте построим RandomForestClassifier() с более строгими критериями, чем то, что было из коробки. Вместо значения по умолчанию max_depth=None я выбрал max_depth=5 и заново построил кривую обучения.

Почему ограничение max_depth всего пятью уровнями предотвращает переоснащение RandomForest? Это связано с тем, что чем мельче дерево, тем меньше «разрезов» оно делает с данными и, следовательно, изучает только более широкие закономерности в данных, а не шум.

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

Поиск по сетке для настройки гиперпараметров

Из множества гиперпараметров, доступных в RandomForest, я выберу 3 гиперпараметра для уменьшения дисперсии (т. е. переобучения) и 1 гиперпараметр для уменьшения смещения (недообучения). Это max_depth, min_samples_split и min_samples_leaf для уменьшения дисперсии и class_weight для повышения точности. class_weight особенно интересен, потому что у нас есть небольшой дисбаланс классов, но не настолько серьезный, чтобы нам нужно было использовать более продвинутые методы.

Я выбрал относительно низкие значения для max_depth. Меня не слишком беспокоят min_samples_split и min_samples_leaf, поскольку ранее мы видели, как кривая обучения без проблем сходится даже при значениях по умолчанию. С другой стороны, весовой коэффициент class_weight по умолчанию равен 1 для каждой метки класса. Выбор «сбалансированный» скажет sklearn перебалансировать классы до 50:50 во время обучения. Я также включил словари, указывающие другие параметры веса для положительного класса, который GridSearchCV будет перебирать.

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

Ядро функции выполняет перебор всех возможных комбинаций переданного пространства параметров (их 700 возможных комбинаций). Это делается 5 раз, чтобы усреднить любые причуды в данных. Таким образом, у нас есть в общей сложности 700 * 5 = 3500 обучения и проверки в рамках функции GridSearchCV. Гиперпараметры для наилучших результатов проверки можно получить с помощью метода .best_params_. Я также дополнительно сохранил результаты проверки для модели, содержащей best_params_.

Обратите внимание, что фрагмент кода metrics_store_function() приведен ниже.

Приведенная выше функция собирает обычные метрики классификации в словарь и возвращает их внутри hyper_param_search_function().

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

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

Здесь я собираюсь попробовать просто поиск по сетке, вызвав функцию

Если вы хотите проникнуть в то, как выглядят ваши гиперпараметры, следующий вывод будет генерировать:

Машинное обучение на настроенных гиперпараметрах

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

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

При запуске подобранной модели на тестовом наборе мы видим заметное улучшение как показателей F1, так и ROC AUC.

Успех !

По сравнению с предыдущей неделей, когда ROC AUC составлял около 79%, на этой неделе мы улучшили его до 84%! Более того, наши оценки F1 для класса Positive также улучшились почти на 10%. Большая часть этого может быть связана с ограничением max_depth и изменением class_weight, чтобы можно было легко подобрать несбалансированный) положительный класс.

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