Даже если ваш проект небольшой, файлы YAML могут значительно повысить его гибкость и возможность повторного использования.

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



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

Что такое ЯМЛ?

Аббревиатура YAML раньше обозначала еще один язык разметки. Теперь он означает язык разметки YAML Aint, чтобы лучше представить ориентированную на данные цель, которую в настоящее время имеет YAML.

YAML - это дружественный к человеку стандарт сериализации данных, который, среди прочего, следует за отступами Python и представляет собой надмножество JSON. YAML - не единственный формат, который можно использовать для файлов конфигурации; файлы конфигурации могут быть сделаны в файлах .py, в JSON или INI. Я выбрал YAML из-за его простоты, но я вернусь к нему позже, так как одна (или две) причины в этой статье основаны на его простоте (предупреждение о спойлере!).

Если вы не знаете, что такое файл конфигурации:

Файлы конфигурации используются для хранения параметров конфигурации, то есть начальных параметров и настроек приложения. Слово приложение здесь используется в более широком определении. Если ваш код что-то делает с данными, он соответствует определению приложения. Если вам нужен простой способ понять одну из целей файла конфигурации, подумайте обо всем, что вы можете жестко кодировать в проекте, например (но не исключительно!):

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

1. Даже в небольших проектах прокрутка кода для изменения параметров никогда не доставляет удовольствия.

Без сомнения, я обычно могу использовать файл YAML с самого начала проекта, но я часто пропускаю этот шаг. Позже я всегда понимаю, что было ошибкой не начать с config.yaml раньше. К сожалению, знание лучших практик не всегда означает, что я охотно применяю их автоматически.

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

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

2. Написать свой первый файл YAML совсем несложно.

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

files:
   location: 'C/Users/Yourname/Mydocuments/theinputlocation.txt'
   output: 'C/Users/Yourname/Mydocuments/theoutputlocation.txt'

Легко, правда? Но вот несколько характеристик, которые делают это еще проще!

  • Я также могу написать строку без кавычек (если она не содержит никаких специальных символов, которые можно было бы рассматривать как синтаксис YAML)! И если я действительно хочу или мне нужно использовать кавычки, мне подойдут как одинарные, так и двойные кавычки.
files:
   location: C/Users/Yourname/Mydocuments/theinputlocation.txt
   output: C/Users/Yourname/Mydocuments/theoutputlocation.txt
  • YAML использует комментарии так же, как и другие языки, такие как Python, с помощью символа #, который комментирует остальную часть строки.
files:
#put the locations of your files here
   location: 'C/Users/Yourname/Mydocuments/theinputlocation.txt'
   output: 'C/Users/Yourname/Mydocuments/theoutputlocation.ext'
  • Нет необходимости в конкретных утверждениях, вы начинаете непосредственно с содержимого вашего файла YAML.

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

3. Чтение файла YAML в Python также невероятно просто.

Итак, если написать файл .yaml так просто, как насчет чтения файла yaml и указания Python, как обращаться с его содержимым?

pip install pyyaml

Для чтения файлов YAML в Python необходим только один пакет.

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

import yaml
try: 
    with open (path_to_yaml, 'r') as file:
    config = yaml.safe_load(file)
except Exception as e:
    print('Error reading the config file')

Взяв тот же пример, который мы использовали выше для моего местоположения ввода и моего местоположения вывода, вот как я могу получить доступ к своим настройкам:

location_input = config['files']['location']
location_output = config['files']['output']
  • Что делать, если вы не хотите каждый раз записывать файл?

Что должно быть в вашем YAML файле:

write_file: True #turn to False to prevent from running

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

if config['write_file']:
    mydf.to_csv(location_output)

4. Люди (разработчики или нет) будут любить вас, когда вы поделитесь с ними своим приложением.

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

Что, если весь проект по науке о данных необходимо переместить на сервер? Если вам нужно импортировать только один файл из одного места в вашем проекте (что редко случается со мной), это может не быть такой проблемой. Что делать, если вам нужно импортировать несколько файлов из разных мест (и файлы могут иногда менять имена)? Любой другой, кто запускает код или извлекает его из вашего репозитория git, должен будет просмотреть код, найти каждый отдельный путь и заменить его своим собственным.

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

5. Это может помочь вам сосредоточиться на коде машинного обучения (или любой другой части вашего проекта).

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

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

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

steps:
   preprocessing: False
   machinelearningstep: True
temp_location: mytempfile.csv

И представление о том, как это должно выглядеть в Python:

if config['preprocessing']:
    #do extensive cleaning on my dataframe
else:
    #load the temp file that is being saved each time I run 
    #the preprocessing step in the location indicated in the config
    #file

Файлы YAML имеют свои преимущества и ограничения, как и любой язык или формат файла конфигурации. Я понимаю, что многие из приведенных мною причин могут быть действительными и для другого типа файла конфигурации (моим вторым фаворитом является файл .py). Неважно, выбираем ли я или мои коллеги файл YAML или файл .py, но создание простой, удобной и удобной для чтения структуры проекта имеет большое значение для продуктивности и счастья команды в долгосрочной перспективе. Если мы можем избежать разочарований в долгосрочной перспективе, почему бы и нет?