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

Что вы узнаете из этого руководства:

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

В качестве бонуса вы также узнаете:

  • как тренировать, соответствовать и предсказывать подход используется в машинном обучении.
  • как выполняется простая классификация с помощью пакета Caret.
  • как загрузить данные из репозитория GitHub в R.

Основные интересующие пакеты R:

Репозиторий кода.
Весь код и набор данных можно найти по адресу:

Мотивация

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

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

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

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

  1. когда что-то идет не так, вы точно знаете, где искать, точно не в коде.
  2. когда код развертывается в рабочей среде, конфигурация может быть изменена для отражения новых сред. Хотя конфигурация меняется, код остается! Это может быть очень важно в некоторых сценариях критических исследований, когда после завершения исследования вы не вмешиваетесь в него. Когда кто-то смотрит на отметку времени в вашем коде анализа и обнаруживает, что она изменилась с момента последней публикации, может быть трудно объяснить, даже если изменился всего один символ.

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

Что такое конфигурация?

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

Задача машинного обучения

В качестве иллюстрации рассмотрим простую задачу классификации. В этом примере мы загрузим предварительно обработанный набор данных из репозитория GitHub и используем пакет R Caret для обучения модели. Основными этапами будут:

  1. загрузить обучающие и тестовые наборы данных,
  2. выбрать образец из обучающих данных и настроить схему перекрестной проверки для обучения,
  3. используйте подход train, fit, predict для выполнения задачи машинного обучения.

Немного о наборе данных

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

Исходные данные являются частью общедоступных наборов данных машинного обучения UCI. Его можно найти по адресу: https://archive.ics.uci.edu/ml/machine-learning-databases/adult/. Используемая здесь версия была очищена и преобразована.

Подход к машинному обучению: обучение, подгонка, прогнозирование

Подход «обучение, подгонка и прогнозирование» разделяет задачи машинного обучения на три отдельных этапа:

  1. train — на этапе обучения мы используем выборку и перекрестную проверку для обучения модели, которая помогает нам найти оптимизированное значение для основных гиперпараметров алгоритма. Для алгоритма knn основным интересующим гиперпараметром является k, поэтому этап обучения поможет получить наилучшее значение для k, которое мы можем использовать. в нашей окончательной модели.
  2. fit — на этапе подбора мы используем оптимизированное значение k, полученное во время обучения, чтобы подогнать окончательную модель ко всем обучающим данным.
  3. прогнозировать. Наконец, мы используем окончательную модель на этапе подбора, чтобы делать прогнозы с использованием тестового набора данных. После прогноза мы можем сравнить прогнозируемые значения с фактическими значениями ответов в тестовом наборе данных, чтобы увидеть, как работает модель.

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

Сведения об обучении модели и перекрестной проверке

  • размер выборки: для нашей иллюстрации мы выберем выборку (1000 строк) из набора обучающих данных.
  • перекрестная проверка: также мы будем использовать перекрестную проверку для обучения модели; мы используем 5-кратную перекрестную проверку.
  • Последовательность каретки tuneLength: мы устанавливаем параметр настройки каретки tuneLength равным 10.

Структура и логика кода

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

Первый фрагмент кода стандартный, мы устанавливаем seed для обеспечения воспроизводимых результатов, а затем загружаем нужные нам библиотеки. Кроме того, мы определяем функцию (строки 13–30), которую мы можем вызвать позже для загрузки наборов данных. В этом разделе нет настраиваемых значений.

Где находятся настраиваемые элементы?

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

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

Еще одна область кода, где мы используем настраиваемые значения, — это выбор образцов данных и настройка схемы перекрестной проверки, см. фрагмент кода ниже. Как упоминалось ранее, во время обучения мы хотели бы попробовать разные размеры выборок, а также поэкспериментировать с перекрестной проверкой. Чтобы код работал быстрее, мы можем установить число перекрестной проверки равным 1 и установить небольшой размер выборки. В этом простом сценарии, один человек, одна среда, это не проблема. Но тем не менее, это жестко запрограммировано!

Быстрая проверка данных

Набор обучающих данных, который мы будем использовать, содержит 29303 записи. Есть 92 атрибута, 91 из них — это функции, а оставшийся (столбец over50K) — переменная ответа. Все столбцы являются числовыми, за исключением переменной ответа, которая является категориальной (Да/Нет, Y, если доход человека превышает 50 000, или иначе).

Набор тестовых данных содержит 3257 записей и имеет тот же формат, что и набор обучающих данных.

Ниже приведен небольшой снимок обучающих данных.

Организация настраиваемых элементов в одном месте

Первая попытка конфигурационных файлов — переместить все конфигурационные элементы в одно место.

Теперь мы видим, как вызов функции fnDownloadData() использует переменные (строки 28 и 34), это выглядит намного чище!

Представляем пакет конфигурации R

Наконец, мы представляем пакет R config. Этот пакет позволяет вам определить все ваши конфигурации в файле yaml, R позаботится обо всем оттуда.

Использование пакета конфигурации требует трех шагов:

  • определить файл конфигурации (config.yml)
  • загрузите конфигурацию в свой код R в объект
  • ссылаться на элемент, используя объект конфигурации

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

Чтение элементов конфигурации

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

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

Собираем все вместе — выполняем весь анализ

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

Результаты анализа

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

  • результаты модели обучения (результаты перекрестной проверки)

  • сравнить первые несколько прогнозов с фактическими значениями из test_set

  • распечатать некоторые данные о производительности модели из ConfidenceMatrix

Заключение

Основная цель этого руководства — продемонстрировать использование пакета config в R на практическом примере машинного обучения с кодом. В процессе я также использовал пакет R caret для обучения алгоритма классификации и использовал окончательную модель для прогнозирования. Я надеюсь, что читатели воспользуются этими базовыми знаниями и изучат возможности конфигурации, особенно в командах и в производственных средах. Удачи!