Best Practices для Python и Data Science

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


С хорошего кода начинается отличное машинное обучение.

Источник: techgig

Пролог

Если Вы занимаетесь Data Science, то Вы знакомы с рабочим процессом: любой проект начинается с запуска Jupyter Notebook, затем необходимо писать код на Python, выполнять комплексный анализ данных и обучать модель. По мере того, как файл с кодом увеличивается в размерах вместе со всеми функциями, классами и графиками, Вы обнаруживаете, что перед Вами огромный кусок монолитного кода. И, если повезет, то запуск может пойти гладко. А может не повезти...

Однако, Jupyter Notebook скрывает некоторые серьезные подводные камни, которые могут превратить Вашу работу в настоящий ад. Давайте посмотрим, как это происходит, а затем обсудим best practices, чтобы предотвратить это.

Проблемы с Jupyter Notebook ??

Источник: datascience.foundation

Довольно часто все может пойти не так, как Вы планировали, если Вы хотите вывести прототип jupyter notebook на новый уровень. Вот несколько ситуаций, с которыми я сам столкнулся при использовании этого инструмента. Скорее всего, они Вам знакомы:

  • Когда все объекты (функции или классы) определены и созданы в одном месте, управлять программой становится очень сложно. Даже если Вы хотите внести небольшое изменение в функцию, нужно сначала найти ее где-нибудь в блокноте юпитера, исправить и повторно запустить код сначала. То еще развлечение, конечно. Не проще было бы вынести вспомогательные функции в другой скрипт?
  • Благодаря своей интерактивности и мгновенному отклику jupyter notebook подталкивает специалистов к объявлению переменных в глобальном пространстве имен вместо использования функций. Это считается плохой практикой при разработке на Python, поскольку это ограничивает повторное использование кода. Это также вредит воспроизводимости, потому что ноутбук превращается в большой конечный автомат, содержащий все Ваши переменные. С такой конфигурацией кода Вам нужно будет помнить, какой результат кэшируется, а какой нет. Соответственно, придется надеяться, что другие пользователи будут следовать Вашему порядку выполнения ячеек.
  • То, как jupyter notebooks форматируются (объекты JSON), затрудняет
    управление версиями кода. Вот почему я так редко вижу, чтобы кто-то использовал GIT для фиксации разных версий notebook. Следовательно, командная работа становится неэффективной и неуклюжей: члены команды начинают обмениваться фрагментами кода по электронной почте; откат к предыдущей версии кода становится кошмаром, а файловая организация становится беспорядочной. Вот что я обычно вижу в проектах после двух или трех недель использования jupyter notebook без надлежащего управления версиями:
    analysis.ipynb
    analysis_COPY (1) .ipynb
    analysis_COPY (2) .ipynb
    analysis_FINAL.ipynb
    analysis_FINAL_2.ipynb
  • Jupyter Notebook хорош для исследования и быстрого создания прототипов. Но точно не предназначен для повторного использования или использования в продакшене. Если Вы разработали пайплайн обработки данных с помощью jupyter notebook, лучшее, что Вы можете утверждать наверняка, это что Ваш код будет работать на Вашем ноутбуке или виртуальной машине, следуя порядку выполнения ячеек. Но это ничего не говорит о том, как Ваш код будет вести себя в более сложной среде. Например, с большими наборами входных данных, другими асинхронными параллельными задачами или меньшими ресурсами.
    Notebooks, на самом деле, сложно тестировать, поскольку их поведение иногда непредсказуемо.
  • Как человек, который большую часть своего времени проводит на VSCode, пользуясь преимуществами мощных расширений для линтинга (анализ кода на наличие возможных ошибок), форматирования стилей, структурирования кода, автозаполнения и поиска по кодовой базе (исходный код, необходимый для сборки отдельной программы или её компонента), я не могу не чувствовать себя немного бессильным при переключении обратно на jupyter.По сравнению с VSCode, в jupyter notebook отсутствуют расширения, которые делают разработку реально удобной.

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

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

Советы, которые сделают код удобным ?

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

1 - Очистите свой код ??

Фото Флориана Оливо на Unsplash

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

Вот что может помочь получить более чистый код:

  • Используйте осмысленные имена переменных, которые являются описательными и подразумевают тип. Например, если Вы объявляете логическую переменную, чтобы проверить, стар ли человек, можете сделать ее как описательной, так и информативной, используя is_old.То же самое и с тем, как Вы объявляете свои данные: поясните их.
  • Избегайте сокращений, которые никто, кроме Вас, не может понять, и длинных имен переменных, которые никто не сможет использовать.
  • Не объявляете «магические числа» прямо в коде. Определите их в переменной, чтобы каждый мог понять, к чему они относятся.
  • При именовании объектов соблюдайте соглашения PEP8 : например, имена функций и методов пишутся строчными буквами, а слова разделяются подчеркиванием, имена классов следуют соглашению UpperCaseCamelCase, константы полностью пишутся заглавными буквами и так далее.
    Подробнее об этих соглашениях можно узнать здесь.
  • Используйте отступы и пробелы, чтобы код «дышал». Существуют стандартные соглашения, такие как «использование четырех пробелов для каждого абзаца» , «разделы должны быть выделены дополнительными пустыми строками» ... Так как я никогда не помню их, я использую очень хорошее расширение VSCode под названием prettier, которое автоматически переформатирует мой код при нажатии Ctrl + S.
Источник: https://prettier.io/

2 - Сделайте свой код модульным ?

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

Например, Вы работаете над проектом NLP и у Вас могут быть разные функции для обработки текстовых данных (токенизация, удаление URL-адресов, лемматизация и другие). Вы можете поместить все эти методы в модуль Python под названием text_processing.py и импортировать их из него. Ваша основная программа станет намного легче!

Вот несколько полезных советов о написании модульного кода:

  • Не повторяйся. По возможности обобщайте и консолидируйте свой код.
  • Функции должны делать что-то одно. Если функция выполняет несколько операций, становится труднее ее обобщить.
  • Будьте аккуратны, когда дробите код на модули: есть небольшая вероятность, что Вы получите слишком много частей. Если у Вас нет опыта, взгляните на популярные репозитории GitHub, такие как scikit-learn, и проверьте их стиль кодирования.

3 - Реорганизуйте код ?

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

4 - Сделайте свой код эффективным ?

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

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

  • Прежде чем запускать что-либо, проверьте сложность своего алгоритма, чтобы оценить время его выполнения.
  • Проверьте возможные проблемные места вашего скрипта, проверив время выполнения каждой операции.
  • По возможности избегайте циклов for и векторизуйте свои операции, особенно если используете такие библиотеки, как NumPy или pandas.
  • Используйте процессорные ядра вашей машины с помощью мультипроцессорной обработки.

5 - Используйте GIT или любую другую систему контроля версий ?

По моему личному опыту, использование GIT + Github помогло мне улучшить свои навыки программирования и лучше организовать мои проекты. Поскольку я использовал его во время сотрудничества с друзьями и/или коллегами, это заставило меня придерживаться стандартов, которым я не подчинялся в прошлом.

Источник: freecodecamp

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

  • Отслеживание ваших изменений
  • Откат к любой предыдущей версии кода
  • Эффективное сотрудничество между членами команды с помощью объединения запросов
  • Повышение качества кода
  • Обзор кода
  • Назначение задач членам команды и отслеживание их прогресса с течением времени

Такие платформы, как Github или Gitlab предоставляют, среди прочего, средства непрерывной интеграции для автоматического создания и развертывания Ваших проектов.

Если Вы новичок в Git, я рекомендуем взглянуть на это руководство.

6 - Проверьте свой код ?

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

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

Источник: https://pytest-c-testrunner.readthedocs.io/

Написание тестов для функций и модулей дает много преимуществ:

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

7 —Ведите журнал ?

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

Источник: realpython

Вот несколько советов по эффективному использованию регистраций в журнале:

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

Эпилог

Давно прошли те времена, когда специалисты по данным создавали отчеты и jupyter notebooks, которые никак не взаимодействовали с системами и инфраструктурой компании.

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

Надеемся, что эта статья дала Вам обзор этих передовых практик.


Источник: m.vk.com

Комментарии: