Машинное обучение может быть сложным - есть несколько этапов, которые могут ограничить скорость процесса итеративного моделирования даже для опытных практиков. Будучи студентом вводного курса машинного обучения Джереми Ховарда в Университете Сан-Франциско, я узнал, что процесс моделирования можно упростить и ускорить. Это цель библиотеки fast.ai, которая постоянно совершенствуется. Цель этого поста - облегчить быструю и эффективную гиперпараметрическую оптимизацию моделей машинного обучения, ключевую часть процесса итеративного моделирования.

Введение в гиперпараметры

Во-первых, давайте сделаем шаг назад и спросим: «Что такое гиперпараметры и почему меня это волнует?» Если вы знакомы с этими концепциями, перейдите к следующему разделу.

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

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

Оценка по проверочным наборам

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

Рэйчел Томас из fast.ai написала отличное сообщение в блоге о том, как (и почему) создать хороший набор для проверки. Прежде чем продолжить, я настоятельно рекомендую прочитать этот пост.

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

  • обучающий набор используется для обучения данной модели
  • набор проверки используется для выбора между моделями (например, что лучше для вашей задачи: случайный лес или нейронная сеть? Вам нужен случайный лес с 40 деревьями или 50 деревьев?)
  • набор тестов расскажет, как вы это сделали. Если вы опробовали много разных моделей, вы можете случайно получить ту, которая хорошо работает на вашем наборе для проверки, а наличие набора для тестирования помогает убедиться, что это не так.

Важный вывод из ее сообщения:

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

Я продолжу предполагать, что вы читали статью Рэйчел. То есть я предполагаю, что вы знаете, как создать эффективный набор для проверки, и уже сделали это.

Как мы выполняем оптимизацию гиперпараметров?

Давайте поработаем здесь с примером: RandomForestClassifier (реализовано в sklearn). По причинам, изложенным в вводном курсе машинного обучения Джереми (который скоро будет доступен как MOOC), нас интересуют два ключевых параметра: max_features и min_samples_leaf. То есть мы хотим знать, какая комбинация max_features и min_samples_leaf дает нам лучший результат по нашему набору проверки.

Для этого мы обычно выполняем исчерпывающий поиск в сетке по всем комбинациям max_features и min_samples_leaf. Наиболее часто используемый пакет для этой техники - GridSearchCV (от sklearn). Этот пакет очень эффективен, если вы используете полностью рандомизированный обучающий набор, который не содержит временной составляющей, поскольку по умолчанию внутренняя оценка выполняется с использованием перекрестной проверки. Это оптимальный метод для оценки гиперпараметров, поскольку он берет средний балл по всем складкам в подпрограмме перекрестной проверки и дает лучший набор гиперпараметров на основе этого среднего.

Итак ... в чем проблема?

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

Обратите внимание, что в GridSearchCV можно указать объект PredefinedSplit для разделения наборов для обучения и проверки в GridSearchCV, но лучше заранее разделить наборы для обучения и проверки и ввести набор проверки в качестве набора для оценки, чтобы избежать путаницы. и кровотечение между тренировками и проверками.

Теперь, когда мы понимаем проблему, каково наше решение?

Решение - парфит!

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

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

Отлично звучит, как мне его использовать?

Чтобы установить пакет, введите в терминале следующую команду:

pip install parfit

Затем в записной книжке Jupyter (или в программе на Python) запустите следующую строку, чтобы импортировать модуль:

import parfit.parfit as pf

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

import numpy as np
from sklearn.model_selection import ParameterGrid
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
paramGrid = ParameterGrid({
    'min_samples_leaf': [1,3,5,10,15,25,50,100,125,150,175,200],
    'max_features': ['sqrt', 'log2', 0.4, 0.5, 0.6, 0.7],
    'n_estimators': [60],
    'n_jobs': [-1],
    'random_state': [42]
})
best_model, best_score, all_models, all_scores = pf.bestFit(RandomForestClassifier, paramGrid, 
     X_train, y_train, X_val, y_val, 
     metric=roc_auc_score, bestScore='max', scoreLabel='AUC')
print(best_model)

Изучив эту сетку, мы видим, что для этих данных модели с наивысшей оценкой использовали max_features = 0,4 или 0,6 и min_samples_leaf = 100. Мало того, мы автоматически вернули модель с единственным набором параметров, который максимизировал оценку по набору проверки. Кроме того, мы вернули оценку этой лучшей модели, поэтому мы знаем, как у нас дела.

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

На странице parfit github есть документация по каждой функции в пакете и примечания по использованию этих функций. Также существует parfit_ex.ipynb, в котором приведены примеры использования для изменения 1, 2 и 3 параметров в сгенерированном наборе данных.

Мой коллега и соратник соискатель степени магистра аналитики из Университета Сан-Франциско, Виней Патлолла, написал отличный пост, в котором он использовал parfit, чтобы показать, как заставить классификатор SGD работать так же хорошо, как и логистическую регрессию. В этом посте также есть краткий раздел о том, как использовать парфит.

Каков полный процесс?

  1. Создайте эффективный набор проверки
  2. Выберите свою модель (-и)
  3. Создайте сетку параметров, по которой будет оценивать вашу модель на проверочном наборе.
  4. Используйте parfit, чтобы визуализировать результаты по сетке и выбрать лучшую модель.
  5. Переобучить модель на полном обучающем наборе, используя лучшие параметры из parfit
  6. Применить повторно обученную модель к набору тестов

Текущие ограничения parfit:

  • Пакет предназначен для использования с моделями машинного обучения sklearn.
  • Необходимо передать объект ParameterGrid, как показано в примере выше.

Есть предложения по улучшению пакета?

Дайте мне знать или внесите свой вклад в пакет!

Linkedin: https://www.linkedin.com/in/jasonmcarpenter/