Автоматизируйте «скучные» вещи. Ускорьте жизненный цикл разработки вашей модели.

Мотивация

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

Оптимизация гиперпараметров

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

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

Поиск по сетке

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

Случайный поиск

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

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

Байесовская оптимизация

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

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

Чтобы преодолеть проблему холодного запуска, Auto-Sklearn, библиотека AutoML с открытым исходным кодом, включает теплый запуск через процесс, называемый мета-обучением, в байесовскую оптимизацию, чтобы получить экземпляр гиперпараметров, которые лучше, чем случайные.

Авто-Sklearn

Автоматизированное машинное обучение (AutoML) - это процесс автоматизации задач в конвейере машинного обучения, таких как предварительная обработка данных, предварительная обработка функций, оптимизация гиперпараметров, выбор и оценка модели. Auto-Sklearn автоматизирует вышеупомянутые задачи, используя популярную среду машинного обучения Scikit-Learn. На изображении ниже вкратце показано, как работает Auto-Sklearn.

Auto-Sklearn использует байесовскую оптимизацию с горячим стартом (мета-обучение) для поиска оптимального конвейера модели и построения ансамбля из отдельных конвейеров модели в конце. Давайте рассмотрим различные компоненты в структуре Auto-Sklearn.

Мета-обучение

Цель метаобучения - найти хороший экземпляр гиперпараметров для байесовской оптимизации, чтобы вначале он работал лучше, чем случайный. Интуиция, лежащая в основе метаобучения, проста: наборы данных с похожими мета-функциями одинаково работают с одним и тем же набором гиперпараметров. Мета-функции, по определению авторов Auto-Sklearn, - это «характеристики набора данных, которые можно эффективно вычислить и которые помогают определить, какой алгоритм использовать в новом наборе данных».

Во время автономного обучения в общей сложности 38 мета-характеристик, таких как асимметрия, эксцесс, количество функций, количество классов и т. Д., Были сведены в таблицу для 140 эталонных наборов данных из OpenML. Каждый набор справочных данных был обучен с использованием процесса байесовской оптимизации, и результаты были оценены. Гиперпараметры, которые дали наилучшие результаты для каждого эталонного набора данных, сохраняются, и эти гиперпараметры служат в качестве экземпляра для байесовского оптимизатора для нового набора данных с аналогичными мета-функциями.

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

Авторы экспериментировали с различными вариантами Auto-Sklearn на эталонном наборе данных и сравнивали их, используя средний рейтинг по разной продолжительности обучения. Более низкий рейтинг указывает на лучшую производительность. Варианты с метаобучением (синий и зеленый) показывают резкое падение ранга в начале из-за хорошей инициализации байесовского оптимизатора.

Препроцессоры данных

Auto-Sklearn предварительно обрабатывает данные в следующем порядке [2].

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

Функциональные препроцессоры

После предварительной обработки данных функции могут быть дополнительно предварительно обработаны с помощью одной или нескольких из следующих категорий препроцессоров функций [2].

  1. Разложение матрицы с использованием PCA, усеченного SCV, ядра PCA или ICA
  2. Одномерный выбор функций
  3. Выбор признаков на основе классификации
  4. Кластеризация функций
  5. Аппроксимации ядра
  6. Расширение полиномиального признака
  7. Встраивание функций
  8. Редкое представление и преобразование

Ансамбль

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

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

Код

Давайте посмотрим на несколько практических примеров Auto-Sklearn в действии.

Установите пакет

pip install auto-sklearn==0.13

Импортировать пакеты

import pandas as pd
import sklearn.metrics
from sklearn.model_selection import train_test_split, StratifiedKFold
from autosklearn.classification import AutoSklearnClassifier
from autosklearn.metrics import (accuracy,
                                 f1,
                                 roc_auc,
                                 precision,
                                 average_precision,
                                 recall,
                                 log_loss)

Загрузить набор данных

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

Мы читаем набор данных как фреймворк Pandas.

df = pd.read_csv('bank-additional-full.csv', sep = ';')

Подготовьте данные

Auto-Sklearn требует, чтобы мы идентифицировали, является ли столбец числовым категориальным либо во фрейме данных pandas, либо мы можем сделать это позже в функции fit. Давайте конвертируем это сейчас.

num_cols = ['ge', 'duration', 'campaign', 'pdays', 'previous', 'emp.var.rate', 'cons.price.idx', 'cons.conf.idx', 'euribor3m', 'nr.employed']
cat_cols = ['job', 'marital', 'education', 'default', 'housing', 'loan', 'contact', 'month', 'day_of_week', 'poutcome']
df[num_cols] = df[num_cols].apply(pd.to_numeric)
df[cat_cols] = df[cat_cols].apply(pd.Categorical)
y = df.pop('y')
X = df.copy()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state=1, stratify=y)

Создайте экземпляр классификатора

skf = StratifiedKFold(n_splits=5)
  
clf = AutoSklearnClassifier(time_left_for_this_task=600,
                            max_models_on_disc=5,
                            memory_limit = 10240,
                            resampling_strategy=skf,
                            ensemble_size = 3,
                            metric = average_precision,
                            scoring_functions=[roc_auc, average_precision, accuracy, f1, precision, recall, log_loss])

Ниже приведены некоторые параметры, используемые в AutoSklearnClassifier.

time_left_for_this_task: ограничить общее время тренировки (в секундах)

max_models_on_disc: Ограничьте количество сохраняемых моделей

memory_limit: объем памяти (в МБ), который мы хотим использовать.

resampling_strategy: задержка или различные виды перекрестной проверки. Обратитесь к этой документации.

ensemble_size: Количество моделей для включения в ансамбль. Auto-Sklearn предоставляет возможность создать ансамбль после создания отдельных моделей, взяв верхнее ensemble_size количество моделей взвешенным способом.

metric: показатель, который мы хотим оптимизировать.

scoring_function: один или несколько показателей, по которым мы хотим оценить модель.

Подобрать классификатор

clf.fit(X = X_train, y = y_train)

Под капотом Auto-Sklearn создает конвейер Scikit-Learn во время каждого испытания. Конвейер Scikit-Learn используется для сборки серии шагов, которые выполняют обработку данных, обработку функций и оценку (классификатор или регрессор). Функция fit запускает все построение, подгонку и оценку нескольких конвейеров Scikit-Learn для всего Auto-Sklearn, пока не будут выполнены критерии остановки time_left_for_this_task.

Результаты

Мы можем просмотреть результаты и выбранные гиперпараметры.

df_cv_results = pd.DataFrame(clf.cv_results_).sort_values(by = 'mean_test_score', ascending = False)
df_cv_results

Мы также можем просмотреть сравнение всех испытаний в таблице лидеров.

clf.leaderboard(detailed = True, ensemble_only=False)

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

clf.get_models_with_weights()

Этот метод возвращает список кортежей [(weight_1, model_1), …, (weight_n, model_n)]. weight указывает, какой вес он придает выпуску каждой модели. Сумма всех weight значений будет равна 1.

Также мы можем просмотреть статистику дополнительных тренировок.

clf.sprint_statistics()

Добавьте все данные обучения

Во время k-кратной перекрестной проверки Auto-Sklearn подбирает каждый конвейер модели k раз в наборе данных только для оценки, он не сохраняет ни одной обученной модели. Поэтому нам нужно вызвать метод refit, чтобы он соответствовал конвейеру моделей, найденному во время перекрестной проверки, со всеми данными обучения.

clf.refit(X = X_train, y = y_train)

Сохранить модель

dump(clf, 'model.joblib')

Загрузить модель и прогноз

Загрузим сохраненный конвейер модели для вывода.

clf = load('model.joblib')
y_probas = clf.predict_proba(X_test)
pos_label = 'yes'
y_proba = y_probas[:, clf.classes_.tolist().index(pos_label)]

Вывод

Поиск оптимальных компонентов и гиперпараметров модельного конвейера - нетривиальная задача. К счастью, есть решения AutoML, такие как Auto-Sklearn, которые могут помочь автоматизировать этот процесс. В этой статье мы рассмотрели, как Auto-Sklearn использует мета-обучение и байесовскую оптимизацию для поиска оптимального конвейера модели и построения ансамбля моделей. Auto-Sklearn - один из многих пакетов AutoML. Ознакомьтесь с другими альтернативами, такими как H2O AutoML.



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

Ссылка

[1] Эффективное и надежное автоматизированное машинное обучение

[2] Дополнительные материалы по эффективному и надежному автоматизированному машинному обучению

[3] Документация Auto-Sklearn API